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