天天看點

JAVA應用開發MQ實戰最佳實踐——Series2:消息隊列RocketMQ性能測試案例

往期内容

JAVA應用開發MQ實戰最佳實踐——Series1:RocketMQ綜述及代碼設計
JAVA應用開發MQ實戰最佳實踐——Series2:消息隊列RocketMQ性能測試案例

1. 消息隊列RocketMQ性能測試案例

1.1 RocketMQ測試分析

客戶場景,資訊共享交換平台:

1.交換平台需支援每秒萬級别資料傳輸

2.實作跨路段、跨部門、跨行業、跨區域資訊即時共享,做到高可靠、低延遲

JAVA應用開發MQ實戰最佳實踐——Series2:消息隊列RocketMQ性能測試案例

客戶現場展示場景設計思路:

1.針對性的編寫一套JAVA代碼來支撐本次MQ性能POC驗證。

2.選擇合适規格的單台ECS,在單個TOPIC下運作多線程代碼實作和MQ的訂閱發送,統計1分鐘内訂閱和發送的資料交換TPS情況。

3.考慮POC也要符合客戶實際生産場景中MQ使用邏輯,ECS應運作4個獨立的JAR包,兩對JAR包交叉經過MQ進行資料交換。

4.消息體内的内容應列印到螢幕,通過消息軌迹驗證消息的被消費情況。

5.驗證結果:客戶指定場景下8線程異步,1分鐘TPS在10K以上。

1.2 建立資源

本章節較長的描述如何建立消息隊列 RocketMQ 版的資源。

1.2.1 建立RocketMQ執行個體

1.登入Apsara Stack控制台。

2.在左側導航欄中單擊中間件産品 > 消息隊列通路管理控制台界面。

JAVA應用開發MQ實戰最佳實踐——Series2:消息隊列RocketMQ性能測試案例

3.在消息隊列頁面,選擇區域與部門後,單擊MQ,進入MQ控制台。

JAVA應用開發MQ實戰最佳實踐——Series2:消息隊列RocketMQ性能測試案例

4.單擊左側導航欄概覽後,在概覽頁面中,單擊建立執行個體。

5.在建立執行個體對話框,選擇執行個體類型,并輸入執行個體名和描述,然後單擊确認。

JAVA應用開發MQ實戰最佳實踐——Series2:消息隊列RocketMQ性能測試案例

說明: 建立完執行個體後,單擊左側導航欄執行個體詳情,可以檢視建立執行個體的Topic數上限、消息發送TPS上限、消息訂閱TPS上限和TCP協定接入位址等。

1.2.2 建立 Topic

Topic 是消息隊列 RocketMQ 版裡對消息的一級歸類,例如可以建立 Topic_Trade 這一 Topic 來識别交易類消息,消息生産者将消息發送到 Topic_Trade,而消息消費者則通過訂閱該 Topic 來擷取和消費消息。

建立Topic要注意一下幾點:

  • Topic 不能跨執行個體使用,例如在執行個體 A 中建立的 Topic A 不能在執行個體 B 中使用。
  • Topic 名稱必須在同一執行個體中是唯一的。
  • 您可建立不同的 Topic 來發送不同類型的消息,例如用 Topic A 發送普通消息,Topic B 發送事務消息,Topic C 發送定時/延時消息。

1.在控制台左側導航欄,單擊 Topic 管理。

2.在 Topic 管理頁面上方選擇剛建立的執行個體,單擊建立 Topic 按鈕。

JAVA應用開發MQ實戰最佳實踐——Series2:消息隊列RocketMQ性能測試案例

3.在建立 Topic 對話框中的 Topic 一欄,輸入 Topic 名稱,選擇該 Topic 對應的消息類型,輸入該 Topic 的備注内容,然後單擊确定。

1.2.3 建立 Group ID

建立完執行個體和 Topic 後,您需要為消息的消費者(或生産者)建立用戶端 ID ,即 Group ID 作為辨別。

  • Group ID 必須在同一執行個體中是唯一的。
  • Group ID 和 Topic 的關系是 N:N,即一個消費者可以訂閱多個 Topic,同一個 Topic 也可以被多個消費者訂閱;一個生産者可以向多個 Topic 發送消息,同一個 Topic 也可以接收來自多個生産者的消息。

1.在控制台左側導航欄,單擊 Group 管理。

2.在 Group 管理頁面上方選擇剛建立的執行個體,然後選擇TCP協定 > 建立Group ID 。本文以 TCP 協定為例。

JAVA應用開發MQ實戰最佳實踐——Series2:消息隊列RocketMQ性能測試案例

3.在建立 Group ID 對話框中,輸入 Group ID 和描述,然後單擊确認。

1.3 場景落地

1.準備p1,c1,p2,c2雙發送雙訂閱應用小程式,p1、p2小程式參考“第二章節”生産者異步發送消息代碼,c1、c2小程式參考“第二章節”消費者叢集訂閱消息代碼

p1-8081.jar

c1-8083.jar

p2-8082.jar

c2-8084.jar

2.通過Xshell連接配接到專有雲ops1環境,把準備的4個jar包上傳至一台16c32gECS伺服器上

JAVA應用開發MQ實戰最佳實踐——Series2:消息隊列RocketMQ性能測試案例

3.同時在該目錄下編寫啟動4個jar包的start.sh腳本:

#!/bin/bash

nohup java -jar p1-8081.jar &

nohup java -jar p2-8081.jar &

nohup java -jar c1-8081.jar &

nohup java -jar c2-8081.jar &

4.編寫停用4個jar包的stop.sh腳本:

JAVA應用開發MQ實戰最佳實踐——Series2:消息隊列RocketMQ性能測試案例

5.編寫請求消息隊列2個發送和2個訂閱接口的curl腳本:

#!/bin/bash

curl http://192.168.0.150:8081/echo-sync-final-send

curl http://192.168.0.150:8082/echo-sync-final-send

curl http://192.168.0.150:8083/echo-final-mq

curl http://192.168.0.150:8084/echo-final-mq

6../start.sh執行啟動4個jar包,通過tail -f nohup.out檢視啟動日志,每個jar包啟動完成日志如下:

JAVA應用開發MQ實戰最佳實踐——Series2:消息隊列RocketMQ性能測試案例

7.通過ps -ef | grep jar确認4個jar是否在ECS伺服器運作,有如下圖則表示4個應用小程式運作正常:

JAVA應用開發MQ實戰最佳實踐——Series2:消息隊列RocketMQ性能測試案例

8../curl.sh執行請求2個消息發送和2個消息訂閱接口,請求之後我們檢視一下程式背景日志發現代碼列印的消息發送和消息訂閱的日志不停的在刷,截取單條消息發送日志如下:

JAVA應用開發MQ實戰最佳實踐——Series2:消息隊列RocketMQ性能測試案例

截取單條消息訂閱日志如下:

JAVA應用開發MQ實戰最佳實踐——Series2:消息隊列RocketMQ性能測試案例

1.4 消息查詢

如遇消息消費有問題,則可通過查詢具體發送的消息内容來排查問題。消息隊列 RocketMQ 版提供了三種消息查詢的方式,分别是按 Message ID、Message Key 以及 Topic 查詢。

1.4.1 查詢方式說明

三種查詢方式的特點和對比如下表所述。

表1:查詢方式對比

JAVA應用開發MQ實戰最佳實踐——Series2:消息隊列RocketMQ性能測試案例
1.4.2 推薦查詢過程

推薦按照以下流程查詢消息。

JAVA應用開發MQ實戰最佳實踐——Series2:消息隊列RocketMQ性能測試案例
1.4.3 查詢步驟

1.登入MQ控制台。

2.在左側導航欄,單擊消息軌迹。

3.在消息軌迹頁面,您可單擊以下任一頁簽,然後按頁面提示輸入相應資訊,再單擊搜尋按鈕來查詢消息。

  • 按 Message ID 查詢

按 Message ID 查詢消息屬于精确查詢,您輸入 Topic 和 Message ID 即可精确查詢到任意一條消息。是以,為了盡可能精确地查詢,建議在發送消息成功後将 Message ID 資訊列印到日志中,友善問題排查。

JAVA應用開發MQ實戰最佳實踐——Series2:消息隊列RocketMQ性能測試案例
  • 按 Message Key 查詢

消息隊列 RocketMQ 版根據您設定的 Message Key 建立消息的索引資訊,當您輸入 Key 進行查詢時,消息隊列 RocketMQ 版根據該索引即可比對相關的消息傳回。

JAVA應用開發MQ實戰最佳實踐——Series2:消息隊列RocketMQ性能測試案例
  • 按 Topic 查詢

按 Topic 查詢一般用在 Message ID 和 Message Key 都無法獲得的情況下,根據 Topic 和消息的發送時間範圍,批量擷取該時間範圍内的所有消息,然後再找到關心的資料。

