RocketMQ角色介紹

RocketMQ

主流的MQ有很多,比如ActiveMQ、RabbitMQ、RocketMQ、Kafka、ZeroMQ等。

之前阿里巴巴也是使用ActiveMQ,隨着業務發展,ActiveMQ IO 模塊出現瓶頸,後來阿里巴巴 通過一系列優化但是還是不能很好的解決,之後阿里巴巴把注意力放到了主流消息中間件kafka上面,但是kafka並不能滿足他們的要求,尤其是低延遲和高可靠性。

所以RocketMQ是站在巨人的肩膀上(kafka)MetaQ的內核,又對其進行了優化讓其更滿足互聯網公司的特點。它是純Java開發,具有高吞吐量、高可用性、適合大規模分佈式系統應用的特點。 RocketMQ目前在阿里集團被廣泛應用於交易、充值、流計算、消息推送、日誌流式處理、binglog分發等場景。

RocketMQ 功能 大綱

RocketMQ介紹

  • 消息隊列應用場景
  • rocketmq中的角色
    • nameserver
  • 官網解讀

消息發送

  • 同步發送

  • 異步發送

  • 單向發送

  • 消息批量發送

  • 消息結構

  • 消息發送流程

消息存儲

  • 存儲方式
  • 發送消息時存儲流程
  • 存儲文件與內存映射
  • 刷盤機制
  • 文件恢復與過期刪除機制
  • 索引

消息消費

  • 消息訂閱
  • 消息拉取和推送
  • 消息處理隊列
  • 順序消費
  • 定時消息機制
  • 消息過濾TAG與sql92
  • FilterServer過濾機制
  • 併發消息消費
  • 消費負載與算法
  • 消費者動態添加
  • 消息消費過程
  • ACK
  • 消費進度與offset

Rocketmq集羣 HA

  • 集羣搭建
  • 主從同步複製原理
  • 讀寫分離機制

整合

  • 使用spring
  • SpringCloud整合

監控與運維

  • rocketmq-console監控平臺
  • 命令行運維 MQAdmin
  • 自定義日誌

消息隊列介紹

消息隊列是《數據結構》中先進先出的一種數據結構,在當前的架構中,作爲中間件提供服務。

消息中間件功能

應用解耦

AB應用不在互相依賴

流量削峯

流量達到高峯的時候,通常使用限流算法來控制流量湧入系統,避免系統被擊癱,但是這種方式損失了一部分請求

此時可以使用消息中間件來緩衝大量的請求,勻速消費,當消息隊列中堆積消息過多時,我們可以動態上線增加消費端,來保證不丟失重要請求。

大數據處理

消息中間件可以把各個模塊中產生的管理員操作日誌、用戶行爲、系統狀態等數據文件作爲消息收集到主題中

數據使用方可以訂閱自己感興趣的數據內容互不影響,進行消費

異構系統

跨語言

RocketMQ 角色

broker

  • Broker面向producer和consumer接受和發送消息
  • 向nameserver提交自己的信息
  • 是消息中間件的消息存儲、轉發服務器。
  • 每個Broker節點,在啓動時,都會遍歷NameServer列表,與每個NameServer建立長連接,註冊自己的信息,之後定時上報。
broker集羣
  • Broker高可用,可以配成Master/Slave結構,Master可寫可讀,Slave只可以讀,Master將寫入的數據同步給Slave。
    • 一個Master可以對應多個Slave,但是一個Slave只能對應一個Master
    • Master與Slave的對應關係通過指定相同的BrokerName,不同的BrokerId來定義BrokerId爲0表示Master,非0表示Slave
  • Master多機負載,可以部署多個broker
    • 每個Broker與nameserver集羣中的所有節點建立長連接,定時註冊Topic信息到所有nameserver。

producer

  • 消息的生產者
  • 通過集羣中的其中一個節點(隨機選擇)建立長連接,獲得Topic的路由信息,包括Topic下面有哪些Queue,這些Queue分佈在哪些Broker上等
  • 接下來向提供Topic服務的Master建立長連接,且定時向Master發送心跳

consumer

消息的消費者,通過NameServer集羣獲得Topic的路由信息,連接到對應的Broker上消費消息。

注意,由於Master和Slave都可以讀取消息,因此Consumer會與Master和Slave都建立連接。

nameserver

底層由netty實現,提供了路由管理、服務註冊、服務發現的功能,是一個無狀態節點

nameserver是服務發現者,集羣中各個角色(producer、broker、consumer等)都需要定時想nameserver上報自己的狀態,以便互相發現彼此,超時不上報的話,nameserver會把它從列表中剔除

nameserver可以部署多個,當多個nameserver存在的時候,其他角色同時向他們上報信息,以保證高可用,

NameServer集羣間互不通信,沒有主備的概念

nameserver內存式存儲,nameserver中的broker、topic等信息默認不會持久化

爲什麼不用zookeeper?:rocketmq希望爲了提高性能,CAP定理,客戶端負載均衡

對比JSM中的Topic和Queue

Topic是一個邏輯上的概念,實際上Message是在每個Broker上以Queue的形式記錄。

對應到JMS中的topic實現是由客戶端來完成的

        consumer.setMessageModel(MessageModel.BROADCASTING);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章