我有3个应用程序A,B和C使用RabbitMQ,我有队列Q1和Q2。
应用程序A在Q1中发布消息。
应用程序B使用来自Q1的消息,进行一些处理,并在Q2中发布其他消息。 B仅在第二季度成功发布消息后才会收到来自Q1的消息。
应用程序C使用来自Q2的消息,进行一些处理并将某些内容写入数据库。
如果应用程序A发布的速度超过B可以消耗的速度,它最终将填充RabbitMQ服务器的内存或光盘,will block any clients that try to publish messages。
然后阻止B发布到Q2,然后才能从Q1获取消息,从而导致死锁。
如果我可以限制每个队列的内存和磁盘使用量,而不是整个RabbitMQ,我认为这可以解决。 有没有办法做到这一点,或其他方式来解决我的问题?
如果需要,我可以切换到另一个支持此类内容的消息代理。
答案 0 :(得分:1)
不,设置每队列光盘或内存限制不是在RabbitMQ中可以完成的(至少目前为止)。
如果消息不能丢失且对任务至关重要,那么使应用程序B以与A相同的速度消耗或更快,例如,增加消费者数量可能是解决方案。
另一种方法是删除额外的消息,例如,通过Per-Queue Message TTL或Queue Length Limit。
当然,该消息可以dead-lettered用于警报通知和/或备份。
您还可以不时地检查队列长度并进行一些启发式监控并关联您的工作流程(注意,queue.declare
将返回当前队列中的消息编号,但此AMQP方法本身就是幂等的。)