JAVA應用開發MQ實戰最佳實踐——Series2:消息隊列RocketMQ性能測試案例

4.在操作欄中單擊消息詳情,可檢視到軌迹的簡要資訊,主要是消息本身的屬性以及接收狀态的資訊。

JAVA應用開發MQ實戰最佳實踐——Series2:消息隊列RocketMQ性能測試案例

5.在展開的區域中,單擊檢視軌迹即可檢視完整的鍊路圖。下圖示例為在 TCP 協定下,按 Message ID 查詢普通消息的軌迹。

JAVA應用開發MQ實戰最佳實踐——Series2:消息隊列RocketMQ性能測試案例

對于 Message Key 和 Topic 查詢方式,如果比對到多條軌迹,可以進行上下翻頁,檢視比對軌迹資料。

1.4.4 查詢結果說明

您可以在控制台的消息查詢頁面看到查詢到的消息。直接顯示的資訊包含 Message ID、Tag、Key 和存儲時間。此外,您還可以在每一行消息操作列下載下傳消息内容、查詢資訊軌迹以及檢視消息詳情。

投遞狀态是消息隊列 RocketMQ 版根據各個 Group ID 的消費進度計算出的結果,投遞狀态的資訊如下表所示。

表 2: 消息投遞狀态

JAVA應用開發MQ實戰最佳實踐——Series2:消息隊列RocketMQ性能測試案例
1.4.5 消費驗證

消息隊列 RocketMQ 版提供了消費驗證功能,該功能可以将指定消息推送給指定的線上用戶端,以檢測用戶端消費該消息的邏輯和結果是否符合預期。

說明: 消費驗證功能僅僅是用于驗證用戶端的消費邏輯是否正常,并不會影響正常的收消息流程,是以消息的消費狀态等資訊在消費驗證後并不會改變。

1.5 檢視消息生産資料

可供檢視的消息生産資料是某個Topic在一個時間段内從Broker接收的消息的總量或者TPS。

2.在左側導航欄,單擊資源報表。

3.在資源報表頁面,單擊消息生産頁簽。

4.在Topic一欄,選擇Topic,并指定其他資訊,然後單擊搜尋。

字段說明:

  • 采集類型:分為總量和TPS。總量提供該周期内Topic接收的消息總量;TPS提供每個周期内該Topic接收消息的平均TPS。
  • 采集周期:包括1分鐘、10分鐘後、30分鐘、1小時。采集周期決定了資料采集的時間間隔,周期越短,采集點越密集,消息消費資料越詳細。
  • 時間範圍:RocketMQ最多可以提供最近三天之内的消息的生産查詢。

查詢結果以圖表的形式顯示

JAVA應用開發MQ實戰最佳實踐——Series2:消息隊列RocketMQ性能測試案例
JAVA應用開發MQ實戰最佳實踐——Series2:消息隊列RocketMQ性能測試案例

1.6 檢視消息消費資料

可供檢視的消息消費資料是某個Topic在一個時間段内投遞給某個Group ID的消息的總量或TPS。

具體操作步驟如下:

3.在資源報表頁面,單擊消息消費頁簽。

4.在Group ID和Topic欄,分别選擇您要查詢的Group ID和Topic。

5.指定其他資訊,然後單擊搜尋。

  • 采集類型:分為總量和TPS。總量提供每個周期内該Topic投遞給該Group ID的消息總量,TPS提供每個周期内該Topic投遞給該Group ID消息的平均TPS。
  • 時間範圍:RocketMQ最多可以提供最近三天之内的消息的消費查詢。
JAVA應用開發MQ實戰最佳實踐——Series2:消息隊列RocketMQ性能測試案例
JAVA應用開發MQ實戰最佳實踐——Series2:消息隊列RocketMQ性能測試案例

我們是阿裡雲智能全球技術服務-SRE團隊,我們緻力成為一個以技術為基礎、面向服務、保障業務系統高可用的工程師團隊;提供專業、體系化的SRE服務,幫助廣大客戶更好地使用雲、基于雲建構更加穩定可靠的業務系統,提升業務穩定性。我們期望能夠分享更多幫助企業客戶上雲、用好雲,讓客戶雲上業務運作更加穩定可靠的技術,您可用釘釘掃描下方二維碼,加入阿裡雲SRE技術學院釘釘圈子,和更多雲上人交流關于雲平台的那些事。

JAVA應用開發MQ實戰最佳實踐——Series2:消息隊列RocketMQ性能測試案例