你們好,我是Java最全面試題庫
的提褲姐,今天這篇是中間件面試題系列的第二篇,主要總結了RocketMQ相關的面試題;在後續,會沿着第一篇開篇的知識線路一直總結下去,作到日更!若是我能作到百日百更,但願你也能夠跟着百日百刷,一百天養成一個好習慣。java
RabbitMQ
erlang開發,對消息堆積的支持並很差,當大量消息積壓的時候,會致使 RabbitMQ 的性能急劇降低。每秒鐘能夠處理幾萬到十幾萬條消息。面試
RocketMQ
java開發,面向互聯網集羣化
,功能豐富,對在線業務的響應時延作了不少的優化,大多數狀況下能夠作到毫秒級的響應,每秒鐘大概能處理幾十萬條消息。數據庫
Kafka
Scala開發,面向日誌
,功能豐富,性能最高。當你的業務場景中,每秒鐘消息數量沒有那麼多的時候,Kafka 的時延反而會比較高。因此,Kafka 不太適合在線業務場景。服務器
ActiveMQ
java開發,簡單,穩定,性能不如前面三個。不推薦。網絡
Nameserver
無狀態,動態列表;這也是和zookeeper的重要區別之一。zookeeper是有狀態的。異步
Producer
消息生產者,負責發消息到Broker。分佈式
Broker
就是MQ自己,負責收發消息、持久化消息等。性能
Consumer
消息消費者,負責從Broker上拉取消息進行消費,消費完進行ack。優化
集羣消費線程
廣播消費
出現緣由
正常狀況下在consumer真正消費完消息後應該發送ack,通知broker該消息已正常消費,從queue中剔除
當ack由於網絡緣由沒法發送到broker,broker會認爲詞條消息沒有被消費,此後會開啓消息重投機制把消息再次投遞到consumer。
消費模式:在CLUSTERING
模式下,消息在broker中會保證相同group的consumer消費一次,可是針對不一樣group的consumer會推送屢次
解決方案
首先多個queue只能保證單個queue裏的順序,queue是典型的FIFO,自然順序。多個queue同時消費是沒法絕對保證消息的有序性的。
可使用同一topic
,同一個QUEUE,發消息的時候一個線程去發送消息,消費的時候 一個線程去消費一個queue裏的消息。
Producer端
採起send()
同步發消息,發送結果是同步感知的。
發送失敗後能夠重試,設置重試次數。默認3次。
Broker端
修改刷盤策略爲同步刷盤。默認狀況下是異步刷盤的。
集羣部署
Consumer端
徹底消費正常後在進行手動ack確認
一、生產者向MQ服務器發送half消息。
二、half消息發送成功後,MQ服務器返回確認消息給生產者。
三、生產者開始執行本地事務。
四、根據本地事務執行的結果(UNKNOW
、commit
、rollback
)向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。
一、若是能夠添加消費者解決,就添加消費者的數據量二、若是出現了queue,可是消費者多的狀況。可使用準備一個臨時的topic,同時建立一些queue,在臨時建立一個消費者來把這些消息轉移到topic中,讓消費者消費。