



摘要:信息交互中重要的交互方式之一——異步消息通信,沒有通用的灰度發布技術架構或基礎中間件組件實現,由消息交互雙方協商后解決,由此產生了技術架構多樣帶來更高的開發難度及交流成本,實現方法不通用帶來的方案重用性差、重復設計等問題。通過在消息中間件層提供統一技術解決方案實現異步消息通信的灰度發布方法,最大限度地降低了消息交互灰度功能的開發成本及設計復雜度,最終提高了整體服務的可用性、可靠性及服務質量。
關鍵詞:灰度發布;消息廣播訂閱模式;消息過濾
一、前言
隨著企業信息化程度及業務復雜度的顯著增加,信息化平臺越來越走向專業化、模塊化和服務化。企業信息系統從集中化向分布式轉變,服務從業務內聚集中化向分布式微服務化發展。伴隨著微服務化改造,服務之間的關系變得錯綜復雜,一個業務流程由單一參與者轉變為需要幾十甚至上百個微服務通過復雜的協作才可以完成。因此,為保證整體服務的正確性,對每個服務的更新升級提出了更高的要求,灰度發布技術對錯綜復雜的服務調用鏈中進行局部升級改造起到了越來越重要的作用。
二、相關技術介紹
解決微服務調用過程中新老版本升級的用戶無感問題是基于對服務的灰度調度能力。灰度調度可以根據服務的特性差異及規則把相關的流量在不同服務特性版本之間進行靈活切換或按照一定比例分配,此行為可以由微服務調度框架實現。例如,使用流量染色技術,構建從網關到全體后端業務服務的隔離環境,實現支持多版本、多服務的灰度發布。設計靈活、豐富的灰度策略實現灰度發布的精細化控制。通過網關和被全體后端業務服務依賴的sidecar模塊實現全鏈路灰度能力[1],完全不需要用戶的參與,也不需要服務提供者了解具體的灰度規則,很好地屏蔽了服務器提供者實例的變化對用戶的影響,同時也降低了后端更新服務時給用戶帶來的風險。目前流行的與消息交互相關的灰度處理方案都是由消息交互雙方自行協商完成的,作為消息中間件只是充當消息傳輸媒介,并不參與消息灰度邏輯實現。這種由消息交互雙方提出灰度方案的方式存在以下幾點問題。
耦合度增加:由于是消息雙方協商完成的消息灰度處理方案,所以消息發送方與消費方需要了解并適配對方的灰度處理邏輯。當交互復雜度提高時,這種灰度處理模式將導致服務調用鏈條內的多個服務之間的耦合度顯著增加,從而降低了消息中間件的解耦作用。
開發難度提高:需要消息交互雙方都處理消息灰度邏輯,雙方都需要投入人力進行設計、開發,增加了系統復雜度及開發難度。
開發成本增加:設計方案都是針對消息處理雙方的技術特點及業務場景進行設計,方案不具備普適性。當大量服務需要灰度處理時會導致人力的大量重復投入。
針對以上問題,提出了一種用于分布式部署模型下由消息中間件自主完成消息灰度能力的方法,通過動態感知消費服務特征并根據動態配置規則將消息流導入不同的服務中,從而實現由消息中間件獨立實現的消息灰度能力,最大限度地降低了消息交互雙方對服務灰度功能的開發及設計成本。由于消息灰度解決方案由消息中間件實現,所有使用此消息中間件的服務自然都具備了消息灰度的功能,極大地提高了整個集群消息交互服務的可用性及可靠性,最終將提升整體服務質量。
三、技術方案
本方案提出了一種基于多隊列實現的,可以根據接收者版本動態設置消息傳輸灰度規則并動態生效的方法,系統架構圖如圖1所示。
主要實現原理是通過對消息進行特殊處理實現對消息的區分,根據消費者特征將特定的消息分發給指定消費者從而實現對消息的流向控制。根據此思想設計了圖1的系統架構,使用消息預處理模塊對消息進行預處理打標、多隊列同步傳輸及服務器端可編程消息過濾器,實現了在相同消息消費者版本之間自由切換消息傳輸流量,在訂閱模式下不同消費者之間可以獨立設置灰度規則并不互相影響。
(一)系統組成
本方案由連接控制器、消息預處理組件、隊列組(隊列1、隊列2)、消息過濾器、消費者信息收集器及灰度規則控制器組成,如圖2所示。
連接控制器:根據消費者信息及灰度規則控制消費者連接隊列組中那個隊列。
消息預處理組件:主要完成消息灰度打標工作。根據灰度規則,控制器生成的消息預處理規則對發送者發送的消息打標并以扇出等方式發送到隊列組。
隊列組:消息傳輸媒介,完成打標消息的傳輸。同時,雙隊列有效避免相同消息消費者不同版本之間的消息爭搶問題(此設計主要針對KAFKA的消費模式)。
消息過濾器:灰度規則控制器根據灰度設置生成的消息過濾規則,在消息消費者消費消息時在服務器端過濾掉不屬于此消費者的消息。
消費者信息收集器:在消費者實例發生變化時收集新增消費者特征信息(IP、消費者身份信息及消費者版本信息)。
灰度規則控制器:根據灰度規則發布者提供的灰度發布規則及消費者信息收集器收集到的消費者版本信息,生產消息預處理規則及消息過濾規則。
(二)實現原理
針對以上問題提出了一種用于分布式部署模型下,由消息中間件自主完成支持訂閱模式的消息灰度實現方法。其核心思想就是通過在消息上根據灰度規則做相應標記,并在消息消費過程中在服務器端動態過濾掉不屬于消費者標記的消息(消息過濾機制具有精確、高效的優點,基于消息標記或者消息內容等方面可以通過使用消息內容對比[2]),達到對消息的消費者進行控制的目的,從而實現消息的灰度處理機制。對于訂閱模式下多消費者互相獨立的灰度規則的支持,需要在隊列組中隊列支持訂閱模式的基礎上,通過在消息上打多個消費者相關的標記完成,各個消費者過濾本身的標記即可實現訂閱消息消費同時不互相影響。
消息控制的詳細流程如下:
1.用戶配置消費灰度策略。
2.根據消費者軟件信息及灰度規則產生消息預處理規則及消費者相關的消息過濾規則(消費者過濾規則相互獨立)。
3.消息生產者產生消息。
4.消息預處理器根據預處理規則對消息生產者產生的消息進行打標處理。
5.打標后消息發送到消息隊列等待消息消費者消費(多消費者消費互相獨立)。
6.消息過濾器根據此消費者的消息過濾規則過濾掉無用消息。
7.消費者消費灰度規則處理后的消息。
四、具體實施方式
重點實施技術點包括:消息灰度處理、相同消費者灰度消費消息爭搶問題、不同消費者灰度設置隔離問題。
(一)消息灰度處理
消息灰度處理主要是根據消息灰度處理規則在消息上打上不同的標記,再通過后續的過濾機制根據標記過濾掉不相關消息,達到消息分流的目的,從而實現消息灰度處理能力。
圖3描述了消息灰度完整的處理流程,詳細描述如下:假設消費者兩個版本V1和V2,消息灰度設置為V1消費比例40%,V2消費比例60%。
1.消息生產者生產消息發送給消息中間件。
2.消息預處理組件根據灰度規則控制器產生的灰度控制規則(V1版本比例40%,V2版本比例60%)為消息生產者生產的消息打標。
3.消息預處理組件將打標后消息扇出,發送給隊列組中每一個隊列(針對KAFKA消息中間件設計)。
4.當消費者消費消息時,消息過濾器對拉取的消息根據消費者特征進行標記過濾,并將過濾后的消息返回給消費者。
通過以上過程完成消息中間件的消息灰度控制,通過改變灰度規則動態處理打標和過濾規則,實現動態調整消息灰度比例。
(二)相同消費者灰度消息爭搶
通用消息中間件在處理多個消費者實例連接時并不區分消費者實例特征(版本、部署位置等)差異,消息中間件會同等對待所有消費者實例,在它們之間進行消息負載均衡處理,確保一個消息只能由一個消費者進行處理,避免重復消費。從消費者角度來看就是爭搶模式,所以傳統消息中間件很難實現對消息流的定向控制。
KAFKA是一個高吞吐量、高性能的分布式消息系統,高吞吐量能夠支撐海量數據處理需求,高性能能夠高效、實時地傳播數據的消息中間件[3],基于KAFKA做了實現案例,使用雙隊列組成的隊列組來避免消息爭搶。在客戶端連接后,消費者信息收集器會收集消費者的特征信息,灰度規則控制器根據消費者的灰度配置及消費者特征產生連接規則。當消費者實際拉取消息時,連接控制器會根據消費者特征將消費目標動態連接到隊列組中正確的隊列上。通過以上處理規則確保涉及灰度規則的不同特征消費者連接到不同的隊列上,從而避免爭搶消息現象的發生。
(三)消費者特征(版本、部署等相關信息)
消息中間件使用者自身標識信息。例如,版本信息可以用于區分相同消費者的不同版本,部署信息可以用于區分相同消費者同一版本下不同的部署邏輯單元。
(四)不同消費者灰度設置隔離問題
通用中間件消息訂閱模式下各個消費者之間得到的消息都是相同的,對于消息中間件而言,一般有兩種消息投遞模式:點對點(P2P,Point-to-Point)模式和發布/訂閱(Pub/Sub)模式。點對點模式的實現細節已經在上文闡述,此處主要針對消息發布訂閱模式。發布訂閱模式定義了如何向一個內容節點發布和訂閱消息,這個內容節點稱為主題(Topic),訂閱模式是系統間信息共享的通用方案,可同時支持業務數據、監視數據等信息的共享[4]。以KAFKA技術框架為例,如果消費者都隸屬于不同的消費組,那么所有的消息都會被廣播給所有的消費者,即每條消息會被所有的消費者處理,這就相當于傳統消息中間件的發布/訂閱模式[5]。因此,本方案中另一個需解決的重點問題是如何支持消息訂閱模式下,不同消費者能夠設置不同灰度規則并且做到不互相影響。
圖4描述了不同消費者不同版本消費消息的灰度隔離流程,詳細描述如下:假設消費者1兩個版本V1和V2,消息灰度設置為V1消費比例40%,V2消費比例60%;消費者2兩個版本V1和V2,消息灰度設置為V1消費比例20%,V2消費比例80%。
1.消息生產者生產消息發送給消息中間件。
2.消息預處理組件根據灰度規則控制器產生的消費者1灰度控制規則(V1版本比例40%,V2版本比例60%)為消息生產者生產的消息打標(黑)。
3.消息預處理組件根據灰度規則控制器產生的消費者2灰度控制規則(V1版本比例20%,V2版本比例80%)為消息生產者生產的消息打標(紅)。
4.消息預處理組件將打標后消息扇出發送給隊列組中每一個隊列。
5.當消費者1消費消息時,消息過濾器對拉取的消息根據消費者特征(黑)進行標記過濾并將過濾后的消息返回給消費者。
6.當消費者2消費消息時,消息過濾器對拉取的消息根據消費者特征(紅)進行標記過濾并將過濾后的消息返回給消費者。
通過以上過程完成消息中間件的多消費者隔離的消息灰度控制,并且通過動態產生與處理規則和過濾規則,可以動態地調整每一個消費者的消息灰度比例。
五、結語
本文提供了一種基于中間件自身完成的支持消息訂閱模式的灰度控制方法,通過在消息中間件實現消息的灰度控制,大大降低了軟件之間對于消息灰度處理的溝通成本,降低了軟件技術架構復雜度,及軟件的開發和運維成本。統一實現的消息灰度技術方案具有統一的開發流程及管理方案,提高了可維護性,實現了對應用無感的軟件灰度控制方法,簡化了應用開發復雜度并提高了開發效率。綜上所述,中間件自主實現的灰度控制方案在提高整個系統業務消息處理可靠性及可用性的同時降低了開發及管理成本。
參考文獻
[1]劉軍,李雄清,孫瓊巍,等.面向云原生全鏈路灰度發布技術研究與實踐[J].電子技術應用,2023(04):73-74.
[2]王重楠,王宗陶,鮑忠貴,等.發布/訂閱模式測控消息中間件系統設計[J].計算機應用,2015(03):879-881.
[3]裴宏祥,于曉虹.基于kafka消息平臺的軟件系統設計[J].計算機軟件及計算機應用,2018(18):39.
[4]蔡建坤,劉俊波.基于發布訂閱模式的空管系統間信息共享方案設計[J].電子技術與軟件工程,2018(14):174.
[5]朱忠華.深入理解Kafka:核心設計與實踐原理[M].北京:電子工業出版社,2019:47-48.