持續輸出面試題之RocketMQ篇
開篇介紹
大家好,我是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、根據本地事務執行的結果(UNKNOW
、commit
、rollback
)向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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 持續輸出面試題之Hibernate篇面試題
- 持續輸出面試題系列之ZooKeeper篇面試題
- 持續輸出面試題之Nginx面試題Nginx
- .netcore持續整合測試篇之測試方法改造NetCore
- .net持續整合測試篇之Nunit that斷言
- 2019 DevOps 必備面試題——持續整合篇dev面試題
- .net持續整合測試篇之Nunit引數化測試
- .net持續整合測試篇之Nunit常見斷言
- .net持續整合sonarqube篇之 sonarqube整合單元測試
- AI面試題(持續更新)AI面試題
- Hbase面試題(持續更新)面試題
- 持續整合之 Spring Boot 實戰篇Spring Boot
- Spring面試題(持續更新中)Spring面試題
- 前端面試問題二(持續更新)前端面試
- 持續整合持續部署持續交付_持續整合與持續部署之間的真正區別
- .net持續整合sonarqube篇之sonarqube基本操作(二)
- PHP面試題總結-持續更新中PHP面試題
- GO面試題集錦快答[持續更新]Go面試題
- 聊聊持續測試
- .netcore持續整合測試篇之搭建記憶體伺服器進行整合測試一NetCore記憶體伺服器
- 【前端面試】Vue面試題總結(持續更新中)前端Vue面試題
- 【Java面試題系列】:Java基礎知識面試題,看這一篇就夠了(持續更新)Java面試題
- 前端面試題總結——HTML(持續更新中)前端面試題HTML
- 2019 Vue 面試題彙總(持續更新中...)Vue面試題
- 資料分析面試|SQL真題持續更新面試SQL
- .net持續整合sonarqube篇之 sonarqube與jenkins整合(命令模式)Jenkins模式
- .net持續整合sonarqube篇之sonarqube安裝與基本配置
- 前端面試題總結——綜合問題(持續更新中)前端面試題
- 持續整合、持續部署、持續交付、持續釋出
- LeetCode刷題:設計問題篇(C++實現,持續更新中...)LeetCodeC++
- .net持續整合sonarqube篇之 sonarqube與jenkins整合(外掛模式)Jenkins模式
- .net持續整合cake篇之cake介紹及簡單示例
- 『中級篇』docker之CI/CD持續整合-gitlab安裝(70)DockerGitlab
- 學習 Laravel —— 前端篇(持續更新)Laravel前端
- leetcode題解【持續更新】LeetCode
- 2019最新Web前端經典面試試題及答案,持續更新Web前端面試
- LeetCode刷題:數學篇(C++實現,持續更新中...)LeetCodeC++
- 持續整合、持續交付與持續部署