繁体   English   中英

RabbitMQ在WCF Web服务中,模型用法和性能

[英]RabbitMQ in a WCF webservice, model usage and performance

我需要在IIS中托管的C#WCF Web服务中调用RabbitMQ RPC服务。 我们有这个工作正常,但作为一个优秀的小士兵我正在阅读RabbitMQ客户端文档,它声明以下“IModel不应该在线程之间共享”

我的理解是,在RabbitMQ中, IModel实际上是一个套接字连接。 这意味着对于每次调用,WCF服务都需要创建一个IModel并在完成后处理它。

在我看来,这在性能和套接字使用方面有点过分,我想知道我的理解是否实际上是正确的,或者是否有其他选项可用,比如在线程之间使用IModel连接池。

我们将非常感激地收到任何建议。 这是我在下面使用的代码的示例,RabbitMQ连接实际上是在Global.asax中初始化的,我只是在那里你可以看到用法。

        var connectionFactory = new ConnectionFactory();
        connectionFactory.HostName = "SampleHostName";
        connectionFactory.UserName = "SampleUserName";
        connectionFactory.Password = "SamplePassword";
        IConnection connection = connectionFactory.CreateConnection();
        // Code below is what we actually have in the service method.
        var model = connection.CreateModel();
        using (model)
        {
            model.ExchangeDeclare("SampleExchangeName", ExchangeType.Direct, false);
            model.QueueDeclare("SampleQueueName", false, false, false, null);
            model.QueueBind("SampleQueueName", "SampleExchangeName", "routingKey" , null);
            // Do stuff, like post messages to queues
        }

IModel实际上是一个套接字连接

这是不正确的。 IConnection表示连接:)引入模型是为了允许多个客户端使用相同的tcp连接。 因此,模型是“物理”连接的“逻辑”连接。

Model所做的任务之一是拆分和重新组装大型消息。 如果消息超过一定大小,则将其拆分为帧,标记帧并由接收器组装回来。 现在,想象一下,2个线程发送大量消息......帧号将被搞砸,你最终将得到Frankenstein消息,其中包含2个消息的随机部分。

你是正确的假设模型创建有一些成本。 客户端向服务器发送请求以创建模型,服务器在内存中为此模型创建结构,并将模型ID发送回客户端。 它是通过已打开的tcp连接完成的,因此不会因建立连接而产生开销。 但由于网络往返,仍然存在一些开销。

我不确定WCF绑定,但base rabbit的.net库不为模型提供任何池。 如果你的情况有问题,你必须自己想出一些东西。

每个会话都需要一个IModel对象。 这对于基于网络的API来说非常正常。 例如,Azure表存储客户端完全相同。 为什么,你不能拥有一个运行多个并发通信流的单个通道。

我希望发生一定程度的缓存(例如DNS),这将减少创建后续IModel实例的开销。

使用Azure表做同样的事情时,性能是可以的,所以IModel应该完全没问题。 只有当你能证明自己有真正的需要时才尝试优化这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM