我需要对多个使用者实施顺序消息处理,但每次只有一条消息在队列中。我有很多队列,但所有队列都是顺序的,我需要多个消费者支持负载平衡和冗余。任何人都可以判断是否真实地将未确认消息的数量限制为每个队列1个?
答案 0 :(得分:1)
任何人都可以判断是否真实将未确认消息的数量限制为每个队列1个?
这对多个消费者来说是不可能的。您可以使用单个通道的预取限制来限制未确认消息的数量,但不能跨多个通道/使用者限制。它与消费者的渠道相关联,而不是与队列相关联。
使用预取的唯一方法是使用单个使用者和单个队列。
即使这样,您也无法保证消息将以正确的顺序到达队列。
(这是任何类型的分布式系统的基本困难,而不是rabbitmq限制)
查看Message Sequencer和Resequencer模式,尝试按顺序放回邮件。
但即便如此,你也会遇到困难。
您还想了解幂等性,这样您就不会重新处理已经处理过的消息。
答案 1 :(得分:0)
您应该能够将您的消费者配置为仅使用X消息,并为您的频道使用相同的消息。请查看 QOS 或消费者预取
https://www.rabbitmq.com/consumer-prefetch.html
这是一个例子,多消费者只能识别一条消息,而且只允许一条消息进行通信(无论消费者插入多少消息)
Channel channel = ...;
Consumer consumer1 = ...;
Consumer consumer2 = ...;
channel.basicQos(1, false); // Per consumer limit
channel.basicQos(1, true); // Per channel limit
channel.basicConsume("my-queue1", false, consumer1);
channel.basicConsume("my-queue2", false, consumer2);
在这里,消费者每次只能识别一条消息,并且该频道只能有一条未经批准的消息。你没有提到你使用的语言,所以你可能必须适应这个例子。