前言
RocketMQ配置中有一個設置項為transferMsgByHeap,即是否通過堆內存傳輸數據。在文章“RocketMQ存儲--同步刷盤和異步刷盤”中對其進行過梳理。那transferMsgByHeap是開啟好呢?還是關閉好!第二個問題是可以設置消費的線程數,由于無界隊列所以只需要設置最小線程數consumeThreadMin即可,那在rocket-client4.7版本中還能這么用嗎?
一、transferMsgByHeap誤解
transferMsgByHeap設置為false時,通過堆外內存傳輸數據,相比堆內存傳輸減少了數據拷貝,即:零字節拷貝,效率更高。所以關閉transferMsgByHeap應該成為我們的優先選擇,但是實踐來看,你或許會改變想法,下面是transferMsgByHeap=false,客戶端大量超時錯誤時的日志截圖。
1.Broker日志截圖
broker日志
2.CPU日志截圖
CPU截圖
3.系統日志截圖
系統日志
4.源碼報錯截圖
源代碼截圖
小結:你看到這里會發現,在關閉transferMsgByHeap時,可能造成堆外內存分配不夠,觸發系統內存回收和落盤操作。此時CPU會有一個陡坡,具體客戶端表現為發送大量超時。解決方式開啟transferMsgByHeap即可,讓運行更加平穩。
二、消費的最小線程數
我們在使用rocketmq消費時,有兩個參數consumeThreadMin和consumeThreadMax。在以往的版本中,我們只需要設置consumeThreadMin即可,例如consumeThreadMin=64。在rocket-client4.7版本中,如果設置consumeThreadMin=64會導致消費失敗,下面看下原因。
1.錯誤提示
org.Apache.rocketmq.client.exception.MQClientException: consumeThreadMin (64) is larger than consumeThreadMax (20)
2.源碼原因
4.1
4.7
小結:在rocketmq-client新版本中,增加了consumeThreadMax的判斷。當consumeThreadMin大于20時需要同時設置consumeThreadMax,所以單獨設置consumeThreadMin=64會拋出錯誤導致消費失敗。