エンドツーエンドカナリアリリースや開発環境の分離などのシナリオでメッセージカナリアリリースを有効にします。現在、MSE は RocketMQ のメッセージカナリアリリースのみをサポートしています。
背景情報
ほとんどのビジネスシナリオでは、メッセージカナリアリリースの要件は、リモートプロシージャコール (RPC) の要件ほど厳しくありません。ただし、次のシナリオでは、エンドツーエンドのメッセージカナリアリリースが依然として必要です。
メッセージ消費ロジックを変更した後、少量のトラフィックを使用して新しいロジックを検証できます。これにはメッセージカナリアリリースが必要です。
メッセージの消費中に、新しい RPC が生成されることがあります。これらの呼び出しが事前に定義されたエンドツーエンドのトラフィックシェーピングルールに従わない場合、メッセージによって生成されたトラフィックが「エスケープ」する可能性があります。これはエンドツーエンドのカナリアリリースルールに違反し、予期しない結果につながる可能性があります。
仕組み
メッセージカナリアリリース向けの MSE サービスガバナンス機能は、アプリケーションがメッセージを送信するときに、現在の環境コンテキストをメッセージ属性に追加することで機能します。メッセージの消費中、メッセージは属性内のこの環境コンテキストに基づいてフィルター処理されます。
カナリアメッセージの定義: カナリアメッセージは、次の 2 つの方法のいずれかで生成されるメッセージです。
カナリアプロデューサーによって直接生成されたメッセージ: カナリアノード (カナリアプロデューサー) によって生成されたメッセージは、デフォルトでカナリアメッセージと見なされます。
ベースラインノードからのフォールバックメッセージ: システムにカナリアプロデューサーノードが存在しない場合、カナリアトラフィックはベースラインノードにフォールバックします。この場合にベースラインノードによって生成されたメッセージも、カナリアメッセージと見なされます。
デフォルトでは、メッセージカナリアリリースを有効にすると、ベースライン環境からのベースラインメッセージはベースラインコンシューマーによってのみ消費されます。カナリアメッセージは、ベースラインコンシューマーと対応するカナリアコンシューマーの両方によって消費されます。その結果、ベースラインコンシューマーとカナリアコンシューマーの両方が、同じカナリアメッセージを独立して消費します。
カナリア環境のアプリケーションによって生成されたメッセージを、対応するカナリアコンシューマーのみが消費するようにしたい場合は、「カナリアメッセージコンシューマーの構成」をご参照ください。
制限
フレームワークのサポート
メッセージタイプ: オープンソース版と Alibaba Cloud 商用版を含む RocketMQ のみがサポートされています。
RocketMQ Server の場合:
オープンソース版を使用する場合は、RocketMQ Server 4.5.0 以降を使用する必要があります。
Alibaba Cloud RocketMQ 4.x シリーズを使用する場合は、サーバーサイドフィルタリングを有効にするために プラチナエディションを使用する必要があります。他のエディションでは、クライアントサイドフィルタリングを使用できます。
Alibaba Cloud RocketMQ 5.x シリーズを使用する場合、サーバーサイドとクライアントサイドの両方のフィルタリングがサポートされます。
RocketMQ Client の場合:
Alibaba Cloud RocketMQ が提供する Ons Client を使用する場合は、1.8.0.Final より後の 1.x シリーズのバージョンを使用する必要があります。
オープンソース RocketMQ の
org.apache.rocketmq:rocketmq-clientクライアントを使用する場合、サポートされているorg.apache.rocketmq:rocketmq-clientのバージョンは 4.2.0 より後の 4.x バージョンです。このクライアントは、サーバーサイドとクライアントサイドの両方のフィルタリングをサポートしています。オープンソース 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を変更します。説明Alibaba Cloud RocketMQ を使用する場合、メッセージカナリアリリースを有効にする前に、対応するカナリア環境のコンシューマーグループを作成する必要があります。
変更ルール: カナリア環境の場合、元のコンシューマーグループに `_tag` が追加されます。ここで `tag` は対応する環境タグです。
たとえば、元のコンシューマーグループが `group1` で、環境タグが `gray` の場合、メッセージカナリアリリースを有効にすると、コンシューマーグループは `group1` から `group1_gray` に変更されます。
MSE はサーバーサイドフィルタリングに SQL-92 フィルタリングを使用します。オープンソース RocketMQ 4.x を使用する場合、RocketMQ Server で SQL-92 フィルタリングサポートを有効にする必要があります。これを行うには、`broker.conf` ファイルで
enablePropertyFilter=trueを設定します。シナリオが SQL-92 フィルタリングの条件を満たしていない場合は、クライアントサイドフィルタリングを使用できます。これを行うには、MSE サービスガバナンスでメッセージカナリアリリースを有効にするときに、クライアントサイドフィルタリングメソッドを選択します。クライアントサイドフィルタリングでは、各環境がすべてのメッセージを処理する必要があるため、プロデューサーとコンシューマーの両方に高い負荷がかかることに注意してください。本番環境でクライアントサイドフィルタリングを使用することはお勧めしません。
メッセージカナリアリリースを有効にする
MSE コンソールにログインし、上部のナビゲーションバーでリージョンを選択します。
左側のナビゲーションウィンドウで、Microservices Governance > Application Governance を選択します。
Application list ページで、目的のアプリケーションのリソースカードをクリックします。左側のナビゲーションウィンドウで、[Traffic Management] をクリックします。
Traffic management ページで、Message grayscale タブをクリックします。
Open message grayscale の右側にある Edit をクリックします。メッセージカナリアリリース、フィルタリング設定、および消費ルールを構成します。次に、[OK] をクリックします。
説明メッセージカナリアリリースの設定を変更した後、変更を有効にするには、対応するアプリケーションのすべてのノードを再起動する必要があります。これは、クライアントサイドとサーバーサイドの両方のフィルタリングに適用されます。
メッセージカナリアリリースは、エンドツーエンドカナリアリリースのサブ機能です。最良の結果を得るには、この機能を有効にするときに、関連するエンドツーエンドカナリアリリース機能も構成することをお勧めします。
カナリアメッセージコンシューマーの構成
カナリア環境からのメッセージをカナリアコンシューマーのみが消費するようにしたい場合は、ベースラインコンシューマーがそれらを消費するのを防ぐ必要があります。これを行うには、カナリアタグの消費ルールを構成します。この構成の後、ベースラインコンシューマーは、ベースラインメッセージと、ベースラインコンシューマーが明示的に選択されているカナリアメッセージのみを処理します。
プロシージャ:
MSE コンソールにログインし、上部のナビゲーションバーでリージョンを選択します。
左側のナビゲーションウィンドウで、Microservices Governance > Application Governance を選択します。
Application list ページで、目的のアプリケーションのリソースカードをクリックします。左側のナビゲーションウィンドウで、[Traffic Management] をクリックします。
Traffic management ページで、Message grayscale タブをクリックします。
[Message Canary Release Configuration] セクションで、[Edit] をクリックします。消費ルール構成で、対応するタグの [Baseline Consumer] チェックボックスをオフにします。次に、[OK] をクリックします。
消費ルール構成への変更は動的に有効になります。アプリケーションを再起動する必要はありません。
ベースライン環境は無視されたタグを持つメッセージを消費しなくなるため、対応するカナリア環境のすべてのコンシューマーがオフラインになると、そのタグを持つカナリアメッセージは消費されません。
カナリアリリースのワークフロー
シナリオ 1: カナリアコンシューマーの永続的なデプロイメント
カナリアメッセージコンシューマーを長期間デプロイするシナリオでは、プロデューサーとコンシューマーをマイクロサービスガバナンスに接続し、メッセージカナリアリリースを有効にすることができます。これにより、カナリアメッセージはカナリアコンシューマーによって消費され、ベースラインメッセージはベースラインコンシューマーによって消費されることが保証されます。このプロセス全体は単一の構成のみを必要とし、効率的で保守が容易です。
注: メッセージがべき等でない場合は、カナリアメッセージがカナリアコンシューマーによって消費され、ベースラインメッセージがベースラインコンシューマーによって消費されるようにする必要があります。これを行うには、次の手順に従います。
前提条件: メッセージプロデューサーとコンシューマーの両方のアプリケーションがマイクロサービスガバナンスに接続されている必要があります。また、メッセージカナリアリリースを有効にした後、アプリケーションを再起動する必要があります。
コンシューマーの消費ルールを構成します。カナリアメッセージに対応するタグについては、[Baseline Consumer] チェックボックスをオフにします。
MSE コンソールで操作を実行した後、1〜3 分待って、RocketMQ 側のサブスクリプション関係が更新されることを確認します。
メッセージコンシューマーのカナリアノードをオンラインにします。
メッセージプロデューサーのカナリアノードをオンラインにし、カナリアメッセージを送信します。
シナリオ 2: カナリアコンシューマーの動的リリース
カナリアノードがアプリケーションの反復とともにリリースされるシナリオでは、カナリアノードは一時的なものであり、リリースフェーズに応じて有効または無効になる場合があります。メッセージの蓄積や損失を防ぐには、カナリアノードのステータスに基づいてベースラインコンシューマーノードのフィルタリング動作を調整する必要があります。リリース中に次のプロシージャに従ってください:
コンシューマーアプリケーションの消費ルール構成を変更します。カナリアメッセージに対応するタグについては、[Baseline Consumer] チェックボックスをオフにして、カナリアメッセージがカナリアコンシューマーによってのみ消費されるようにします。MSE コンソールで操作を実行した後、1〜3 分待って、RocketMQ 側のサブスクリプション関係が更新されることを確認します。
メッセージコンシューマーアプリケーションのカナリアノードをオンラインにします。
メッセージプロデューサーアプリケーションのカナリアノードからカナリアメッセージを送信します。
カナリアメッセージを検証します。
カナリアメッセージプロデューサーノードをオフラインにします。
ベースライン
consumer_groupのoffsetがカナリアconsumer_groupのoffset以下になるまで待ちます。ログとモニタリングを使用して、以前のすべてのカナリアメッセージが正常に消費されたことを確認します。説明ベースライン
consumer_groupのoffsetがカナリアconsumer_groupのoffset以下の場合、残りのカナリアメッセージはベースラインコンシューマーによって消費される可能性があり、失われることはありません。その後、次のステップに進むことができます。このシナリオでは、一部のカナリアメッセージが繰り返し消費されます。ビジネスロジックがメッセージのべき等性を処理することを確認する必要があります。ベースライン
consumer_groupのoffsetがカナリアconsumer_groupのoffsetよりも大きい場合、次のステップに進むとカナリアメッセージが失われます。したがって、待機する必要があります。コンシューマーアプリケーションの消費ルール構成を変更します。カナリアメッセージに対応するタグについては、[Baseline Consumer] チェックボックスを選択して、残りのカナリアメッセージがベースラインコンシューマーによって消費されるようにします。MSE コンソールで操作を実行した後、1〜3 分待って、RocketMQ 側のサブスクリプション関係が更新されることを確認します。
カナリアメッセージコンシューマーをオフラインにし、カナリア consumer_group を削除します。
説明カナリア
consumer_groupを削除しないと、そのグループにメッセージが蓄積されます。次回、反復中にカナリアコンシューマーがオンラインになると、最後に記録されたカナリアコンシューマーのオフセットから消費を開始します。