Los*_*oul 57 queue message-queue rabbitmq task-queue
我是Rabbitmq(和编程)的新手,如果这很明显,请提前对不起.我正在创建一个池来共享正在处理队列的线程,但我不确定是否应该在池中使用连接或通道.
我知道我需要通道来完成实际工作,但每个连接有一个通道(从队列中获得更多吞吐量)是否有性能优势?或者我最好只使用每个应用程序的单个连接并汇集多个渠道?
注意:因为我正在汇集资源,初始成本不是一个因素,因为我知道连接比渠道更昂贵.我对吞吐量更感兴趣.
rob*_*olf 79
我在rabbitmq网站上发现它已接近底部所以我引用了下面的相关部分.
tl; dr版本是每个应用程序应该有1个连接,每个线程应该有1个通道.希望有所帮助.
连接
AMQP连接通常是长期存在的.AMQP是一种使用TCP进行可靠传递的应用程序级协议.AMQP连接使用身份验证,可以使用TLS(SSL)进行保护.当应用程序不再需要连接到AMQP代理时,它应该正常关闭AMQP连接,而不是突然关闭底层TCP连接.
通道
某些应用程序需要与AMQP代理程序建立多个连接.但是,不希望同时打开许多TCP连接,因为这样做会消耗系统资源并使配置防火墙变得更加困难.AMQP 0-9-1连接与可被视为"共享单个TCP连接的轻量级连接"的通道复用.
对于使用多个线程/进程进行处理的应用程序,每个线程/进程打开一个新通道并且不在它们之间共享通道是很常见的.
特定通道上的通信与另一个通道上的通信完全分开,因此每个AMQP方法还带有一个通道号,客户端使用该通道号来确定该方法所针对的通道(例如,需要调用哪个事件处理程序) .
建议每个线程有1个通道,即使它们是线程安全的,因此您可以通过一个通道发送多个线程.就你的应用而言,我建议你坚持使用每个线程1个频道.
此外,建议每个频道只有1个消费者.
这些只是指导原则,因此您必须进行一些测试,以确定最适合您的方法.
尽管有这些指导原则,但这篇文章表明它很可能不会通过多个连接来影响性能.虽然没有具体说明客户端或服务器(rabbitmq)方面.有一点,它当然会使用更多具有更多连接的系统资源.如果这不是问题,并且您希望有更多的吞吐量,那么拥有多个连接可能确实更好,因为这篇文章建议多个连接将允许您更多的吞吐量.原因似乎是即使有多个通道,一次只有一条消息通过连接.因此,大消息将阻止整个连接,或者一个信道上的许多不重要消息可能阻止同一连接上的重要消息但是阻止不同的信道.资源再次成为问题.如果您通过一个连接耗尽了所有带宽,那么添加一个额外连接将比一个连接上的两个通道没有提高性能.此外,每个连接将使用更多的内存,CPU和文件句柄,但这可能不是一个问题,但在扩展时可能是一个问题.
Boz*_*zho 14
除了接受的答案:
如果你有一个RabbitMQ节点集群,前面有一个负载均衡器,或者是一个短暂的DNS(每次都可以连接到另一个兔子节点),那么一个长寿命的连接意味着一个应用程序节点专门用于单个RabbitMQ节点.这可能导致一个RabbitMQ节点比其他节点使用得更多.
上面提到的另一个问题是发布和消费是阻塞操作,这会导致排队消息.拥有更多连接将确保每个消息的处理时间不会阻止其他消息2.大消息不会阻止其他消息.
这就是为什么值得考虑建立一个小型连接池(考虑到上面提到的资源问题)
| 归档时间: |
|
| 查看次数: |
26140 次 |
| 最近记录: |