rocketmq 發送時異常:system busy 和 broker busy 解決方案

之前寫的解決方案,都是基于測試環境測試的.到生產環境之后,正常使用沒有問題,生產環境壓測時,又出現了system busy異常(簡直崩潰).最后在rocketmq群里大佬指導下,終于解決(希望是徹底解決).

下面直接給出結果:

目前通過生產環境各種參數修改測試得出:

broker?busy異常:?可通過增大 waitTimeMillsInSendQueue?解決

system busy異常:可通過增大?osPageCacheBusyTimeOutMills?解決

#發送隊列等待時間
waitTimeMillsInSendQueue=3000
#系統頁面緩存繁忙超時時間(翻譯),默認值 1000
osPageCacheBusyTimeOutMills=5000

個人猜測,出現異常的原因是因為我們同一臺服務器部署的多個應用造成的.我們一臺服務器上部署了?三個ES、八個redis、一個rocketmq ,壓力測試時這些都在使用,雖然cpu、內存都還有很大剩余,但是磁盤io和內存頻率畢竟只有那么多可能已經占滿,或者還有其他都會有影響。

  之前測試環境測試其他東西時,發現mq和redis同時大量使用時,redis速度會降低三到四倍,由此可見應用分服務器部署的重要性。以前知道會有影響,沒想到影響這么大。

  最終結解決方案:應該給rocketmq單獨部署性能較高的服務器.

下面給下我們完整的配置:

#broker名字,注意此處不同的配置文件填寫的不一樣
brokerClusterName=rocketmqcluster
brokerName=broker-a
#0 表示 Master, >0 表示 Slave
brokerId=0
#nameServer地址,分號分割
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
#這個配置可解決雙網卡,發送消息走外網的問題,這里配上內網ip就可以了
brokerIP1=10.30.51.149#在發送消息時,自動創建服務器不存在的topic,默認創建的隊列數
defaultTopicQueueNums=8
#是否允許 Broker 自動創建Topic,建議線下開啟,線上關閉
autoCreateTopicEnable=false
#是否允許 Broker 自動創建訂閱組,建議線下開啟,線上關閉
autoCreateSubscriptionGroup=true
#Broker 對外服務的監聽端口
listenPort=10911
#刪除文件時間點,默認凌晨 0點
deleteWhen=03
#文件保留時間,默認 48 小時
fileReservedTime=48
#commitLog每個文件的大小默認1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每個文件默認存30W條,根據業務情況調整
mapedFileSizeConsumeQueue=1000000
destroyMapedFileIntervalForcibly=120000
redeleteHangedFileInterval=120000
#檢測物理文件磁盤空間
diskMaxUsedSpaceRatio=88
#存儲路徑
storePathRootDir=/app/data/rocketmq/data
#commitLog 存儲路徑
storePathCommitLog=/app/data/rocketmq/data/commitlog
#消費隊列存儲路徑存儲路徑
storePathConsumeQueue=/app/data/rocketmq/data/consumerqueue
#消息索引存儲路徑
storePathIndex=/app/data/rocketmq/data/index
#checkpoint 文件存儲路徑
storeCheckpoint=/app/data/rocketmq/data/checkpoint
#abort 文件存儲路徑
abortFile=/app/data/rocketmq/data/abort
#限制的消息大小 修改為16M
maxMessageSize=?16777216?
#發送隊列等待時間
waitTimeMillsInSendQueue=3000
osPageCacheBusyTimeOutMills=5000
flushCommitLogLeastPages=12
flushConsumeQueueLeastPages=6
flushCommitLogThoroughInterval=30000
flushConsumeQueueThoroughInterval=180000
#Broker 的角色
#- ASYNC_MASTER 異步復制Master
#- SYNC_MASTER 同步雙寫Master
#- SLAVE
brokerRole=ASYNC_MASTER
#刷盤方式
#- ASYNC_FLUSH 異步刷盤
#- SYNC_FLUSH 同步刷盤
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#發消息線程池數量
sendMessageThreadPoolNums=80
#拉消息線程池數量
pullMessageThreadPoolNums=128
useReentrantLockWhenPutMessage=true

記一次 rocketmq 使用時的異常。

  這里就不說什么rocketmq 源碼啥的了,因為沒看過。網上一搜這兩個異常 大部分都是什么源碼解讀,也沒說出現后的解決辦法。

大量測試發現:

1、system busy?, start flow control for a while

  該異常會造成 消息丟失。

2、broker busy?, start flow control for a while

  該異常不會造成消息丟失。(這是最坑的,都異常了消息竟然是正常發送了的。)

解決過程:

1、最開始時候 ,測試發現在性能好的服務器上 只會出現system busy,也就是說出現異常就會消息丟失。

  所以:業務代碼進行處理,出現異常就會重發到當前topic的 bak隊列,當時想的是既然這個topic busy了,就換到另外的topic去發,總不能都 busy吧。

