持續輸出面試題之RocketMQ篇

fondtiger發表於2021-09-09

開篇介紹

大家好,我是Java最全面試題庫的提褲姐,今天這篇是中介軟體面試題系列的第二篇,主要總結了RocketMQ相關的面試題;在後續,會沿著第一篇開篇的知識線路一直總結下去,做到日更!如果我能做到百日百更,希望你也可以跟著百日百刷,一百天養成一個好習慣。

多個MQ如何選型?

RabbitMQ
erlang開發,對訊息堆積的支援並不好,當大量訊息積壓的時候,會導致 RabbitMQ 的效能急劇下降。每秒鐘可以處理幾萬到十幾萬條訊息。

RocketMQ
java開發,面向網際網路叢集化,功能豐富,對線上業務的響應時延做了很多的最佳化,大多數情況下可以做到毫秒級的響應,每秒鐘大概能處理幾十萬條訊息。

Kafka
Scala開發,面向日誌,功能豐富,效能最高。當你的業務場景中,每秒鐘訊息數量沒有那麼多的時候,Kafka 的時延反而會比較高。所以,Kafka 不太適合線上業務場景。

ActiveMQ
java開發,簡單,穩定,效能不如前面三個。不推薦。

RocketMQ組成部分有哪些?

Nameserver
無狀態,動態列表;這也是和zookeeper的重要區別之一。zookeeper是有狀態的。

Producer
訊息生產者,負責發訊息到Broker。

Broker
就是MQ本身,負責收發訊息、持久化訊息等。

Consumer
訊息消費者,負責從Broker上拉取訊息進行消費,消費完進行ack。

RocketMQ消費模式有幾種?

叢集消費

  • 一條訊息只會被同Group中的一個Consumer消費
  • 多個Group同時消費一個Topic時,每個Group都會有一個Consumer消費到資料

廣播消費

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

訊息重複消費如何解決?

出現原因
正常情況下在consumer真正消費完訊息後應該傳送ack,通知broker該訊息已正常消費,從queue中剔除
當ack因為網路原因無法傳送到broker,broker會認為詞條訊息沒有被消費,此後會開啟訊息重投機制把訊息再次投遞到consumer。

消費模式:在CLUSTERING模式下,訊息在broker中會保證相同group的consumer消費一次,但是針對不同group的consumer會推送多次

解決方案

  • 資料庫表:處理訊息前,使用訊息主鍵在表中帶有約束的欄位中insert
  • Map:單機時可以使用map做限制,消費時查詢當前訊息id是不是已經存在
  • Redis:使用分散式鎖。

RocketMQ如何保證訊息的順序消費?

首先多個queue只能保證單個queue裡的順序,queue是典型的FIFO,天然順序。多個queue同時消費是無法絕對保證訊息的有序性的。
可以使用同一topic,同一個QUEUE,發訊息的時候一個執行緒去傳送訊息,消費的時候 一個執行緒去消費一個queue裡的訊息。

RocketMQ如何保證訊息不丟失?

Producer端
採取send()同步發訊息,傳送結果是同步感知的。
傳送失敗後可以重試,設定重試次數。預設3次。

Broker端
修改刷盤策略為同步刷盤。預設情況下是非同步刷盤的。
叢集部署

Consumer端
完全消費正常後在進行手動ack確認

RocketMQ如何實現分散式事務?

1、生產者向MQ伺服器傳送half訊息。
2、half訊息傳送成功後,MQ伺服器返回確認訊息給生產者。
3、生產者開始執行本地事務。
4、根據本地事務執行的結果(UNKNOWcommitrollback)向MQ Server傳送提交或回滾訊息。
5、如果錯過了(可能因為網路異常、生產者突然當機等導致的異常情況)提交/回滾訊息,則MQ伺服器將向同一組中的每個生產者傳送回查訊息以獲取事務狀態。
6、回查生產者本地事物狀態。
7、生產者根據本地事務狀態傳送提交/回滾訊息。
8、MQ伺服器將丟棄回滾的訊息,但已提交(進行過二次確認的half訊息)的訊息將投遞給消費者進行消費。

Half Message:預處理訊息,當broker收到此類訊息後,會儲存到RMQ_SYS_TRANS_HALF_TOPIC的訊息消費佇列中

檢查事務狀態:Broker會開啟一個定時任務,消費RMQ_SYS_TRANS_HALF_TOPIC佇列中的訊息,每次執行任務會向訊息傳送者確認事務執行狀態(提交、回滾、未知),如果是未知,Broker會定時去回撥在重新檢查。

超時:如果超過回查次數,預設回滾訊息。
也就是他並未真正進入Topic的queue,而是用了臨時queue來放所謂的half message,等提交事務後才會真正的將half message轉移到topic下的queue。

RocketMQ的訊息堆積如何處理?

1、如果可以新增消費者解決,就新增消費者的資料量
2、如果出現了queue,但是消費者多的情況。可以使用準備一個臨時的topic,同時建立一些queue,在臨時建立一個消費者來把這些訊息轉移到topic中,讓消費者消費。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2508/viewspace-2826065/,如需轉載,請註明出處,否則將追究法律責任。

相關文章