標準的なカナリアリリースでは、同期的な HTTP および RPC トラフィックを新しいアプリケーションバージョンにルーティングしますが、非同期のメッセージキューはそのままです。カナリアインスタンスによって生成されたメッセージは、ベースラインのコンシューマーに到達する可能性があり、呼び出しチェーン全体のトラフィック分離が損なわれます。Microservices Engine (MSE) は、カナリアリリースを RocketMQ のメッセージフローに拡張することでこの問題を解決します。タグ付けされたトラフィックは、ビジネスコードを変更することなく、エンドツーエンドでカナリア環境内に留まります。
仕組み
MSE は、2 つのメカニズムを通じてメッセージトラフィックを分離します。
コンシューマーグループの分割: MSE は、各コンシューマーグループ名に環境タグを追加します。例えば、
group1という名前のコンシューマーグループは、gray環境でタグ付けされたインスタンスの場合、group1_grayになります。各環境は独自のコンシューマーグループを取得するため、カナリアコンシューマーはカナリアメッセージのみを処理します。SQL92 メッセージフィルタリング: MSE は、SQL92 フィルター式をメッセージコンシューマーに挿入します。各環境は、自身の環境ラベルを持つメッセージのみをプルします。オープンソースの Apache RocketMQ の場合、これにはブローカー設定で
enablePropertyFilter=trueが必要です。SQL92 フィルタリングが利用できない場合、MSE はFilterMessageHookを使用したクライアントサイドフィルタリングにフォールバックできますが、これによりプロデューサーとコンシューマーの両方の負荷が増加するため、本番環境では推奨されません。
これらのメカニズムは、同期呼び出しのタグベースルーティングと呼び出しチェーン全体でのタグ伝播と組み合わせることで、HTTP、RPC、およびメッセージキュートラフィックにまたがる完全に分離されたカナリア環境を作成します。
デモのアーキテクチャ
このデモでは、Container Service for Kubernetes (ACK) にデプロイされた 4 つのサービスからなるアプリケーションを使用します。呼び出しチェーンは、Spring Cloud、Dubbo、および RocketMQ を組み合わせて、典型的なマイクロサービスアーキテクチャを表しています。

