RocketMQ最佳實踐


 

1、RocketMQ簡單介紹

RocketMQ主要由NameServer、Broker、Producer以及Consumer四部分構成,如下圖所示

所有的集群都具有水平擴展能力,無單點障礙。

NameServer以輕量級的方式提供服務發現和路由功能,每個NameServer存有全量的路由信息,提供對等的讀寫服務,支持快速擴縮容。

Broker負責消息存儲,以Topic為緯度支持輕量級的隊列,單機可以支撐上萬隊列規模,支持消息推拉模型,具備多副本容錯機制(2副本或3副本)、強大的削峰填谷以及上億級消息堆積能力,同時可嚴格保證消息的有序性。除此之外,Broker還提供了同城異地容災能力,豐富的Metrics統計以及告警機制。這些都是傳統消息系統無法比擬的。

Producer由用戶進行分布式部署,消息由Producer通過多種負載均衡模式發送到Broker集群,發送低延時,支持快速失敗。

Consumer也由用戶部署,支持PUSH和PULL兩種消費模式,支持集群消費和廣播消息,提供實時的消息訂閱機制,滿足大多數消費場景。   

2、RocketMQ中的專業術語

Topic
topic表示消息的第一級類型,比如一個電商系統的消息可以分為:交易消息、物流消息...... 一條消息必須有一個Topic。

Tag
Tag表示消息的第二級類型,比如交易消息又可以分為:交易創建消息,交易完成消息..... 一條消息可以沒有Tag。RocketMQ提供2級消息分類,方便大家靈活控制。

Queue
一個topic下,我們可以設置多個queue(消息隊列)。當我們發送消息時,需要要指定該消息的topic。RocketMQ會輪詢該topic下的所有隊列,將消息發送出去。

Producer 與 Producer Group
Producer表示消息隊列的生產者。消息隊列的本質就是實現了publish-subscribe模式,生產者生產消息,消費者消費消息。所以這里的Producer就是用來生產和發送消息的,一般指業務系統。

Producer Group是一類Producer的集合名稱,這類Producer通常發送一類消息,且發送邏輯一致。

Consumer 與 Consumer Group
消息消費者,一般由后台系統異步消費消息。

Push Consumer
Consumer 的一種,應用通常向 Consumer 對象注冊一個 Listener 接口,一旦收到消息,Consumer 對象立刻回調 Listener 接口方法。
Pull Consumer
Consumer 的一種,應用通常主動調用 Consumer 的拉消息方法從 Broker 拉消息,主動權由應用控制。

Consumer Group是一類Consumer的集合名稱,這類Consumer通常消費一類消息,且消費邏輯一致。

Broker
消息的中轉者,負責存儲和轉發消息。可以理解為消息隊列服務器,提供了消息的接收、存儲、拉取和轉發服務。broker是RocketMQ的核心,它不不能掛的,所以需要保證broker的高可用。

廣播消費
一條消息被多個Consumer消費,即使這些Consumer屬於同一個Consumer Group,消息也會被Consumer Group中的每個Consumer都消費一次。在廣播消費中的Consumer Group概念可以認為在消息划分方面無意義。

集群消費
一個Consumer Group中的Consumer實例平均分攤消費消息。例如某個Topic有 9 條消息,其中一個Consumer Group有 3 個實例(可能是 3 個進程,或者 3 台機器),那么每個實例只消費其中的 3 條消息。

NameServer
NameServer即名稱服務,兩個功能:

  1. 接收broker的請求,注冊broker的路由信息
  2. 接口client的請求,根據某個topic獲取其到broker的路由信息
    NameServer沒有狀態,可以橫向擴展。每個broker在啟動的時候會到NameServer注冊;Producer在發送消息前會根據topic到NameServer獲取路由(到broker)信息;Consumer也會定時獲取topic路由信息。

3、Producer最佳實踐

  1、一個應用盡可能用一個 Topic,消息子類型用 tags 來標識,tags 可以由應用自由設置。只有發送消息設置了tags,消費方在訂閱消息時,才可以利用 tags 在 broker 做消息過濾。
  2、每個消息在業務層面的唯一標識碼,要設置到 keys 字段,方便將來定位消息丟失問題。由於是哈希索引,請務必保證 key 盡可能唯一,這樣可以避免潛在的哈希沖突。
  3、消息發送成功或者失敗,要打印消息日志,務必要打印 sendresult 和 key 字段。
  4、對於消息不可丟失應用,務必要有消息重發機制。例如:消息發送失敗,存儲到數據庫,能有定時程序嘗試重發或者人工觸發重發。
  5、某些應用如果不關注消息是否發送成功,請直接使用sendOneWay方法發送消息。

4、Consumer最佳實踐

  1、消費過程要做到冪等(即消費端去重)
  2、盡量使用批量方式消費方式,可以很大程度上提高消費吞吐量。
  3、優化每條消息消費過程

5、其他配置

線上應該關閉autoCreateTopicEnable,即在配置文件中將其設置為false

RocketMQ在發送消息時,會首先獲取路由信息。如果是新的消息,由於MQServer上面還沒有創建對應的Topic,這個時候,如果上面的配置打開的話,會返回默認TOPIC的(RocketMQ會在每台broker上面創建名為TBW102的TOPIC)路由信息,然后Producer會選擇一台Broker發送消息,選中的broker在存儲消息時,發現消息的topic還沒有創建,就會自動創建topic。后果就是:以后所有該TOPIC的消息,都將發送到這台broker上,達不到負載均衡的目的。

所以基於目前RocketMQ的設計,建議關閉自動創建TOPIC的功能,然后根據消息量的大小,手動創建TOPIC。

 

本文部分內容摘自:http://www.jianshu.com/p/453c6e7ff81c

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM