rocketmq-group topic 消息队列 消息的区别?

4,353 阅读6分钟

group组

生产者组

标识当前应用是生产者。

#扫码交易推送给商户
rocketmq.qrcode.group=QrcodeProducerGroup
rocketmq.qrcode.topic=QrcodeNotifyTopic
rocketmq.qrcode.subExpression=QrcodeNotifyTag

消费者组

标识当前应用是消费者。

#mq应用消费消息
consumerGroup=QrcodeConsumerGroup //和生产者的group不一样
topic=QrcodeNotifyTopic //和生产者的topic一样即可消费,不需要group一样
subExpression=QrcodeNotifyTag

总结

生产者组和消费者组的名字不一样。

不管是生产者组还是消费者组,都只是起一个标识的作用,并且生产者只标识生产者,消费者只标识消费者。生产者组和消费者组没有关系。生产者和消费者的关系是topic,只要同一个topic,那么消费者就是消费对应生产者的topic。

应用场景

1、集群节点
最常见的就是分布式服务都是多个节点,那么生产者就有多个节点生产消息。 消费者也是多个节点,但是消费者相当于负载均衡去消费消息,即每个消息只被一个节点消费一次。

2、多个消费者
还有一种情况就是,交易的时候,生产者生产了一个消息。但是有多个消费者都要消费这个消息,而且多个消费者都是不同的应用,不像第一种情况里的都是同一个应用的集群节点,比如:支付成功之后,需要通知市场部、通知统一订单系统、通知商户。

topic

1.一个topic包含多个消息。

2.消费者订阅消息的最小单位。 即消费者是以topic为单位来向mq服务器订阅消息的,同理生产者也是以topic为单位来向某个topic写消息数据的。 一个topic,生产者会不断地向mq服务器的这个topic写消息数据,消费者会不断地从mq服务器读消息数据进行消费处理。

tag

刚才上面说消费者订阅消息的最小单位是topic,其实不够准确,因为在同一个topic的基础上,还可以给topic打tag,本质其实是给同一个topic,再分成几个tag。

然后消费者消费的时候,只有topic和tag都相同,才会消费。

比如,公司现在支付成功通知和记账成功通知,用的是同一个topic,然后怎么区分呢?给同一个topic打不同的tag,即支付成功通知是支付成功通知tag,记账成功通知是记账成功通知tag。

最佳实践

一般情况下,最好不要用tag,就直接用不同的topic就可以了。没有必要把问题复杂化。多了一个概念,用的人就要多学一点知识。

这种在一个概念基础上,再加一个维度的情况,最好都不要用,徒增复杂度。dubbo服务,添加分组group也是类似的概念,即同一个服务,如果分组了,那么必须还要分组一样消费者才能消费这个服务。

消息队列

1.一个topic包含的消息,可能分布在多个消息队列,每个消息队列包含了多个消息数据。

2.多个消息队列可能分布在不同的节点。

消息

消息就是一条数据,就像数据库表的一条记录。mq读写数据的最小单位。

消息和消息队列的区别?

架构图

image.png


消息

是生产和消费的最小单位。


消息队列

一个topic包含了多个消息队列,每个消息队列可能分布在不同的机器节点上。

一个topic也包含了多个消息,消息的具体存储的数据结构是队列。

那消息和消息队列的区别是啥? 消息是一个数据/消息,消息队列是数据/消息集合。


逻辑消息队列和物理消息队列

逻辑消息队列和物理消息队列一一对应,本质是一回事,二者之间通过索引关联起来。 逻辑的作用是?提高读写速度,因为有索引。

image.png

消费模式

1.同一个group的所有消费者节点,总共消费n个数据

2.同一个group的所有消费者,每个节点都消费n个数据


默认是哪种消费模式?

一般情况下,大部分应用场景,默认情况下,都是同一个topic的所有消费者节点,总共才消费n个数据,也就是说,同一个数据只被消费者集群里的某一个消费者消费。

消费顺序

消费顺序

1、无顺序
默认就是无顺序,即同一个topic的消费者集群消费整个topic维度或是哪怕是同一个消息队列的消息,都是没有顺序的,即消息队列里的数据,有可能先进,而且也是先出,但是因为消费者是集群,所以有可能后出的消息被某个节点先处理完成。

公司现在就是没有顺序要求,因为每次都是处理的不同订单的消息,而不是同一个订单的不同步骤的消息。

大部分应用场景都是无顺序要求,因为一般都是只要被消费了即可。

2、单个消息队列按顺序
同一个topic的消费者集群节点,按顺序消费同一个消费队列的数据,即同一个消息队列的每个数据先进并且先出,出来之后也是被先消费,只有当这个数据被先处理完成之后,下一个数据才会从消息队列拿出来消费。

应用场景?性能要求高,因为只是单个节点按顺序。

3、topic按顺序
同一个topic的所有节点的消息都按顺序,即全局消息都按顺序被消费。

应用场景?性能要求低,因为相当于是全局数据都要按先进先出的顺序进行消费。

其他

1、消息队列和节点的区别?
1)节点是一个broker
2)一个broker包含了多个消息队列
3)同一个topic的多个消息队列,可能分布在不同的节点broker

2、那消息队列数据结构的作用是啥?
确保单个消息队列的数据被顺序消费。详细地说,就是同一个消息队列的数据,被不同的消费者节点消费的时候,是按顺序消费的,即上面的第2种情况里所说的。

参考

官方文档 github.com/apache/rock…