也算是臨時解決了。

2、運行一年后,可能是服務器上運行的東西多了,或者其他原因。發現有消息重復的現象。不用想肯定是報broker busy異常,重發到topic的 bak隊列了。又因為broker busy可能不會造成消息丟失,所以消息重復就出現了。

3、無奈,找新的解決方法。本來想的是判斷異常,如果是broker busy就不重發了。

報著試一試的態度,又去百度了一下,還是搜出來一堆源碼解讀。搭上梯子,google一下,還真找到了。

https://stackoverflow.com/questions/47749906/rocketmq-throw-exception-timeout-clean-queuebroker-busy-start-flow-control-f

https://www.cnblogs.com/cs99lzzs/p/9181555.html

想到不知道在哪看的的一句話,在stackoverflow上能找到和你一樣的問題,那問題已經解決了百分之90了。這他喵的真實至理名言啊。

==============吐槽完=================

又經過大量測試驗證:

解決方案:

修改rocketmq配置文件:

方案一:sendMessageThreadPoolNums 改成 1 ,沒有的話新增一行。

  sendMessageThreadPoolNums=1

方案二(推薦):useReentrantLockWhenPutMessage改成true,沒有的話新增一行。

  sendMessageThreadPoolNums=32

  useReentrantLockWhenPutMessage=true

說明:

  sendMessageThreadPoolNums這個屬性是發送線程池大小, rocketmq4.1版本之后默認為 1,之前版本默認什么不知道但是肯定大于1。這個屬性改成1的話,就不用管useReentrantLockWhenPutMessage這個屬性了;

  如果改成大于1,就需要將useReentrantLockWhenPutMessage這個屬性設置為 true;

  目前測試 未發現這兩個方案有什么區別,sendMessageThreadPoolNums=1 時也支持多線程發送,發送速度感覺和?sendMessageThreadPoolNums大于1沒有區別,都能跑滿100M的網卡。

  感覺如果useReentrantLockWhenPutMessage=true的時候,就是打開鎖(屬性名翻譯一下也大概是這個意思),然后關鍵代碼其實還是單線程處理;

  有閑功夫的話去翻翻源碼看看去。

  最后 我是選擇的方案二,畢竟看著好看點。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/164754.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/164754.shtml
英文地址,請注明出處:http://en.pswp.cn/news/164754.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Using PeopleCode in Application Engine Programs在應用引擎程序中使用PeopleCode

This section provides an overview of PeopleCode and Application Engine programs and discusses how to: 本節概述了PeopleCode和應用程序引擎程序,并討論了如何: Decide when to use PeopleCode.決定何時使用PeopleCode。Consider the program environment.考…

Java之《ATM自動取款機》(面向對象)

《JAVA編程基礎》項目說明 一、項目名稱: 基于JAVA控制臺版本銀行自動取款機 項目要求: 實現銀行自動取款機的以下基本操作功能:讀卡、取款、查詢。(自動取款機中轉賬、修改密碼不作要求) 具體要求: 讀卡…

基于SSM的校園奶茶點單管理系統

基于SSM的校園奶茶點單管理系統的設計與實現~ 開發語言:Java數據庫:MySQL技術:SpringMyBatisSpringMVC工具:IDEA/Ecilpse、Navicat、Maven 系統展示 主頁 奶茶列表 登錄界面 管理員界面 用戶界面 摘要 隨著社會的發展和科技的進…

ubuntu搭建phpmyadmin+wordpress

Ubuntu搭建phpmyadmin wordpress Linux系統設置:Ubuntu 22配置apache2搭建phpmyadmin配置Nginx環境,搭建wordpress Linux系統設置:Ubuntu 22 配置apache2 安裝apache2 sudo apt -y install apache2設置端口號為8080 sudo vim /etc/apache…

paddle detection 訓練參數

#####################################基礎配置##################################### # 檢測算法使用YOLOv3,backbone使用MobileNet_v1,數據集使用roadsign_voc的配置文件模板,本配置文件默認使用單卡,單卡的batch_size=1 # 檢測模型的名稱 architecture: YOLOv3 # 根據…

【CCF-PTA】第03屆Scratch第05題 -- 統計出現次數最多的字

統計出現次數最多的字 【題目描述】 我國自古流傳下來不少膾炙人口的詩歌,各具特色,別具一格。有些詩只用寥寥幾個字,就能描繪出生動的意境。 請找出以下詩篇中出現次數最多的字,如果有多個字出現次數相同,則答案為…

Java中基于SSM框架的數據保存方法與日期處理

