ConcurrencyLimit 和 PrefetchCount 有什么区别?

What is the difference between ConcurrencyLimit and PrefetchCount?

公共交通中的 ConcurrencyLimit 和 PrefetchCount 有什么区别?他们的优化配置是什么。

PrefetchCount 是经纪人级别的设置。它向 RabbitMQ(或 Azure 服务总线)指示应将多少消息推送到客户端应用程序,以便它们准备好进行处理。

In addition, if a RabbitMQ consumer has prefetch space available, published messages are immediately written to the consumer, reducing overall message latency. Because of this, having prefetch space available on a consumer can improve overall message throughput.

ConcurrentMessageLimit 是客户端级别的东西,表示将同时使用的最大消息数。这可能是由于资源限制,或者为了避免数据库过载等。

如果消息处理速度非常快,但不能同时处理太多,则可以使用 ConcurrentMessageLimit 设置限制以避免 CPU 过载。然而,超快的消息消费增加了对从代理请求更多消息所需时间的敏感性。因此,对于快速消息消费者,建议使用更高的预取计数。

对于慢速消费者,例如那些进行外部调用的消费者,消费者持续时间更依赖于慢速外部系统,更高的并发限制可以提高整体吞吐量。在这种情况下,更高的预取计数不会增加太多,但它至少应该与并发限制一样高。

如果您要横向扩展(竞争消费者),那么这是一个调整练习,以确定有多少实例、并发消费者和预取消息是有意义的。

例如,我们有一个数据库消费者,它可以在 SQL 服务器上 运行 最多 100 个并发事务,然后它开始阻塞,所以我们 运行 并发限制为 100,预取为 110。