如果在全鏈路灰階以及開發環境隔離等情境中需要使用到訊息的灰階,則需要開啟訊息灰階的功能。目前,MSE僅支援RocketMQ類型的訊息灰階。
背景資訊
雖然絕大多數業務情境下對於訊息的灰階的要求並不像RPC的要求那麼嚴格,但是在以下兩個情境中,仍會對訊息的全鏈路有一定的訴求。
當訊息的消費邏輯進行修改後,希望通過小流量的方式來驗證新的訊息消費邏輯的正確性,此時會對訊息的灰階有訴求。
在訊息消費時,可能會產生新的RPC調用,如果沒有在訊息環節遵循之前設定的全鏈路流量控制的規則,會導致通過訊息產生的這部分流量“逃逸”,從而破壞全鏈路灰階的規則,導致出現不符合預期的情況。
功能原理
MSE 服務治理訊息灰階功能是在應用發送訊息的過程中,在訊息屬性中添加當前環境資訊;在消費訊息的過程中,基於訊息屬性中的環境資訊進行過濾。
灰階訊息的定義:灰階訊息是指由以下兩種情況產生的訊息。
灰階生產者直接產生的訊息:由灰階節點(灰階生產者)生產的訊息,預設屬於灰階訊息。
基準節點的回退訊息:當系統中不存在灰階生產者節點時,灰階流量會回退到基準節點,此時基準節點產生的訊息也被視為灰階訊息。
預設情況下開啟訊息灰階以後:基準環境生產者應用生產的基準訊息,只有基準環境消費者進行消費;灰階訊息,基準環境消費者和對應灰階環境消費者均會進行消費,且基準環境消費者和對應灰階環境消費者會獨立消費同一條訊息兩次。
如果希望灰階環境生產者應用生產的訊息只有對應灰階環境消費者進行消費,請參見配置灰階訊息消費者。
使用限制
架構支援情況
訊息類型目前僅支援RocketMQ,包含開源版本和阿里雲商業版。
對於 RocketMQ Server:
如果使用開源版本,RocketMQ Server需要使用4.5.0及以上版本。
如果使用阿里雲RocketMQ 4.x 系列,需要使用鉑金版才能開啟服務端過濾。對於其他版本,可以使用用戶端過濾能力。
如果使用阿里雲RocketMQ 5.x 系列,服務端過濾和用戶端過濾均支援。
對於 RocketMQ Client:
如果使用的用戶端為阿里雲 RocketMQ 提供的 Ons Client,支援的 Ons Client 版本範圍為 1.x 系列,要求大於 1.8.0.Final 。
如果使用的用戶端為開源 RocketMQ 提供的
org.apache.rocketmq:rocketmq-client,支援的org.apache.rocketmq:rocketmq-client版本範圍為 4.x 系列,要求大於 4.2.0。該用戶端支援服務端和用戶端過濾。如果使用的用戶端為開源 RocketMQ 提供的
org.apache.rocketmq:rocketmq-client-java,支援的org.apache.rocketmq:rocketmq-client版本範圍為 5.x 系列,且 MSE Agent 版本需要大於等於 4.2.2 版本。該用戶端僅支援服務端過濾。關於開源 RocketMQ 提供的 SDK 差異,可以參考RocketMQ 官方說明。
目前 MSE Agent 暫不支援事務訊息。
功能使用限制
如果需要使用訊息灰階,必須在 MSE 服務治理中同時開啟訊息生產者和訊息消費者的訊息灰階功能。如果有一方沒有開啟,訊息灰階功能均不生效。
開啟訊息灰階後,MSE Agent會修改灰階環境訊息消費者的
Consumer Group。說明如果使用的是阿里雲RocketMQ ,請在開啟訊息灰階前建立好對應灰階環境的Consumer Group。
修改規則為:對於灰階環境在原Consumer Group 後拼接 _tag,其中 tag 為對應的環境標籤
例:原來的Consumer Group為group1,環境標籤為gray。開啟訊息灰階後,Consumer Group會從group1被修改成group1_gray。
MSE 使用SQL92的過濾方式實現服務端過濾,如果使用的是開源RocketMQ 4.x,需要在RocketMQ Server端開啟SQL92過濾支援(即在broker.conf中配置
enablePropertyFilter=true)。如果的應用情境不滿足支援SQL92過濾的條件,可以使用消費端過濾的能力。此方式需要在開啟 MSE 服務治理訊息灰階時選擇用戶端過濾方式。請注意消費者過濾的方式會在每個環境都處理全量的訊息,對訊息的生產者和消費者壓力都比較大,不推薦在生產中使用用戶端過濾方式。
開啟訊息灰階
登入MSE治理中心控制台,並在頂部功能表列選擇地區。
在左側導覽列,選擇治理中心 > 应用治理。
在应用列表頁面,單擊目標應用的資源卡片,然後在左側導覽列單擊流量治理。
在流量治理頁面,單擊消息灰度頁簽。
在开启消息灰度右側單擊编辑,配置是否開啟訊息灰階、訊息灰階過濾側、消費規則配置,然後單擊確定。
說明修改訊息灰階開關配置以後,無論使用用戶端過濾還是服務端過濾,需要重啟對應應用的所有節點才能正式生效。
訊息灰階作為全鏈路灰階能力的一個子功能,建議開啟訊息灰階也配置好全鏈路灰階的相關能力,以獲得最佳的使用體驗。
配置灰階訊息消費者
如果希望灰階環境生產者應用生產的訊息僅有對應灰階環境消費者進行消費,則需要配置對應灰階標籤的灰階訊息不被基準消費者消費。該情況下,基準環境消費者將只消費基準環境和勾選基準消費者標籤的灰階訊息。
配置方式如下:
登入MSE治理中心控制台,並在頂部功能表列選擇地區。
在左側導覽列,選擇治理中心 > 应用治理。
在应用列表頁面,單擊目標應用的資源卡片,然後在左側導覽列單擊流量治理。
在流量治理頁面,單擊消息灰度頁簽。
在訊息灰階配置單擊編輯,消費規則配置中對應標籤取消勾選基準消費者,然後單擊確定。
修改消費規則配置動態生效,無需重啟應用。
由於基準環境不再消費忽略標籤環境的訊息,如對應灰階環境消費者全部下線,則對應灰階標籤的灰階消將無消費者可以處理。
灰階發佈動作路徑
情境1 灰階消費者常態化部署
在長期部署灰階訊息消費者的情境中,只需將生產者與消費者接入微服務治理,並開啟訊息灰階功能,即可實現灰階訊息由灰階消費者處理、基準訊息由基準消費者處理的目標。整個過程通過一次簡單配置即可完成,高效且易於維護。
注意:如果使用者訊息沒做等冪處理,需要保證灰階訊息由灰階消費者處理、基準訊息由基準消費者。因此需要按照如下操作步驟進行操作。
基本條件:訊息的生產者與消費者應用均需要接入微服務治理,並且開啟訊息灰階後重啟應用。
消費者配置消費規則,對應灰階訊息的標籤取消勾選基準消費者。
在MSE控制台進行操作後,等待1-3分鐘,確保RocketMQ 側訂閱關係已更新。
訊息消費者 灰階節點上線。
訊息生產者 灰階節點上線,發送灰階訊息。
情境2 灰階消費者動態發布情境
對於灰階節點隨應用迭代發布的情境,灰階節點的存在具有動態性,可能根據發布階段啟用或關閉。為保證業務訊息不堆積、不丟失,需要基準消費者節點的過濾行為根據灰階節點的啟停狀態進行調整。發布過程中可以按照如下流程進行操作:
消費者應用修改消費規則配置,對應灰階訊息的標籤取消勾選基準消費者,使灰階訊息僅由灰階消費者消費。在MSE控制台進行操作後,等待1-3分鐘,確保RocketMQ 側訂閱關係已更新。
訊息消費者應用灰階節點上線。
訊息生產者應用灰階節點發送灰階訊息。
驗證灰階訊息。
灰階訊息生產者節點下線。
等待基準
consumer_group的offset小於或等於灰階consumer_group的offset。並通過日誌、監控確認此前灰階訊息是否均消費成功。說明如果基準
consumer_group的offset小於或等於灰階consumer_group的offset,灰階訊息可由基準消費者進行消費,剩餘灰階訊息不會丟失,可進行下一步操作。該情境下,部分灰階訊息會被重複消費,需業務方自行保證訊息的等冪。如果基準
consumer_group的offset大於灰階的consumer_group的offset,進行下一步操作時,灰階訊息會丟失,因此需要等待。消費者應用修改消費規則配置,對應灰階訊息的標籤勾選基準消費者,使剩餘灰階訊息可由基準消費者消費。在MSE控制台進行操作後,等待1-3分鐘,確保RocketMQ 側訂閱關係已更新。
灰階訊息消費者下線,刪除灰階的 consumer_group。
說明如不刪除灰階
consumer_group,會造成該group訊息堆積,下次迭代灰階消費者上線後,將從當前灰階消費位點開始消費。