同期パス: /A/dubbo へのリクエストは、spring-cloud-zuul (ゲートウェイ) を通じて入り、spring-cloud-a に転送されます。spring-cloud-a は Dubbo を介して spring-cloud-b を呼び出し、spring-cloud-b は spring-cloud-c を呼び出します。
非同期パス: リクエストを処理した後、spring-cloud-c は RocketMQ メッセージを生成します。spring-cloud-a はメッセージを消費し、Spring Cloud を介して spring-cloud-b を呼び出し、それが spring-cloud-c を呼び出します。
/A/dubbo への呼び出しは、完全な同期パスを返します。
A[10.25.xx.xx] -> B[10.25.xx.xx] -> C[10.25.xx.xx]spring-cloud-a は、メッセージを消費した後に非同期パスをログに記録します。
2021-12-28 10:58:50.301 INFO 1 --- [essageThread_15] c.a.mse.demo.service.MqConsumer
: topic:TEST_MQ,producer:C[10.25.xx.xx],invoke result:A[10.25.xx.xx] -> B[10.25.xx.xx] -> C[10.25.xx.xx]デモのソースコードは GitHub リポジトリから入手してください。
前提条件
開始する前に、以下が完了していることを確認してください。
ステップ 1: アプリケーションを MSE マイクロサービスガバナンスに接続
お使いの ACK クラスターのアプリケーションに対して MSE マイクロサービスガバナンスを有効化します。以下の方法のいずれかを選択してください。詳細な手順については、「ACK または ACS クラスター内の Java マイクロサービスアプリケーション向けにマイクロサービスガバナンスを有効化する」をご参照ください。
オプション A: 名前空間による有効化
この方法では、指定された ACK 名前空間内のすべてのアプリケーションに対してガバナンスを有効にします。
MSE コンソールにログインし、上部のナビゲーションバーでリージョンを選択します。
左側のナビゲーションウィンドウで、[マイクロサービスガバナンス] > [アプリケーションガバナンス] を選択します。
[アプリケーションリスト] ページで、[ACK アプリケーションアクセス] をクリックします。
[ACK アプリケーションアクセス] ダイアログボックスで、以下のパラメーターを設定し、[OK] をクリックします。
- ack-onepilot コンポーネントの詳細を表示するには、ACK コンソールに移動し、クラスター名をクリックして、[オペレーション] > [アドオン] を選択します。 - ack-onepilot がインストールされると、エージェントが自動的に挿入されます。アプリケーションの起動時間が最大 10 秒増加する場合があります。 - クラスターが以下のリージョンのいずれかにない場合、インターネットにアクセスでき、
acm.aliyun.com:8080に接続できる必要があります:中国 (青島)、中国 (杭州)、中国 (北京)、中国 (上海)、中国東部 2 Finance、中国 (深セン)、中国 (香港)、シンガポール、ドイツ (フランクフルト)、オーストラリア (シドニー)、米国 (シリコンバレー)、および米国 (バージニア)。パラメーター 説明 クラスタータイプ [ACK クラスター]、[ACK サーバーレスクラスター]、または [ACS クラスター] を選択します。ACK が MSE を呼び出す権限を持っていない場合は、権限付与リンクをクリックして権限を付与します。 クラスター名/ID ターゲットクラスターを選択します。クラスター名または ID で検索します。 ack-onepilot ack-onepilot コンポーネントのステータスを表示します。インストールされていない場合は、[インストールをクリック] をクリックします。ack-onepilot と「Microservices Governance コンポーネントのインストールと更新」をご参照ください。 アクセスタイプ [名前空間アクセス] を選択します。 ACK クラスターの名前空間 有効にする名前空間を選択します。 マイクロサービスガバナンスの名前空間 MSE ガバナンスの名前空間を選択します。 
オプション B: 単一アプリケーションに対する有効化
この方法では、Deployment spec にラベルを追加することで、特定の 1 つのアプリケーションに対してガバナンスを有効にします。
MSE コンソールにログインし、上部のナビゲーションバーでリージョンを選択します。
左側のナビゲーションウィンドウで、[マイクロサービスガバナンス] > [アプリケーションガバナンス] を選択します。
[アプリケーションリスト] ページで、[ACK アプリケーションアクセス] をクリックします。
[ACK アプリケーションアクセス] ダイアログボックスで、以下のパラメーターを設定し、[OK] をクリックします。
パラメーター 説明 クラスタータイプ [ACK クラスター]、[ACK サーバーレス Kubernetes クラスター]、または [ACS クラスター] を選択します。ACK に MSE を呼び出す権限がない場合は、権限付与の[リンク]をクリックして権限を付与します。 クラスター名/ID ターゲットクラスターを選択します。 ack-onepilot ack-onepilot コンポーネントのステータスを表示します。インストールされていない場合は、[クリックしてインストール] をクリックします。 アクセスタイプ [単一アプリケーションアクセス] を選択します。 
ACK コンソール ([ワークロード] > [デプロイメント] > アプリケーション名をクリック > [YAML で表示]) で Deployment YAML に以下のラベルを追加します:
spec: template: metadata: labels: # マイクロサービスガバナンスを有効にするには "on" に設定します。二重引用符で囲む必要があります。 msePilotAutoEnable: "on" # MSE ガバナンスの名前空間。存在しない場合は自動的に作成されます。 mseNamespace: default # MSE ガバナンスのアプリケーション名。二重引用符で囲む必要があります。 msePilotCreateAppName: "your-deployment-name"
ステップ 2: デモアプリケーションのデプロイ
Nacos サーバー、RocketMQ サーバー、および 4 つのビジネスアプリケーション (spring-cloud-zuul、spring-cloud-a、spring-cloud-b、spring-cloud-c) をデプロイします。
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、ご利用のクラスターの名前をクリックします。
左側のナビゲーションウィンドウで、[ワークロード] > [デプロイメント] を選択します。
[名前空間] を選択し、[YAML から作成] をクリックします。以下の YAML を使用して、すべてのサービスをデプロイします。
デプロイの確認: 期待される出力:
kubectl get svc,deployNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 192.168.xx.xx <none> 4xx/TCP 7d service/mqnamesrv ClusterIP 192.168.xx.xx <none> 98xx/TCP 47h service/nacos-server ClusterIP 192.168.xx.xx <none> 88xx/TCP 47h service/zuul-slb LoadBalancer 192.168.xx.xx 123.56.xx.xx 80:302xxx/TCP 47h NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/nacos-server 1/1 1 1 4m deployment.apps/rockectmq-broker 1/1 1 1 4m deployment.apps/rocketmq-name-server 1/1 1 1 5m deployment.apps/spring-cloud-a 1/1 1 1 5m deployment.apps/spring-cloud-b 1/1 1 1 5m deployment.apps/spring-cloud-c 1/1 1 1 5m deployment.apps/spring-cloud-zuul 1/1 1 1 5m
ステップ 3: メッセージベースのカナリアリリースの有効化
メッセージプロデューサー (spring-cloud-c) とメッセージコンシューマー (spring-cloud-a) の両方で、メッセージベースのカナリアリリースを有効にします。この機能は、両方で有効にした場合にのみ効果があります。
事前準備
以下の要件と制限事項を確認してください。
| 要件 | 詳細 |
|---|---|
| 再デプロイ | メッセージベースのカナリアリリースを有効または無効にした後、変更を有効にするには ACK コンソールでアプリケーションを再デプロイする必要があります。 |
| サポートされるメッセージタイプ | RocketMQ メッセージのみ (オープンソース版および Alibaba Cloud 商用版)。 |
| オープンソース RocketMQ | サーバーとクライアントの両方がバージョン 4.5.0 以降である必要があります。 |
| ApsaraMQ for RocketMQ 4.x | SQL92 フィルタリングには Enterprise Edition が必要です。この制限は、クライアントサイドフィルタリングまたは ApsaraMQ for RocketMQ 5.x には適用されません。 |
| ONS クライアント | バージョン 1.8.0.Final 以降。 |
| コンシューマーグループ名 | MSE は環境タグをコンシューマーグループ名に追加します (例:group1 は group1_gray になります)。Alibaba Cloud ApsaraMQ for RocketMQ を使用する場合は、事前に新しいコンシューマーグループを作成してください。 |
| SQL92 フィルタリング | デフォルトで有効です。オープンソースの Apache RocketMQ の場合、broker.conf に enablePropertyFilter=true を追加してください。 |
| クライアントサイドフィルタリング | SQL92 フィルタリングが利用できない場合は、代わりに FilterMessageHook を使用します。これには、すべてのアプリケーションでメッセージベースのカナリアリリースを有効にし、クライアントサイドフィルタリングを選択する必要があります。すべての環境がすべてのメッセージを処理し、ローカルでフィルタリングするため、このアプローチは負荷を増加させます。本番環境では避けてください。 |
機能の有効化
MSE コンソールにログインし、上部のナビゲーションバーでリージョンを選択します。
左側のナビゲーションウィンドウで、[マイクロサービスガバナンス] > [アプリケーションガバナンス] を選択します。
[アプリケーションリスト] ページで、アプリケーション (spring-cloud-c または spring-cloud-a) のリソースカードをクリックします。
左側のナビゲーションウィンドウで、[トラフィック管理] をクリックします。
[メッセージグレースケール] タブで、[メッセージグレースケールを有効化] スイッチをオンにし、[OK] をクリックします。

ACK コンソールにログインし、設定を有効にするためにアプリケーションを再デプロイします。
もう一方のアプリケーション (spring-cloud-a または spring-cloud-c) について、ステップ 3〜6 を繰り返します。
ステップ 4: カナリアバージョンのデプロイ
3 つのアプリケーションのカナリアバージョン (spring-cloud-a-gray、spring-cloud-b-gray、spring-cloud-c-gray) をデプロイします。各カナリア Deployment はベースラインと同じコンテナイメージを使用しますが、カナリアインスタンスとして識別するために alicloud.service.tag: gray ラベルを含みます。msePilotCreateAppName ラベルはベースラインのアプリケーション名を使用するため、MSE はカナリアとベースラインを同じアプリケーションのバージョンとして扱います。
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
「[クラスター]」ページで、ご自分のクラスターの名前をクリックします。
左側のナビゲーションウィンドウで、[ワークロード] > [デプロイメント] を選択します。
[名前空間] を選択し、[YAML から作成] をクリックします。以下の YAML を使用して、カナリアバージョンをデプロイします。
ステップ 5: トラフィックルーティングの設定と結果の確認
タグベースルーティングルールの作成
MSE コンソールにログインし、上部のナビゲーションバーでリージョンを選択します。
左側のナビゲーションウィンドウで、[マイクロサービスガバナンス] > [アプリケーションガバナンス] を選択します。
spring-cloud-a アプリケーションのリソースカードをクリックします。[アプリケーション概要] ページの [QPS トレンドグラフ] で、すべてのトラフィックがベースラインバージョンに送られていることを確認します。
左側のナビゲーションウィンドウで [トラフィックガバナンス] をクリックし、次に [タグベースルーティング] タブをクリックします。
grayタグの [トラフィックルール] 列で、[追加] をクリックします。
[ラベル ルートの作成] パネルで、トラフィック ルールを定義し、[OK] をクリックします。 この例では、
name=xiaomingのリクエストをカナリア環境にルーティングします。 利用可能な条件と演算子の詳細については、「タグベースルーティングを設定する」をご参照ください。
タグ伝播の有効化
タグ伝播は、カナリアタグを呼び出しチェーン全体に渡します。タグ伝播を有効にすると、ルーティングルールに一致するトラフィックがエンドツーエンドで渡され、ルールを繰り返し設定する必要がなくなります。
[タグベースルーティング] タブで、
grayタグのルーティングルールの名前をクリックします。[ルール詳細] パネルで、[編集] をクリックします。
[タグベースルーティングルールの変更] パネルで、[タグ伝播] スイッチを有効にし、[OK] をクリックします。
エンドツーエンドカナリアリリースの確認
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
ご利用のクラスターの名前をクリックします。左側のナビゲーションウィンドウで、[ネットワーク] > [サービス] を選択します。
zuul-slb サービスをクリックします。[基本情報] の下にある [外部 IP アドレス (外部 IP)] の横にあるアドレスをクリックします。
サービス呼び出しページで、
/A/dubbo?name=xiaomingを入力し、[呼び出し開始]をクリックします。
応答は、カナリア環境を介したエンドツーエンドのルーティングを確認します。

