持續輸出面試題之RocketMQ篇

開篇介紹

你們好,我是Java最全面試題庫的提褲姐,今天這篇是中間件面試題系列的第二篇,主要總結了RocketMQ相關的面試題;在後續,會沿着第一篇開篇的知識線路一直總結下去,作到日更!若是我能作到百日百更,但願你也能夠跟着百日百刷,一百天養成一個好習慣。java

多個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如何實現分佈式事務?

一、生產者向MQ服務器發送half消息。
二、half消息發送成功後,MQ服務器返回確認消息給生產者。
三、生產者開始執行本地事務。
四、根據本地事務執行的結果(UNKNOWcommitrollback)向MQ Server發送提交或回滾消息。
五、若是錯過了(可能由於網絡異常、生產者忽然宕機等致使的異常狀況)提交/回滾消息,則MQ服務器將向同一組中的每一個生產者發送回查消息以獲取事務狀態。
六、回查生產者本地事物狀態。
七、生產者根據本地事務狀態發送提交/回滾消息。
八、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的消息堆積如何處理?

一、若是能夠添加消費者解決,就添加消費者的數據量二、若是出現了queue,可是消費者多的狀況。可使用準備一個臨時的topic,同時建立一些queue,在臨時建立一個消費者來把這些消息轉移到topic中,讓消費者消費。

相關文章
相關標籤/搜索