我和RabbitMQ的(和编程)一新手,所以事先说一句抱歉,如果这是显而易见的。 我创建一个池是在一个队列工作线程之间共享,但我不知道我是否应该用在游泳池连接或通道。
我知道我需要渠道做实际的工作,但有有每个连接一个通道(从队列的详细吞吐量方面)的性能优势? 还是我最好只使用每个应用程序池和多渠道的单一连接?
注意:因为我汇集资源的初始成本是不是一个因素,因为我知道连接比渠道更昂贵。 我更感兴趣的吞吐量。
我和RabbitMQ的(和编程)一新手,所以事先说一句抱歉,如果这是显而易见的。 我创建一个池是在一个队列工作线程之间共享,但我不知道我是否应该用在游泳池连接或通道。
我知道我需要渠道做实际的工作,但有有每个连接一个通道(从队列的详细吞吐量方面)的性能优势? 还是我最好只使用每个应用程序池和多渠道的单一连接?
注意:因为我汇集资源的初始成本是不是一个因素,因为我知道连接比渠道更昂贵。 我更感兴趣的吞吐量。
我发现这个在RabbitMQ的网站是接近底部,所以我所引用下面的相关部分。
该文艺青年最爱的版本是,你应该有每个应用程序1个连接,每个线程1路。 希望帮助。
连接
AMQP连接通常长寿命。 AMQP是使用TCP可靠传送的应用程序级协议。 AMQP连接使用身份验证,并可以使用TLS(SSL)进行保护。 当应用程序不再需要连接到AMQP代理,应该正常关闭的突然关闭基础的TCP连接的连接AMQP代替。
通道
一些应用程序需要一个AMQP代理的多个连接。 然而,这是不可取的,以保持多个TCP连接开放在同一时间,因为这样做会占用系统资源,使之更难以配置防火墙。 AMQP 0-9-1连接进行复用,可以认为是“共享单个TCP连接轻质连接”信道。
对于使用多个线程/进程处理的应用程序,这是很常见的,打开每个线程/进程的新信道,而不是在它们之间共享信道。
在特定信道上的通信是从通信对另一信道完全分开,因此每AMQP方法还携带客户端用来找出哪些信道,该方法用于一个信道号(并且因此,事件处理程序需要被调用,其中,例如) 。
据表示,有每个线程1个通道,尽管他们是线程安全的,所以你可以有多个线程通过一个通道发送。 在应用程序方面,我建议你还是坚持使用每线程1路虽然。
此外,建议将每个通道只有1名消费者。
这些只是指导方针,所以你将不得不做一些测试,看看有什么最适合你。
针对这个讨论有一些见解这里和这里 。
尽管所有这些指导方针这篇文章表明,它很可能不会通过具有多个连接影响性能。 虽然它不是具体的,无论是在谈论客户端或服务器(RabbitMQ的)侧。 随着一个点,它当然会使用更多的系统资源,更多的连接。 如果这不是一个问题,你希望有更多的吞吐量确实它可能是最好有多个连接,因为这个职位意味着多个连接可以让你更多的吞吐量。 究其原因似乎是,即使有多个通道只有一个消息经过一次连接。 因此,一个大的消息将阻止在一个信道上整个连接或许多不重要的消息可以在相同的连接,但不同的频道上框的重要消息。 同样的资源是一个问题。 如果您使用了所有的带宽与一个连接,然后添加一个额外的连接不会有任何增加性能比具有一个连接上两个通道。 同样,每个连接将使用更多的内存,CPU和文件句柄,但很可能不会成为问题,虽然在扩展时可能是一个问题。
除了公认的答案:
如果你有任一负载平衡器在前面,或短暂的DNS的RabbitMQ节点的集群(使得能够每次连接到不同的兔节点),那么一个单一的,长寿命的连接将意味着一个应用节点与单个节点的RabbitMQ专门工作。 这可能会导致一个节点的RabbitMQ正在比其他人更多地使用。
上面提到的其他担心的是,发布和使用是阻塞操作,这导致了排队的消息。 具有更多的连接将确保1.处理时间为每个消息不会阻止其它消息2.大消息不被封锁其他消息。
这就是为什么它是值得考虑具有小的连接池(铭记上面提出的资源问题)
“每个线程一个通道” 可能是一个安全的假设(我说还不如我没有我自己所做的研究,我没有理由怀疑文档:)),但要小心,有这样的情况,这打破:
如果您在使用RPC与RabbitMQ的直接回复到 ,那么你不能重复使用相同的信道占用另一个 RPC请求。 我问有关的详细谷歌用户群 ,我从迈克尔Klishin(谁似乎是积极参与RabbitMQ的发展)得到的答案是,
以并不意味着直接回复到与渠道分享任何方式使用。
我有电子邮件枢纽更新自己的文档,解释如何 amq.rabbitmq.reply-to
工作引擎盖下,我仍然在等待一个答案(或更新)。
所以,如果你要坚持“每线程通道”当心,因为这不会直接答复工作良好。