spring-cloud-b のトラフィックデータは、カナリアトラフィックがベースライントラフィックから分離されていることを確認します。

ステップ 6: ベースラインメッセージ消費の制御
デフォルトでは、ベースラインコンシューマーはカナリアを含むすべての環境からメッセージを受信します。ベースラインインスタンスがカナリアメッセージを消費するのを防ぐには、[ベースライン環境で無視するタグ] パラメーターを設定します。
MSE コンソールにログインします。
左側のナビゲーションウィンドウで、[マイクロサービスガバナンス] > [アプリケーションガバナンス] を選択します。spring-cloud-a アプリケーションのリソースカードをクリックします。
左側のナビゲーションウィンドウで [トラフィックガバナンス] をクリックし、次に [メッセージグレースケール] タブをクリックします。
[ベースライン環境で無視するタグ] の横にある [編集] ボタンをクリックします。入力ボックスで
grayを選択し、[OK] をクリックします。
この変更後、gray 環境タグを持つメッセージは、ベースラインの spring-cloud-a インスタンスではなく、spring-cloud-a-gray によってのみ消費されます。この設定はすぐに有効になり、アプリケーションの再起動は不要です。
確認
ACK コンソールで spring-cloud-a アプリケーションのログを確認します。変更前は、ベースラインは両方の環境からメッセージを消費します。[ベースライン環境で無視するタグ] を gray に設定すると、ベースラインはベースライン環境で生成されたメッセージのみを消費するようになります。

次のステップ
タグベースルーティングの設定:単純なパラメーターマッチングを超えた高度なルーティング条件とオペレーターを設定します。
ACK または ACS クラスター内の Java マイクロサービスアプリケーション向けのマイクロサービスガバナンスの有効化:アプリケーションを MSE ガバナンスに接続するための追加の方法について説明します。