消费方式

RocketMQ提供了两种消费模式,Push和Pull

大多数场景使用的是Push模式,在源码中这两种模式分别对应的是DefaultMQPushConsumer类和DefaultMQPullConsumer

Push方式:

“慢消费问题” 在消费者的处理消息的能力较弱的时候,采用Push方式,可以尽可能实时地将消息发送给消费者进行消费。
push方式里,consumer把轮询过程封装了,并注册MessageListener监听器,取到消息后,唤醒MessageListener的consumeMessage()来消费,对用户而言,感觉消息是被推送过来的。
Push模式实际上在内部还是使用的Pull方式实现的,通过Pull不断地轮询Broker获取消息,当不存在新消息时,Broker端会挂起Pull请求,直到有新消息产生才取消挂起,返回新消息。

Pull方式:

“消息延迟与忙等待” 由消费者客户端主动向消息中间件拉取消息,需要重点去考虑如何设置Pull消息的频率
pull方式里,取消息的过程需要用户自己写,首先通过打算消费的Topic拿到MessageQueue的集合,遍历MessageQueue集合,然后针对每个MessageQueue批量取消息,一次取完后,记录该队列下一次要取的开始offset,直到取完了,再换另一个MessageQueue。

消费模式

消费同一类消息的多个 consumer 实例组成一个消费者组,也可以称为一个 consumer 集群

这些 consumer 实例使用同一个 group name。需要注意一点,除了使用同一个 group name,订阅的 tag 也必须是一样的,只有符合这两个条件的 consumer 实例才能组成 consumer 集群。

1. 集群消费

简介: 集群消费模式下,每一条消息都只会被分发到一台机器上处理。
image.png

优点:
使用集群消费的时候,consumer 的消费进度是存储在 broker 上,consumer 自身是不存储消费进度的。消息进度存储在 broker 上的好处在于,当你 consumer 集群是扩大或者缩小时,由于消费进度统一在broker上,消息重复的概率会被大大降低了。
缺点:
不保证消息的每一次失败重投等逻辑都能路由到同一台机器上

2. 广播消费

简介: 当 consumer 使用广播消费时,每条消息都会被 consumer 集群内所有的 consumer 实例消费一次,也就是说每条消息至少被每一个 consumer 实例消费一次。
image.png++

缺点:

  1. 顺序消息暂不支持广播消费模式。
  2. consumer 的消费进度是存储在各个 consumer 实例上,这就容易造成消息重复。

不会进行消费失败重投的,所以在 consumer 端消费逻辑处理时,需要额外关注消费失败的情况。

前两个总结

虽然广播消费能保证集群内每个 consumer 实例都能消费消息,但是消费进度的维护、不具备消息重投的机制大大影响了实际的使用。
因此,在实际使用中,更推荐使用集群消费,因为集群消费不仅拥有消费进度存储的可靠性,还具有消息重投的机制。而且,我们通过集群消费也可以达到广播消费的效果。

3. 使用集群消费模拟广播消费

如果业务上确实需要使用广播消费,那么我们可以通过创建多个 consumer 实例,每个 consumer 实例属于不同的 consumer group,但是它们都订阅同一个 topic。

除此之外,每个 consumer 实例的消费逻辑可以一样也可以不一样,每个consumer group还可以根据需要增加 consumer 实例,比起广播消费来说更加灵活。
image.png


更多文章:

参考文章: