首页 > 其他分享 >04 RabbitMQ 3.8 Feature Focus - Single Active Consumer

04 RabbitMQ 3.8 Feature Focus - Single Active Consumer

时间:2022-10-16 11:01:16浏览次数:78  
标签:消费者 04 队列 Focus RabbitMQ Broker 消息 Active C1

标题: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是什么之前,让我们回顾一下具有多个消费者的正常队列的行为。

图1 三个QoS为1的消费者

我们看到,对于三个消费者,每个消费者都在竞争队列中的消息。QoS为1时,10条消息均匀分布。

如果消息处理速度无法跟上队列中的消息流入速度,则扩展的标准方法是添加更多消费者来提高并行度。这是一种简单有效的扩容方法。

Single Active Consumer

当我们在队列上启用SAC时,队列不再允许竞争消费。一个启用SAC的队列一次只能有一个消费者在消费消息。其他消费者处于等待状态,以防第一个消费者离开。

当消费者C1发生故障或停机时,另一个消费者将成为“活跃”消费者,并将恢复消费。

img
图2 三个消费者订阅了启用SAC的队列,所有消息都会传递给活跃消费者
img
图3 C1离开,C3从等待变为活跃

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

  1. Broker sends a single message to C1
  2. Broker sends a single message to C2
  3. C1 acks its message
  4. Broker sends a single message to C1
  5. C2 acks its message
  6. Broker sends C2 a message
  7. ........

这种message-ack来回发送的消息大大降低了吞吐量。

最快的方法是增加prefetch并使用multiple标志:

  1. Broker sends 2000 messages to C1
  2. Broker sends 2000 messages to C2
  3. C1 acks 1000 messages with one ack (multiple=true)
  4. Broker sends 1000 messages to C1
  5. C2 acks 1000 messages with one ack (multiple=true)
  6. Broker sends 1000 messages to C2
  7. C1 acks 1000 messages with one ack (multiple=true)
  8. .....

这允许对消息进行批处理,从而大大提高吞吐量。在此处阅读有关如何设置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

相关文章