面試題:RocketMq

一、RocketMq優點?

1)支持順序性,可以做到局部有序,在單線程內使用該生產者發送的消息按照發送的順序到達服務器並存儲,並按照相同順序被消費,但前提是這些消息發往同一服務器的同一個分區

2)採取長輪詢+PULL消費消息,配合合理的參數設置來獲得更高的響應時間,實時性不低於PUSH方式

3)提供了豐富的拉取模式

4)支持10億級別的消息堆積,不會因為堆積導致性能下降

5)高效的訂閱者水平擴展機制

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

1)master和slave 配合,master 支持讀、寫,slave 只讀,producer 只能和 master 連接寫入消息,consumer 可以連接 master 和 slave。

2)當 master 不可用或者繁忙時,consumer 會被自動切換到 slave 讀。即使 master 出現故障,consumer 仍然可以從 slave 讀消息,不受影響。

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

三、
RocketMq消費者消費模式有幾種?

1. 集群消費

一條消息只會投遞到一個 Consumer Group 下面的一個實例。

2. 廣播消費

消息將對一個Consumer Group 下的各個 Consumer 實例都投遞一遍。即使這些 Consumer 屬於同一個Consumer Group ,消息也會被 Consumer Group 中的每個 Consumer 都消費一次。

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

一個topic下有多個queue,為了保證發送有序,rocketmq提供了MessageQueueSelector隊列選擇機制

1)可使用hash取模法,讓同一個訂單發送到同一個queue中,再使用同步發送,只有消息A發送成功,再發送消息B

2)rocketmq的topic內的隊列機制,可以保證存儲滿足FIFO,剩下的只需要消費者順序消費即可

3)rocketmq僅保證順序發送,順序消費由消費者業務保證

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

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

RocketMQ第二階段執行本地事物,第三階段通過第一階段拿到的地址去訪問消息,並修改消息的狀態。

RocketMQ會定期掃描消息集群中的事物消息,如果發現了Prepared消息,它會向消息發送端(生產者)確認,RocketMQ會根據發送端設置的策略來決定是回滾還是繼續發送確認消息。這樣就保證了消息發送與本地事務同時成功或同時失敗。

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

在網絡中斷的情況下可能出現,需要保證消費端處理消息的業務邏輯保持冪等性

七、RocketMq延遲消息?如何實現的?

RocketMQ 支持定時消息,但是不支持任意時間精度,僅支持特定的 level,例如定時 5s, 10s, 1m 等。其中,level=0 級表示不延時,level=1 表示 1 級延時,level=2 表示 2 級延時。默認的配置是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(3);

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

rocketmq不管是推模式還是拉模式底層都是拉模式,推模式也是在拉模式上做了一層封裝.

消息存儲在broker中,通過topic和tags區分消息隊列。producer在發送消息時不關心consumer對應的topic和tags,只將消息發送到對應broker的對應topic和tags中。

推模式中broker則需要知道哪些consumer擁有哪些topic和tags,但在consumer重啟或更換topic時,broker無法及時獲取信息,可能將消息推送到舊的consumer中。對應consumer主動獲取topic,這樣確保每次主動獲取時他對應的topic信息都是最新的。

九、RocketMq的負載均衡?

1)生產者負載均衡

從MessageQueue列表中隨機選擇一個(默認策略),通過自增隨機數對列表大小取餘獲取位置信息,但獲得的MessageQueue所在的集群不能是上次的失敗集群。

集群超時容忍策略,先隨機選擇一個MessageQueue,如果因為超時等異常發送失敗,會優先選擇該broker集群下其他的messeagequeue進行發送。如果沒有找到則從之前發送失敗broker集群中選擇一個MessageQueue進行發送,如果還沒有找到則使用默認策略。

2)消費者負載均衡

1)平均分配策略(默認)(AllocateMessageQueueAveragely)2)環形分配策略(AllocateMessageQueueAveragelyByCircle)3)手動配置分配策略(AllocateMessageQueueByConfig)4)機房分配策略(AllocateMessageQueueByMachineRoom)5)一致性哈希分配策略(AllocateMessageQueueConsistentHash)6)靠近機房策略(AllocateMachineRoomNearby)

十、RocketMq消息積壓

1)提高消費並行讀 同一個Consumer Group下,通過增加Consumer實例的數量來提高並行度,超過訂閱隊列數的Consumer實例無效。

提高單個Consumer的消費並行線程,通過修改Consumer的consumerThreadMin和consumerThreadMax來設置線程數

2)批量方式消費

通過設置Consumer的consumerMessageBathMaxSize這個參數,默認是1,一次只消費一條消息,例如設置N,那麼每次消費的消息條數小於等於N

3)丟棄非重要消息

當消息發生堆積時,如果消費速度跟不上消費速度,可以選擇丟棄一些不重要的消息

4)優化消息消費的過程

對於消費消息的過程一般包括業務處理以及跟數據庫的交互,可以試著通過一些其他的方法優化消費的邏輯。

臨時解決方案:

新建一個topic,寫一個臨時的分發數據的consumer程序,這個程序部署上去消費積壓的數據,消費之後不做耗時的處理,直接均勻輪詢寫入臨時建立好的queue中。臨時用一部分機器來部署consumer,每一批consumer消費一個臨時queue的數據。等快速消費完積壓數據之後,得恢復原先部署架構,重新用原先的consumer機器來消費消息


面試題:RocketMq


分享到:


相關文章: