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