閒話RocketMQ

一、簡介

Apache RocketMQ是阿里開源的一款高性能、高吞吐量的分佈式消息中間件,具有高性能、高可靠、高實時、分佈式特點。

能夠保證嚴格的消息順序,提供豐富的消息拉取模式。

高效的訂閱者水平擴展能力,實時的消息訂閱機制,億級消息堆積能力。

二、RocketMq如何保證高可用的?

consumer 高可用

master 支持讀、寫,slave 只讀。當 master 不可用或者繁忙時,consumer 會被自動切換到 slave 讀。 master 出現故障,consumer 仍然可以從 slave 讀消息,不受影響。

producer 高可用

創建 topic 時,把 message queue 創建在多個 broker 組上(brokerName 一樣,brokerId 不同),當一個 broker 組的 master 不可用後,其他組的 master 仍然可以用,producer 可以繼續發消息。

三、RocketMq如何保證高吞吐的?

consumer 高可用

1)客戶端發送消息有負載均衡,客戶端內存中保存著當前所有的服務器列表,每次發送都切換一臺服務器發送消息,使得每臺服務器接收的消息量儘量均衡,避免熱點問題。2)發送線程安全,當Producer實例就緒之後,完全可以死循環發送消息。一般業務方都會有N個數據源實例,所以從數據源方面就保證高併發寫能力。3)消費者端負載均衡集群消費模式下,同一個ID的所有消費者實例平均消費該Topic的所有隊列。

producer 高可用

服務端的高併發讀寫主要利用Linux操作系統的PageCache特性。

通過Java的MappedByteBuffer直接操作PageCache。MappedByteBuffer能直接將文件直接映射到內存,其實就是Map把文件的內容被映像到計算機虛擬內存的一塊區域,這樣就可以直接操作內存當中的數據而無需操作的時候每次都通過I/O去物理硬盤寫文件的。

四、RocketMq的消息是有序的嗎?

無序,但是可以保證局部有序

五、RocketMq的消息局部順序是如何保證的?

根據 MessageQueueSelector 實現的算法來選擇一個隊列,根據特定id獲取到的隊列(獲取隊列數量然後根據數量對id取模)

六、RocketMq事務消息的實現機制?

RocketMQ支持事務消息,com.alibaba.rocketmq.example.transaction.TransactionProducer

第一階段發送Prepared消息時,會拿到消息的地址

第二階段執行本地事物

第三階段通過第一階段拿到的地址去訪問消息,並修改消息的狀態

如果最後一階段執行失敗,數據沒有發送到broker,導致事務消息的狀態更新失敗,broker會有回查線程定時(默認1分鐘)掃描每個存儲事務狀態的表格,如果是已經提交或者回滾的消息直接跳過,如果是prepared狀態則會向Producer發起CheckTransaction請求,Producer會調用DefaultMQProducerImpl.checkTransactionState()方法來處理broker的定時回調請求,而checkTransactionState會調用我們的事務設置的決斷方法來決定是回滾事務還是繼續執行,最後調用endTransactionOneway讓broker來更新消息的最終狀態。

七、RocketMq會有重複消費的問題嗎?如何解決?

造成消息重複的根本原因是網絡不可達。只要通過網絡交換數據,就無法避免這個問題。

消費端處理消息的業務邏輯保持冪等性,保證每條消息都有唯一編號。

八、RocketMq支持什麼級別的延遲消息?

RocketMQ 支持定時消息,但是不支持任意時間精度,僅支持特定的 level,如下。其中,level=0 級表示不延時,level=1 表示 1 級延時,level=2 表示 2 級延時,以此類推。

在服務器端(rocketmq-broker端)的屬性配置文件中加入以下行:messageDelayLevel=1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h

Message msg = new Message(topic, tags, keys, body);

msg.setDelayTimeLevel(1);

九、RocketMq是推模型還是拉模型?

RocketMQ消息訂閱有兩種模式,一種是Push模式,即MQServer主動向消費端推送。另外一種是Pull模式,即消費端在需要時,主動到MQServer拉取。但在具體實現時,Push和Pull模式都是採用消費端主動拉取的方式。

十、Consumer的負載均衡模式?

consumer負載均衡有6種模式:

1)分頁模式(隨機分配模式)

2)手動配置模式

3)指定機房模式

4)就近機房模式

5)統一哈希模式

6)環型模式


閒話RocketMQ


分享到:


相關文章: