PHP如何取得ActiveMQ的狀態
在測試ActiveMQ過程中,發現發生下面狀況時,ActiveMQ可能就會出現異常的狀況
根據測試的經驗,這個數字依舊和機器等級有差。當procedure往queue塞資料的速度大於consumer消化速度,讓queue內的資料筆數一直累積上去。會導致consumer處理速度越來越慢、惡性循環下去。其實,procedure的處理能力,也會越來越差。
如果queue繼續累積下去,會出現無法連到ActiveMQ。甚至WEB管理介面也失效、最後要重新啟動ActiveMQ。最慘的狀況是,當重新啟動後,還要將剛剛的queue刪除,才能恢復正常。
也曾遇過一個狀況,ActiveMQ的主機,最後因stock吃完而無法服務。
因此,需要監控ActiveMQ的狀況。或者,在procedure中檢查queue內的數量,作為後續處理的依據。(當然,還是要看怎麼規劃、運用ActiveMQ)
如何以PHP+STOMP取得ActiveMQ的資訊呢?
最後,簡單的php code,如下
- 當queue內累積過多的筆數
- 當queue內累積太多的資料內容
根據測試的經驗,這個數字依舊和機器等級有差。當procedure往queue塞資料的速度大於consumer消化速度,讓queue內的資料筆數一直累積上去。會導致consumer處理速度越來越慢、惡性循環下去。其實,procedure的處理能力,也會越來越差。
如果queue繼續累積下去,會出現無法連到ActiveMQ。甚至WEB管理介面也失效、最後要重新啟動ActiveMQ。最慘的狀況是,當重新啟動後,還要將剛剛的queue刪除,才能恢復正常。
也曾遇過一個狀況,ActiveMQ的主機,最後因stock吃完而無法服務。
因此,需要監控ActiveMQ的狀況。或者,在procedure中檢查queue內的數量,作為後續處理的依據。(當然,還是要看怎麼規劃、運用ActiveMQ)
如何以PHP+STOMP取得ActiveMQ的資訊呢?
- 開啟ActiveMQ的statistics plugin。作法請參考Apache ActiveMQ -- StatisticsPlugin
- 訂閱ActiveMQ.Statistics.Destination.< destination-name >(或ActiveMQ.Statistics.Destination.< wildcard-expression >),並送出空字串
- 如果照上述官方文件實作,會有問題。因為裡面的範例是JMS。STOMP所使用的header名稱和JMS的不同,依據Stomp extensions for JMS message semantics內所述。需將JMSReplyTo改為reply-to。
- 最後,還要將MapMessage改成JSON格式。讓PHP能處理
最後,簡單的php code,如下
- function getMQStatus($queue) {
- $result = $num = FALSE;
- $statusqueue = "/queue/ActiveMQ.Statistics.Destination.{$queue}";
- //開啟ActiveMQ
- $link = openMQ();
- if (FALSE !== $link) {
- //查詢之後的結果存放處
- $resultqueue = "/queue/test-status_{$queue}";
- //設定採用JSON格式
- stomp_subscribe($link, $resultqueue, array( "transformation" => "jms-map-json"));
- //送出空字串
- $result = stomp_send($link, $statusqueue, '', array("reply-to" => $resultqueue));
- if (FALSE === $result) {
- echo " send error~" . PHP_EOL;
- }
- //取得狀態
- while (stomp_has_frame($link)) {
- $frame = stomp_read_frame($link);
- if (FALSE != $frame) {
- stomp_ack($link, $frame['headers']['message-id']);
- $obj = json_decode($frame['body'], TRUE);
- //取得目前數量(尚可取得其他狀態)
- foreach ($obj['map'][0]['entry'] as $pitem) {
- if ('size' == $pitem['string']) {
- $num = $pitem['long'];
- break;
- }
- }
- } else {
- //break;
- }
- }
- stomp_unsubscribe($link, $resultqueue);
- stomp_close($link);
- }
- return $num;
- }
參考資料
- Apache ActiveMQ -- StatisticsPlugin
- Stomp extensions for JMS message semantics
- stomp 1.1和stomp 1.0的差異
- ActiveMQ參考書籍-ActiveMQ in Action
- php使用stomp操作ActiveMQ
- stomp進階說明-prefetchSize、ack header
- stomp failover作法
- PHP如何取得ActiveMQ的狀態
留言