? 一、詳解 在SSM框架中,保存數據通常涉及到服務層和數據訪問層。服務層處理業務邏輯,而數據訪問層負責與數據庫進行交互。 二、代碼 Override public void save(Student student) { Date date new Date(); SimpleDateFormat format new Sim…

什么是LLC電路?

LLC電路是由2個電感和1個電容構成的諧振電路,故稱之為LLC; LLC電路主要由三個元件組成:兩個電感分別為變壓器一次側漏感(Lr)和勵磁電感(Lm),電容為變壓器一次側諧振電容(Cr)。這些元件構成了一個諧振回路,其中輸入電感…

【C/PTA】函數專項練習(四)

本文結合PTA專項練習帶領讀者掌握函數,刷題為主注釋為輔,在代碼中理解思路,其它不做過多敘述。 目錄 6-1 計算A[n]1/(1 A[n-1])6-2 遞歸實現順序輸出整數6-3 自然數的位數(遞歸版)6-4 分治法求解金塊問題6-5 漢諾塔6-6 重復顯示字符(遞歸版)…

字母異位詞分組

給你一個字符串數組,請你將 字母異位詞 組合在一起。可以按任意順序返回結果列表。 字母異位詞 是由重新排列源單詞的所有字母得到的一個新單詞。 示例 1: 輸入: strs [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”] 輸出: [[“bat”],[“nat”,“tan…

Android MemoryFile 共享內存

應用場景: 跨進程傳輸大數據,如文件、圖片等; 技術選型: 共享內存–MemoryFile; 優點: 1. 共享內存沒有傳輸大小限制,所以和應用總的分配內存一樣(512MB)&#xff1…

Java 根據文件名獲取文件類型

比如文件名是“測試文件.png”,則獲取的文件類型就是 png 直接上一個通用的方法,拿去直接就能用。 // 比如入參文件名是“測試文件.png”,則出參就是 pngprivate String getFileSuffix(String fileName) {String[] fileStr fileName.split(&…

educoder中共享單車之數據可視化

第1關:繪制地圖 <%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%> <html> <head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&…

專用設備上的SD卡插入電腦想讀取數據,提示要格式化?

環境&#xff1a; Win10 專業版 車載感應數據專用SD卡 問題描述&#xff1a; 專用設備上的SD&#xff0c;現在把SD卡從設備取出&#xff0c;用讀卡器插入電腦提示要格式化&#xff1f; 解決方案&#xff1a; 1.先進入PE查看SD分區情況&#xff0c;SD格式為ext4 查看文件…

lombok中使用@Builder構造器模式時的默認值問題

這里寫自定義目錄標題 問題case原因解決方案 文章參考來源&#xff1a;https://chenyongjun.vip/articles/107 問題case Lombok 使用廣泛&#xff0c;這里分享一個 Lombok Builder 小 case&#xff0c;今天自己踩了坑。 Data Builder public class User {private String name…

MLP 有哪些可學習的參數

多層感知機&#xff08;MLP&#xff09;的參數是需要在訓練過程中學習的。MLP是一種前饋神經網絡&#xff0c;其結構包括輸入層、多個隱藏層和輸出層。在訓練過程中&#xff0c;MLP通過反向傳播算法來調整網絡的權重&#xff0c;以最小化預測值與實際值之間的誤差。 MLP的學習…

安卓開發——Android Studio常見報錯與解決方法

1. No toolchains found in the NDK toolchains folder for ABI with prefix: arm-linux-android 這個錯誤是由于較新版本的NDK的./toolchains目錄中沒有arm-linux-androideabi文件&#xff0c;解決辦法是從舊的NDK版本里面復制到自己的NDK的版本里面&#xff0c;就可以了。 打…

WSL登錄時提示nsenter: cannot open /proc/320/ns/time: No such file or directory的解決辦法

在登錄 WSL 的 Ubuntu 時&#xff0c;不僅要求 root 權限&#xff0c;還登錄失敗&#xff0c;提示“nsenter: cannot open /proc/320/ns/time: No such file or directory”。 解決辦法是在 powershell 中執行 “wsl – sudo vi /etc/profile”命令&#xff0c;刪除文件內容&a…

JavaWeb——感謝尚硅谷官方文檔

JavaWeb——感謝尚硅谷官方文檔 XML一、xml簡介二、xml的語法1、文檔申明2、xml注釋3、xml元素4、xml屬性5、xml語法規則 三、xml解析技術1、使用dom4j解析xml Tomcat一、JavaWeb的概念二、web資源的分類三、常見的web服務器四、Tomcat的使用1、安裝2、Tomcat的目錄介紹3 啟動T…

初識Java 18-3 泛型

目錄 邊界 通配符 編譯器的能力范疇 逆變性 無界通配符 捕獲轉換 本筆記參考自&#xff1a; 《On Java 中文版》 邊界 在泛型中&#xff0c;邊界的作用是&#xff1a;在參數類型上增加限制。這么做可以強制執行應用泛型的類型規則&#xff0c;但還有一個更重要的潛在效果…