[英]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.