我的RabbitMQ群集中有一个请求流,以及处理它们的多个消费者。问题是 - 每个消费者必须出于性能原因批量处理请求。具体来说,有一个网络IO操作,我可以通过批处理请求来分摊。
因此,每个消费者都希望最大化它可以批量处理的请求数量,但不会增加太多的延迟。
当消费者收到第一个请求并继续收集请求时,我可能会启动一个计时器,直到两个事件中的一个发生 - 计时器到期或已收到500个请求。
有没有更好的方法来实现这一目标 - 不会阻止每个消费者?
答案 0 :(得分:6)
通常,“批处理消息”的网络方面是在basic.qos(prefetch-size, prefetch-count)
参数的级别处理的。在此方案中,代理将为消费者发送超出未确认消息的一些字节/消息(但分别),但客户端库会在进程中一次一个地向应用程序发送消息。
为了最大限度地发挥优势,应用可以为每封邮件隐瞒basic.ack()
,并定期发出basic.ack(delivery-tag=n, multiple=True)
以确认所有带有投放标记< = n的邮件。