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:由用戶指定的業務相關的唯一標識