RocketMQ基础概念的理解
1、生产者
生产者和主题之间存在多对多关系。一个生产者可以向多个主题发送消息,一个主题可以接收来自多个生产者的消息。这种多对多关系有助于提高性能扩展和灾难恢复能力。
2、消费者以及消费者组
一个队列可以被多个消费者(其中这多个消费者必须分别属于不同消费者组)消费,也就说,如果只有一个消费者组,一个队列只能被一个消费者消费。一个消费者可以消费多个队列。
举个例子就是,一个主题里面有10个队列,消费者组A中有5个消费者,一个消费者负责消费2个消息队列,实现负载均衡。消费者组B中有2消费者,其中一个消费者负责5个消息队列的消费。
在业务处理上,一个消费组中消费者们通常只针对一种Topic类型进行消费,于是有了消费者组订阅Topic这一说法。
消费者组同一时刻只能消费一个Topic的消息,不能同时消费多个Topic消息。
一个消费者组中的消费者必须订阅完全相同的Topic。
当然现在我们说得是,消费颗粒度为队列,一个消费组的消费者数量应该小于等于Topic中的队列数量;当消费颗粒度为消息时,则不存在这种限制。
3、生产者组
生产者组中的生产者在同一时刻,同时生产相同类型的Topic消息,需要注意得是,生产者组中的生产者也可能都会生产另外一种Topic消息,所以,在下一个时刻,可能会同时生产另外一种类型的Topic消息。
4、队列
也叫分区(Partition),一个主题可以有多个队列,每个队列可以存放多个消息。
5、主题与分片(Sharding)以及broker
6、消息标识
RocketMQ中每个消息拥有唯一的MessageId,且可以携带具有业务标识的key,以方便对消息的查询。
不过需要注意的是,MessageId有两个:
在生产者 send()消息时会自动生成一个MessageId(msgId);
当消息到达Broker后,Broker也会自动生成一个MessageId(offsetMsgId)。msgId、offsetMsgId与key都
称为消息标识。
msgId:由producer端生成,其生成规则为:producerIp + 进程pid + MessageClientIDSetter类的ClassLoader的hashCode + 当前时间 + AutomicInteger自增计数器
offsetMsgId:由broker端生成,其生成规则为:brokerIp + 物理分区的offset(Queue中的
偏移量)
key:由用户指定的业务相关的唯一标识