0/参考网址
zhuanlan.zhihu.com/p/439443259
感谢大佬分享
0/前言
rocketMQ中间件的消费者消费消息,有2种:
集群模式,也称为负载均衡模式。
广播模式
1/集群模式(负载均衡模式)
如下所示:
消费者采用负载均衡模式来消费消息,一个分组(consumer group)下的多个消费者实例共同消费mq.topic中的消息,每个消费者实例处理的消息不同,但是在数量上差不多,双方干的活差不多。
一个consumer group 中的各个consumer实例尽可能平均的去消费消息,即1条消息只会投递到一个consumer group中的consumer实例。
如下图所示, 某个mq.topic有3个消息队列,某个consumer group中有3个消费者实例,那么每个实例只能消费其中的一个队列中的消息。
集群消费模式,是消费者默认的消费模式。即默认的就是集群消费模式(负载均衡模式),而不是广播模式。
在代码中这么设置:
// 消费模式 默认是集群模式(负载均衡模式),还有是广播模式
consumer.setMessageModel(MessageModel.CLUSTERING);
2/广播模式
广播消费模式中,mq.topic中的每一条消息都会对group组中的每一个消费者实例都投递一遍。
即使这些消费者都属于同一个consumer group,消息也会被每一个consumer实例来消费一次。
实际上,每个消费者实例都获取到了topic下的每个队列去消费消息。
这种消费模式,基本上在应用在同一个topic下对应多个业务的场景,即每一个场景都需要去消费所有的消息。
广播模式,如下所示:
如何理解广播模式呢?
假如你有1个大喇叭,你宣布一个消息,所有人都听见了,这就是广播模式
就是所有人共享消息。
MQ有广播模式,可以在上游系统发布一条消息后,供下游多个系统使用
3/适用场景以及注意事项
3.1负载均衡模式:适用场景&注意事项
消费端集群化部署,每条消息只需要被处理一次。
由于消费进度在服务端维护,可靠性更高。
集群消费模式下,每一条消息都只会被分发到一台机器上处理。
如果需要被集群下的每一台机器都处理(消费),请使用广播模式。
集群消费模式下,不保证每一次失败重投的消息路由到同一台机器上,因此处理消息时不应该做任何确定性假设。
3.2广播模式:适用场景&注意事项
每条消息都需要被相同逻辑的多台机器处理。
消费进度在客户端维护,出现重复的概率稍大于集群模式。
广播模式下,消息队列 RocketMQ 保证每条消息至少被每台客户端消费一次,但是并不会对消费失败的消息进行失败重投,因此业务方需要关注消费失败的情况。
广播模式下,客户端每一次重启都会从最新消息消费。客户端在被停止期间发送至服务端的消息将会被自动跳过,请谨慎选择。
广播模式下,每条消息都会被大量的客户端重复处理,因此推荐尽可能使用集群模式。
目前仅 Java 客户端支持广播模式。
广播消费模式下不支持顺序消息。
广播消费模式下不支持重置消费位点。
广播模式下服务端不维护消费进度,所以消息队列 RocketMQ 控制台不支持消息堆积查询、消息堆积报警和订阅关系查询功能。
4/总结
从上面2张图,就可以很清晰的知道2种模式的区别。
一般来说,用集群模式的比较多,但是还是要根据具体的场景来确定。