通過問題了解rocketmq

2021-10-09 09:00:10 字數 4060 閱讀 3993

rocketmq在面試中那些常見問題及答案+彙總

rocketmq 分布式事務

分布式事務(3)—rocketmq實現分布式事務原理

1、說說你們公司線上生產環境用的是什麼訊息中介軟體?

rabbitmq:erlang語言開發,開發者想看原始碼時成本較高,不過社群活動度高。rabbitmq對訊息堆積不是很好,當大量訊息堆積時會導致rabbitmq的效能急劇下降。每秒可以處理幾萬到十幾萬的訊息。

2、為什麼要使用mq?

解耦:降低**間的耦合度,減少service**間的直接關聯。通過訂閱-發布還可以增加**復用。

非同步:把一些對實時性要求不是很高的業務,做非同步處理,這樣可以加快請求的響應時間,提高使用者體驗。

削峰:進行搶購秒殺活動時,每秒鐘可能會有大量的請求,有時可能會壓垮資料庫。這時可以把請求先堆積到mq中。消費者再按固定的頻率消費掉mq的請求,確保資料庫可以用最大的效能工作。

3、rocketmq由哪些角色組成,每個角色作用和特點是什麼

producer和producergroup: 訊息的生產者。

consumer和consumergroup:訊息的消費者。

broker : rocketmq本身。負責收發訊息,持久化訊息。

nameserver:1,無狀態,動態列表。接受 broker 伺服器的註冊資訊。nameservice間不互換訊息,broker需要向每個nameserver發生訊息,2,接受producer,consumer的請求連線,提供broker路由資訊。

4、rocketmq中的topic和jms的queue有什麼區別?

jms的queue的本質是fifo佇列,接受訊息並儲存起來,等待consumer消費。rocketmq的topic是個抽象概念,其本質就是n個queue。

不會。broker會把接受到的訊息儲存到commitlog檔案中。consumer是根據offser獲取訊息的,當乙個訊息被消費後,offser移動乙個訊息位,訊息本身還是存在的。rockermq有定期清理機制,預設按48小時刪除不在使用的訊息。

6、rocketmq消費模式有幾種?

2鐘消費模式:1 集群模式,2 廣播模式。

1,集群模式。1,只有乙個consumergroup時,一條訊息只會被group中的乙個consumer消費。2 有多個consumergroup消費同乙個topic時,乙個訊息會被每個group中的乙個consumer消費。

2,廣播模式:乙個訊息會被同乙個consumergroup中的所有consumer消費

7、消費訊息是push還是pull?

pull:開發者主動從broker拉取訊息消費。

push:rocketmq通過長輪詢從broker拉取訊息,如果有訊息則通知訊息***。開發者通過實現訊息***,被動的接受訊息並消費。

push 實際上還是pull模式。rocketmq只是把從broker拉取訊息的**封裝起來,方便開發者使用。

既然已經有了push模式為什麼還使用pull,pull在什麼場景下使用呢?因為push接受訊息很快,基本達到實時了。假設 現在是秒殺場景,系統一秒鐘接受到幾萬的訂單訊息,而消費者每秒鐘只能處理1萬的訊息。此時如果繼續使用push,則容易造成consumer業務超量堆積,效能下降厲害,最後可能造成雪崩。此時我可以使用 pull 模式,根據consumer的消費能力,每秒主動拉取9000條訊息消費。

8、rocketmq如何做負載均衡?

rocketmq負載均衡分為2端。1,producer發訊息給broker時的負載均衡。2,consumer從broker消費訊息時負載均衡。

傳送端指定message queue傳送訊息到相應的broker,來達到寫入時的負載均衡,預設策略是隨機選擇。

隨機選擇策略:producer維護乙個index,每次取節點會自增,index向所有broker個數取餘選擇broker傳送訊息。還有其他實現,如雜湊策略。使用者也可以通過實現messagequeueselector自定義策略。

consumer端預設採用的是平均分配演算法來進行負載均衡。

9、怎麼處理訊息重**送?

