如何使用Docker內(nèi)的Kafka服務?消息服務測試實踐篇
背景及系統(tǒng)簡介:
Kafka是一種高吞吐量的分布式架構(gòu)的發(fā)布訂閱消息系統(tǒng),它可以處理消費者在網(wǎng)站中的所有動作流數(shù)據(jù)。通常由于高吞吐量的要求而選擇通過處理日志數(shù)據(jù)和日志聚合來解決。
本文涉及的分布式系統(tǒng)(簡稱C系統(tǒng))已初具規(guī)模,而隨著系統(tǒng)建設(shè)的建設(shè)推進和功能的逐步完善,外圍系統(tǒng)對C系統(tǒng)的日志消費需求逐步增加。為了滿足日志消費需求,決定在C系統(tǒng)的網(wǎng)關(guān)系統(tǒng)中增加日志發(fā)送功能實現(xiàn)對外消息的發(fā)送。
C系統(tǒng)的網(wǎng)關(guān)系統(tǒng)主要負責分布式系統(tǒng)的接入驗證,對接受請求進行必要的合法性、安全性等內(nèi)容的校驗。將消息發(fā)送功能放到網(wǎng)關(guān)系統(tǒng)中主要有2方面考慮:
- 網(wǎng)關(guān)系統(tǒng)日志記錄了上送請求的原始信息,能夠完整描述交易請求發(fā)生的場景及請求內(nèi)容;
- 便于制定統(tǒng)一的消息報文格式和規(guī)范,避免多系統(tǒng)發(fā)送消息時標準不一致,給后續(xù)的消息消費帶來困難。
聯(lián)機消息發(fā)送測試
網(wǎng)關(guān)系統(tǒng)設(shè)置了消息控制表,控制是否發(fā)送消息。同時可以根據(jù)需要從不同維度控制哪些消息需要發(fā)送,而不是所有日志數(shù)據(jù)全部發(fā)送,避免系統(tǒng)資源的浪費,提高消息的使用效率。
1. 正常交易消息發(fā)送
即發(fā)送服務的基本功能測試。當上送交易請求在后臺執(zhí)行成功后,觸發(fā)網(wǎng)關(guān)系統(tǒng)消息發(fā)送功能,將該上送請求相關(guān)的日志信息封裝消息發(fā)送出去。消息控制數(shù)據(jù)緩存在應用服務器,以提高讀取速度,通過POSTMAN工具查詢、驗證。
消息發(fā)送無顯性展示,因此測試對消息是否正常、發(fā)送規(guī)則是否符合消息控制表配置規(guī)則、發(fā)送內(nèi)容的正確性和完整性、topic使用是否正確、總線系統(tǒng)是否正常、正確接收到消息等內(nèi)容的驗證,通過查詢log的方式完成。
2. 查證交易消息發(fā)送
查證功能是網(wǎng)關(guān)系統(tǒng)提供的查證上送交易執(zhí)行結(jié)果(成功/失敗)的功能。由于網(wǎng)絡等原因未收到被查交易返回結(jié)果時,如果該交易配置了消息發(fā)送功能,則在查證交易成功后將被查交易的原始交易信息封裝消息并發(fā)送,保證該交易所有使用場景都能正確發(fā)送消息。
3. 異常消息處理
異常場景主要驗證Kafka不能正常發(fā)送消息的情況,我們通過修改Kafka服務器IP地址方式和配置錯誤的topic等方式模擬Kafka消息發(fā)送失敗的場景,進而驗證網(wǎng)關(guān)系統(tǒng)是否能將消息正確、完整的記錄到異常消息表中。
4. 熔斷場景測試
熔斷是指Kafka異?;蛳⒎諌毫^大,進而影響網(wǎng)關(guān)系統(tǒng)其他正常功能,需要臨時關(guān)閉消息服務已保證網(wǎng)關(guān)系統(tǒng)本身對外服務正常。關(guān)閉消息服務是通過將要發(fā)送的消息記錄到異常消息表中,后續(xù)通過批量補發(fā)方式補發(fā)消息。
批量消息處理測試
通過定時輪詢的方式,對記錄到異常消息表里的消息進行補發(fā)。同時設(shè)置消息熔斷機制,當Kafka異常時,將消息發(fā)送完全切換到記錄消息表,避免造成Kafka完全失效的同時也保證了本系統(tǒng)對外服務正常。
消息補發(fā)功能
當日消息補發(fā)定時輪詢,每5分鐘掃描一次異常消息表,對于未發(fā)送成功的消息重新補發(fā),在發(fā)送三次失敗后更新消息狀態(tài)為“異常”。測試主要驗證內(nèi)容:
- 補發(fā)消息的篩選;
- 錯誤的消息(如空消息)等處理;
- 補發(fā)線程沖突處理機制,等
上日消息補發(fā)對上一日未發(fā)送的異常消息進行補發(fā),與當日補發(fā)功能類似,但不是定時輪詢。
異常消息導出
對于各種補發(fā)后仍失敗的消息,為保證數(shù)據(jù)的完整性,提供導出功能做后續(xù)處理。
性能測試
由于投產(chǎn)后預期消息發(fā)送量很大,預估約1億筆以上,所以對性能要求較高。
參考預估交易量,根據(jù)二八原則(80%的交易量發(fā)生在20%的時間內(nèi)),估算投產(chǎn)后系統(tǒng)的TPS約7000左右。參考該系統(tǒng)前次性能測試指標,我們將通過標準定位2000,測試、生產(chǎn)TPS比例1:3.5。而測試環(huán)境資源與生產(chǎn)資源比例約為1:16,遠大于TPS的測試生產(chǎn)比例,因此我們認為達到該標準即可滿足生產(chǎn)系統(tǒng)性能要求。
在進行了基準測試、負載測試及混合場景測試后,消息服務在測試環(huán)境TPS達到了2000以上,并且系統(tǒng)資源都在合理范圍內(nèi)。
總結(jié)
Kafka是比較成熟的消息系統(tǒng),為網(wǎng)關(guān)系統(tǒng)的消息服務提供了基礎(chǔ),但Kafka偶爾會出現(xiàn)假死現(xiàn)象,導致消息阻塞。本次原本計劃嘗試模擬假死現(xiàn)象,但與項目開發(fā)人員以及Kafka支持人員討論了解到,暫時無法模擬該場景,這也是本次留下的遺憾。