标题:RabbitMQ 3.8 Feature Focus - Single Active Consumer
原文:https://www.cloudamqp.com/blog/rabbitmq-3-8-feature-focus-single-active-consumer.html
时间:2019-04-23
Single Active Consumer(SAC)是今年3.8版本推出的一个非常好的功能。它提供了一种新的消费者模式,这些模式在老版本中是不可能实现或者很难实现的。
在了解Single Active Consumer是什么之前,让我们回顾一下具有多个消费者的正常队列的行为。
![](/i/l/?n=22&i=blog/495068/202210/495068-20221016104709847-1687804597.png)
我们看到,对于三个消费者,每个消费者都在竞争队列中的消息。QoS为1时,10条消息均匀分布。
如果消息处理速度无法跟上队列中的消息流入速度,则扩展的标准方法是添加更多消费者来提高并行度。这是一种简单有效的扩容方法。
Single Active Consumer
当我们在队列上启用SAC时,队列不再允许竞争消费。一个启用SAC的队列一次只能有一个消费者在消费消息。其他消费者处于等待状态,以防第一个消费者离开。
当消费者C1发生故障或停机时,另一个消费者将成为“活跃”消费者,并将恢复消费。
![img](/i/l/?n=22&i=blog/495068/202210/495068-20221016104837569-1558354406.png)
![img](/i/l/?n=22&i=blog/495068/202210/495068-20221016104929457-2139458444.png)
Highly Available Consumer
SAC的动机是我们需要一个高可用的消费者。
有时,我们只需要或想要单个消费者来处理消息,但我们需要这项工作具有高可用性。SAC允许多个消费者,但只允许一个消费者实际工作,并允许其他消费者在活跃消费者失效时接管工作,从而实现了这一点。这也称为Active/Standby或Active/Passive。
一次只需要一个消费者工作的原因:
- 只有当一个应用程序正在工作时,数据一致性才可能实现。两个同时工作的应用程序会相互影响;
- 其他系统中的并发问题,例如数据库死锁;
- 第三方系统一次只允许一个进程与之交互;
- 消费者需要根据事件窗口进行计算,因此必须接收所有消息;
- 数据局部性,数据缓存在内存中以提高性能并减少其他系统的负载,因此所有消息都需要通过相同的应用程序;
- 可以优化prefetch和multiple flag的用法,而不会引入消息顺序问题(请参阅下面关于High Prefetch和Multiple Flag使用说明)
可能有多种原因需要一个单一的活跃消费者,并要求该服务同时具有高可用性。
NOTES ON HIGH PREFETCH AND MULTIPLE FLAG USAGE
队列只有一个消费者的一个副作用是,可以利用消费者端的prefetch和multiple flag来提高消息吞吐量,而不影响消息排序。
最慢的方法是:prefetch=1,acks with multiple=false
- Broker sends a single message to C1
- Broker sends a single message to C2
- C1 acks its message
- Broker sends a single message to C1
- C2 acks its message
- Broker sends C2 a message
- ........
这种message-ack来回发送的消息大大降低了吞吐量。
最快的方法是增加prefetch并使用multiple标志:
- Broker sends 2000 messages to C1
- Broker sends 2000 messages to C2
- C1 acks 1000 messages with one ack (multiple=true)
- Broker sends 1000 messages to C1
- C2 acks 1000 messages with one ack (multiple=true)
- Broker sends 1000 messages to C2
- C1 acks 1000 messages with one ack (multiple=true)
- .....
这允许对消息进行批处理,从而大大提高吞吐量。在此处阅读有关如何设置prefetch的更多信息。
此配置存在以下问题:
- 当涉及竞争消费者时,处理顺序可能远远达不到FIFO语义;
- 发生连接故障时,会收到两次大量消息。
我们无法处理连接失败时的消息重复问题,但如果只有一个消费者,消息排序问题就会消失。当队列只有一个消费者时,可以完全优化prefetch和multiple flag的使用,而无需担心消息顺序问题。这也减少了broker的负载。但需要注意的是,单个消费者需要足够快地处理消息,以应付消息流入队列的速度。
Coming in release 3.8
RabbitMQ 3.8将于今年发布Single Active Consumer。唯一需要改变的是队列的声明方式,将SAC设置为enabled。你可以在这里阅读更多即将引入的新特性。
标签:消费者,04,队列,Focus,RabbitMQ,Broker,消息,Active,C1 From: https://www.cnblogs.com/oyld/p/16795778.html