本文主要介紹RocketMQ中Topic、Tag、GroupName的概念、設計初衷以及使用方法。
一.Topic
首先看看官方的定義:
Topic是生產者在發送消息和消費者在拉取消息的類別。Topic與生產者和消費者之間的關系非常松散。
具體來說,一個Topic可能有0個,一個或多個生產者向它發送消息;相反,一個生產者可以發送不同類型Topic的消息。
類似的,消費者組可以訂閱一個或多個主題,只要該組的實例保持其訂閱一致即可。
Topic在Google翻譯中解釋為話題。我們可以理解為第一級消息類型,類比於書的標題。在應用系統中,一個Topic標識為一類消息類型,比如交易信息。
在Producer中使用Topic:
1 Message msg = new Message("TopicTest" /* Topic */, 2 "TagA",("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET));
在Consumer中訂閱Topic:
1 consumer.subscribe("TopicTest", "*");
二.Tag
同樣,先看看官方怎么定義的:
標簽,換句話的意思就是子主題,為用戶提供了額外的靈活性。有了標簽,來自同一業務模塊的具有不同目的的消息可以具有相同的主題和不同的標記。標簽有助於保持代碼的清晰和連貫,同時標簽也方便RocketMQ提供的查詢功能。
Tag在Google翻譯中解釋為標簽。我們可以理解為第二級消息類型,類比於書的目錄,方便檢索使用消息。在應用系統中,一個Tag標識為一類消息中的二級分類,比如交易信息下的交易創建、交易完成。
在Producer中使用Tag:
1 Message msg = new Message("TopicTest", 2 "TagA" /* Tag */, 3 ("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET));
在Consumer中訂閱Tag:
1 consumer.subscribe("TopicTest", "TagA||TagB");// * 代表訂閱Topic下的所有消息
三.GroupName
和現實世界中一樣,RocketMQ中也有組的概念。代表具有相同角色的生產者組合或消費者組合,稱為生產者組或消費者組。
作用是在集群HA的情況下,一個生產者down之后,本地事務回滾后,可以繼續聯系該組下的另外一個生產者實例,不至於導致業務走不下去。在消費者組中,可以實現消息消費的負載均衡和消息容錯目標。
另外,有了GroupName,在集群下,動態擴展容量很方便。只需要在新加的機器中,配置相同的GroupName。啟動后,就立即能加入到所在的群組中,參與消息生產或消費。
在Producer中使用GroupName:
1 DefaultMQProducer producer = new DefaultMQProducer("group_name_1");// 使用GroupName來初始化Producer,如果不指定,就會使用默認的名字:DEFAULT_PRODUCER
在Consumer中使用GroupName:
1 DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("group_name_1");// 使用GroupName來初始化Consumer,如果不指定,就會使用默認的名字:DEFAULT_CONSUMER
RocketMQ使用Topic、Tag和GroupName簡單的3個概念,就能實現這些功能,敬佩實現它的作者們。
