如何實現MQ佇列訊息監控
1. 前言
訊息佇列技術是分散式應用間交換資訊的一種技術。訊息佇列可駐留在記憶體或磁碟上,佇列儲存訊息直到它們被應用程式讀走。透過訊息佇列,應用程式可獨立地執行--它們不需要知道彼此的位置、或在繼續執行前不需要等待接收程式接收此訊息。那我們又如何去監控應用程式給MQ傳送的訊息量了,又如何去實時掌握佇列訊息的處理能力和佇列深度是否有積壓情況,MQ佇列訊息監控一直是運維人員和開發人員頭痛的一件事情,無法實時去了解MQ佇列深度情況和訊息處理的交易量。筆者針對MQ V7.0版本如何去監控某個佇列的訊息量,做了一些研究。
為了能監控MQ某個佇列的訊息量,翻閱了很多官方文件沒明確的監控方案,官方文件只提供透過修改MQ管理器的qmgr值和本地佇列的STATQ的屬性啟用能做到訊息監控。然後可以對其某個本地佇列訊息進行跟蹤監控。透過監測佇列訊息結果的Getout的值可以計算出每秒處理的訊息量。
2. 開啟qmgr和queue訊息監控屬性
監控訊息佇列時需要提前開啟以下三個屬性才能進實時監控訊息。否則訊息佇列是無法進行實時監控。
ALTER QMGR STATQ(ON) ALTER QLOCAL(GD_JF_RT_01.LQ) STATQ(ON) ALTER QMGR STATINT(120) ==》設定訊息生成的時間引數,此引數在監控的時候會有時延2分鐘 |
3. MQ狀態檢查
檢查訊息佇列引數是否正常開啟監控
dis qmgr STATQ dis ql(GD_JF_RT_01.LQ) STATQ Dis QMGR STATINT |
4. 模擬收發訊息指令
如把GD_JF_RT_01.LQ這個佇列當作是應用程式的本地接收佇列,現在我們用amqsput指令來模擬傳送訊息給應用程式。用amqsget指令模擬從應用程式本地佇列提取訊息。
/opt/mqm/bin/amqsput GD_JF_RT_01.LQ QM.TEST Hello mq! /opt/mqm/bin/amqsget GD_JF_RT_01.LQ QM.TEST Hello mq! |
5. 訊息監控場景測試
接下來我們針對訊息佇列監控做以下4個場景測試,測試時間在11.19.33-11.25.33之間透過amqsmon命令輸出這6分鐘內,應用程式向本地佇列GD_JF_RT_01.LQ傳送訊息,模擬應用程式正常從本地佇列GD_JF_RT_01.LQ成功提取訊息。
場景1:測試時間11:20:30 傳送3條訊息 2014年 07月 15日 星期二 11:20:30 CST mqm@weblogic232:~> /opt/mqm/samp/bin/amqsput GD_JF_RT_01.LQ QM.TEST Sample AMQSPUT0 start target queue is GD_JF_RT_01.LQ 1 1 Sample AMQSPUT0 end
mqm@weblogic232:~> /opt/mqm/samp/bin/amqsput GD_JF_RT_01.LQ QM.TEST Sample AMQSPUT0 start target queue is GD_JF_RT_01.LQ 1 Sample AMQSPUT0 end
dis QUEUE(GD_JF_RT_01.LQ) CURDEPTH 105 : dis QUEUE(GD_JF_RT_01.LQ) CURDEPTH AMQ8409: 顯示佇列細節。 QUEUE(GD_JF_RT_01.LQ) TYPE(QLOCAL) CURDEPTH(3) 《==== 看到當前深度為3,存在3條訊息
------------------------------------------------------------------------------- 2014年 07月 15日 星期二 11:21:50 CST 場景2:測試時間:11:21:50 提取3訊息 mqm@weblogic232:~> /opt/mqm/samp/bin/amqsget GD_JF_RT_01.LQ QM.TEST Sample AMQSGET0 start message <1> message <1> message <1> no more messages Sample AMQSGET0 end
dis QUEUE(GD_JF_RT_01.LQ) CURDEPTH 108 : dis QUEUE(GD_JF_RT_01.LQ) CURDEPTH AMQ8409: 顯示佇列細節。 QUEUE(GD_JF_RT_01.LQ) TYPE(QLOCAL) CURDEPTH(0) 《==== 看到當前深度為0,說明訊息已經被取走
----------------------------------------------------------------------------- 場景3:測試時間:11:23:00 再次傳送3條訊息 2014年 07月 15日 星期二 11:23:00 CST mqm@weblogic232:~> /opt/mqm/samp/bin/amqsput GD_JF_RT_01.LQ QM.TEST Sample AMQSPUT0 start target queue is GD_JF_RT_01.LQ 1 Sample AMQSPUT0 end mqm@weblogic232:~> /opt/mqm/samp/bin/amqsput GD_JF_RT_01.LQ QM.TEST Sample AMQSPUT0 start target queue is GD_JF_RT_01.LQ 1 Sample AMQSPUT0 end mqm@weblogic232:~> /opt/mqm/samp/bin/amqsput GD_JF_RT_01.LQ QM.TEST Sample AMQSPUT0 start target queue is GD_JF_RT_01.LQ 1 Sample AMQSPUT0 end
dis QUEUE(GD_JF_RT_01.LQ) CURDEPTH 109 : dis QUEUE(GD_JF_RT_01.LQ) CURDEPTH AMQ8409: 顯示佇列細節。 QUEUE(GD_JF_RT_01.LQ) TYPE(QLOCAL) CURDEPTH(3) 《==== 看到當前深度為3,存在3條訊息
------------------------------------------------------------------------------- 2014年 07月 15日 星期二 11:24:24 CST 場景4:測試時間:11:24:24 再次傳送5條訊息 mqm@weblogic232:~> /opt/mqm/samp/bin/amqsput GD_JF_RT_01.LQ QM.TEST Sample AMQSPUT0 start target queue is GD_JF_RT_01.LQ ` Sample AMQSPUT0 end mqm@weblogic232:~> /opt/mqm/samp/bin/amqsput GD_JF_RT_01.LQ QM.TEST Sample AMQSPUT0 start target queue is GD_JF_RT_01.LQ 1 Sample AMQSPUT0 end mqm@weblogic232:~> /opt/mqm/samp/bin/amqsput GD_JF_RT_01.LQ QM.TEST Sample AMQSPUT0 start target queue is GD_JF_RT_01.LQ 2 Sample AMQSPUT0 end mqm@weblogic232:~> /opt/mqm/samp/bin/amqsput GD_JF_RT_01.LQ QM.TEST Sample AMQSPUT0 start target queue is GD_JF_RT_01.LQ 3 Sample AMQSPUT0 end mqm@weblogic232:~> /opt/mqm/samp/bin/amqsput GD_JF_RT_01.LQ QM.TEST Sample AMQSPUT0 start target queue is GD_JF_RT_01.LQ 4 Sample AMQSPUT0 end dis QUEUE(GD_JF_RT_01.LQ) CURDEPTH 110 : dis QUEUE(GD_JF_RT_01.LQ) CURDEPTH AMQ8409: 顯示佇列細節。 QUEUE(GD_JF_RT_01.LQ) TYPE(QLOCAL) CURDEPTH(8) 《==== 此時看到當前深度為8,場景3傳送了3條,場景4發了5條 |
總共4個場景傳送了共 11 條訊息,訊息被取走了3條,接下來用監控指令碼檢視是否跟以上場景吻合。
1 、總髮送訊息統計 mqm@weblogic232:~> /opt/mqm/samp/bin/amqsmon -m QM.TEST -t statistics -q GD_JF_RT_01.LQ -b -s "2014-07-15 11.19.00" -e "2014-07-15 11.26.00" |grep 'PutCount'|awk '{print $3}'|awk -F ']' '{print $1}'| xargs | tr ' ' '+' | bc 11
統計結果也是11條
2 、取走佇列訊息統計 mqm@weblogic232:~> /opt/mqm/samp/bin/amqsmon -m QM.TEST -t statistics -q GD_JF_RT_01.LQ -b -s "2014-07-15 11.19.00" -e "2014-07-15 11.26.00" |grep 'GetCount'|awk '{print $3}'|awk -F ']' '{print $1}'| xargs | tr ' ' '+' | bc 3
統計結果也是3條 |
6. 結論
1、透過以上研究測試最終得出結論,透過開啟MQ管理器的qmgr值屬性和本地佇列的STATQ屬性,是可以實時監控mq本地佇列訊息的交易量,也能實時掌握訊息處理情況。 著重點關注這幾個引數值 PutCount、GetCount、QMaxDepth、QMinDepth。
2、諮詢過IBM原廠關於訊息量統計收集開啟qmgr和queue的STATQ屬性,會消耗一定的CPU和記憶體資源。具體消耗多少資源。需要根據業務量,MQ的佇列數量以及機器的負載情況有關。要想監控MQ佇列 訊息交易量還是需要發費一定的代價換取的 。
3、以下是統計6分鐘內的總訊息量。
MSGCOUNT=
/opt/mqm/samp/bin/amqsmon -m QM.TEST -t statistics -q GD_JF_RT_01.LQ -b -s "2014-07-15 11.19.33"-e "2014-07-15 11.25.33" |grep 'GetCount'|awk '{print $3}'|awk -F ']''{print $1}'| xargs | tr ' ' '+' | bc
MQ 交易量演算法:
MQTPS (交易量)= MSGCOUNT (訊息總量)
MQTIME (訊息收集時間)*60 秒
7. 參考資料
1、開啟統計後的效能影響
www-01.ibm.com/support/docview.wss?uid=swg27022497&aid=1
2、MQ提供了一個statistics 統計的方法:
3、amqsmon examples:
有需要的朋友可以關注我的公眾號,文章每日一更
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28833846/viewspace-2723368/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 訊息佇列(MQ)佇列MQ
- MQ訊息佇列_RabbitMQMQ佇列
- 訊息佇列mq總結佇列MQ
- MQ 訊息佇列 比較MQ佇列
- Spring Boot:使用Rabbit MQ訊息佇列Spring BootMQ佇列
- 【MQ】java 從零開始實現訊息佇列 mq-02-如何實現生產者呼叫消費者?MQJava佇列
- 手擼MQ訊息佇列——迴圈陣列MQ佇列陣列
- Redis實現訊息佇列Redis佇列
- 消費端如何保證訊息佇列MQ的有序消費佇列MQ
- 該如何進行架構設計一個MQ訊息佇列?架構MQ佇列
- 使用Spring Boot實現訊息佇列Spring Boot佇列
- python多執行緒中訊息佇列如何實現?Python執行緒佇列
- Redis 竟然能用 List 實現訊息佇列Redis佇列
- 手把手教你用redis實現一個簡單的mq訊息佇列(java)RedisMQ佇列Java
- 訊息佇列系列一:訊息佇列應用佇列
- Redis 學習筆記(六)Redis 如何實現訊息佇列Redis筆記佇列
- 訊息佇列MQ最全詳解(萬字圖文總結)佇列MQ
- 訊息佇列MQ應用場景及主流框架對比佇列MQ框架
- 訊息佇列佇列
- Go中使用Redis實現訊息佇列教程GoRedis佇列
- 關於MQ的幾件小事(二)如何保證訊息佇列的高可用MQ佇列
- 主流的訊息佇列MQ比較,詳解MQ的4類應用場景佇列MQ
- PHP基於Redis訊息佇列實現的訊息推送的方法PHPRedis佇列
- Redis 使用 List 實現訊息佇列能保證訊息可靠麼?Redis佇列
- 詳解RPC遠端呼叫和訊息佇列MQ的區別RPC佇列MQ
- MQ 訊息佇列的解耦、介面非同步處理、削峰MQ佇列解耦非同步
- 訊息佇列MQ核心原理全面總結(11大必會原理)佇列MQ
- MQ系列8:資料儲存,訊息佇列的高可用保障MQ佇列
- 用訊息佇列和socket實現聊天系統佇列
- RabbitMQ 訊息佇列之佇列模型MQ佇列模型
- kafka 訊息佇列Kafka佇列
- [Redis]訊息佇列Redis佇列
- [訊息佇列]rocketMQ佇列MQ
- [訊息佇列]RabbitMQ佇列MQ
- Kafka訊息佇列Kafka佇列
- RabbitMQ訊息佇列MQ佇列
- 關於MQ的幾件小事(六)訊息積壓在訊息佇列裡怎麼辦MQ佇列
- 如何設計一個訊息佇列?佇列