訊息重**送主要是broker沒有接受到consumer的ack。引起的原因可能有網路異常,**異常沒有ack。這就需要consumer的業務處理邏輯支援冪等。如:1 資料庫的樂觀鎖,唯一索引。2,redis分布式鎖等。

10、如何讓rocketmq保證訊息的順序消費

rocketmq的單個queue本質是fifo佇列,天然保證訊息的順序消費。我們只要讓訊息按順序進入相同的queue,就可以保證訊息順序地獲取。但順序獲取還不夠,consumer如果是多執行緒消費的話也不能保證訊息順序消費,需要實現 consumemessageorderlyservice消費訊息。如 下單->付費->履單, 3處發生訊息時都按訂單的id取模選擇相同的queue。rocket mq給我們提供了messagequeueselector介面,可以自己重寫裡面的介面,選擇queue。

producer.

send

( message,

// 要發的那條訊息

// queue 選擇器 ,向 topic中的哪個queue去寫訊息

newmessagequeueselector()

else}}

,// 自定義引數:在這裡可以是訂單id

orderid,

// 2000代表2000毫秒超時時間

2000

);

11、rocketmq的訊息堆積如何處理

首先要找到是什麼原因導致的訊息堆積,是producer太多了,consumer太少了導致的還是說其他情況,總之先定位問題。然後看下訊息消費速度是否正常,正常的話,可以通過上線更多consumer臨時解決訊息堆積問題

11-1,如果consumer和queue不對等,上線了多台也在短時間內無法消費完堆積的訊息怎麼辦

建立多個臨時topic

新建乙個consumer做搬運工,把訊息從老topic平均的移到新的topic。

新建多個consumer同時消費臨時的topic

分析之前的**,修改bug

訊息消費下來後,可以刪除臨時的topic,恢復之前的consumer

11-2,堆積時間過長訊息超時了,怎麼辦

rocketmq中的訊息只會在commitlog被刪除的時候才會消失,不會超時。也就是說未被消費的訊息不會存在超時刪除這情況。

11-3,堆積的訊息會不會進死信佇列

不會,訊息消費失敗後會先進入重試佇列,重試18次,超過18後才進入死信佇列。

12,rocketmq在分布式事務支援這塊機制的底層原理?

rocketmq是一種最終一致性的分布式事務。producer發訊息是是發 halfmessage(halfmessage 是指暫不能被consumer消費的訊息。producer 已經把訊息成功傳送到了 broker 端,但此訊息被標記為暫不能投遞狀態,處於該種狀態下的訊息稱為半訊息。需要 producer對訊息的二次確認後,consumer才能去消費它。),傳送成功後,再執行本地事務業務。根據執行結果對broker進行二次確認。如果是成功,傳送commit,consumer可以消費這個訊息了,如果失敗發生rollback,broker刪除這條訊息。如果在進行而且確認時出現異常(如網路故障),rocketmq有乙個定時器,會主動調查producer的本地事務執行結果(需要producer實現transactionchecklistener 介面),根據結果再進行二次確認,這樣就保證了producer的一致性。

訊息可以被consumer消費就一定保證了訊息的一致性嗎?不一定。consumer消費異常時rocketmq會重試再次消費(自帶重試機制,重試18次),重試18次後還是失敗,那應該是**有問題了,需要儲存該訊息和異常資訊,人工介入調查,除錯。詳情課程檢視rocketmq 分布式事務 和 分布式事務(3)—rocketmq實現分布式事務原理

C語言使用數學庫編譯不通過問題

include include int main 編譯結果 tmp ccibw7gz.o in function main test.c text 0x2d undefined reference to pow collect2 ld returned 1 exit status 這是怎麼回事?us...

030day(通過例題了解程式時間複雜度)

2017年11月9日 連續030天 內容 a.a.輸入n n 100,000 個整數,找出其中的兩個數,它們之和等於整數m 假定肯定有解 題中所有整數都能用int表示 思路 解法1 兩重迴圈,列舉,複雜度是o n 2 大約為100億,超時!解法2 1 將陣列排序,複雜度是o n log n 底數是2...