エンドツーエンドカナリアリリースや開発環境の隔離などのシナリオでメッセージカナリアリリースを有効にします。メッセージカナリアリリースは、各メッセージにその環境コンテキストをタグ付けすることで、カナリアセマンティクスを RocketMQ に拡張します。これにより、カナリアコンシューマーとベースラインコンシューマーは、それぞれを対象としたメッセージのみを処理するようになります。
メッセージカナリアリリースは、以下の目的で使用します:
消費ロジックの変更を安全に検証:メッセージのサブセットをカナリアコンシューマーにルーティングし、本番トラフィックを処理する前に新しいロジックを検証します。
エンドツーエンドカナリアリリースでのトラフィック漏洩を防止:メッセージコンシューマーがダウンストリーム RPC を生成する際、タグ付けされていないメッセージはカナリアルーティングから漏れ、本番ノードに到達する可能性があります。メッセージのタグ付けにより、コールチェーン全体が正しい環境内に維持されます。
MSE は、オープンソース版と Alibaba Cloud 商用版の両方を含む、RocketMQ のメッセージカナリアリリースのみをサポートします。
仕組み
プロデューサーがメッセージを送信すると、MSE エージェントは現在の環境コンテキストをメッセージ属性にアタッチします。消費中、エージェントはこのコンテキストに基づいてメッセージをフィルタリングするため、各コンシューマーは自身の環境向けのメッセージのみを受信します。
カナリアメッセージの分類
メッセージは、以下のいずれかの場合にカナリアメッセージとして分類されます:
カナリアノードによる生成:カナリア環境で実行されているプロデューサーから送信されたすべてのメッセージ。
カナリアトラフィックを処理するベースラインノードによる生成:カナリアプロデューサーが存在しない場合、カナリアトラフィックはベースラインノードにフォールバックします。このフォールバックの下で生成されたメッセージもカナリアメッセージとして分類されます。
デフォルトの消費動作
メッセージカナリアリリースを有効にすると、以下のようになります:
ベースラインメッセージは、ベースラインコンシューマーのみによって消費されます。
カナリアメッセージは、ベースラインコンシューマーと対応するカナリアコンシューマーの両方によって消費されます。両方のグループは、同じカナリアメッセージを独立して消費します。
カナリアメッセージをカナリアコンシューマーのみに制限するには、「カナリアメッセージのコンシューマーを設定する」をご参照ください。
互換性
RocketMQ Server
| エディション | サーバー側フィルタリング | クライアント側フィルタリング |
|---|---|---|
| オープンソース RocketMQ (4.5.0 以降) | 対応済み(enablePropertyFilter=true を broker.conf で設定する必要があります) | 対応済み |
| Alibaba Cloud RocketMQ 4.x | プラチナエディションのみ | 全エディション |
| Alibaba Cloud RocketMQ 5.x | 対応済み | 対応済み |
RocketMQ Client
| クライアント | 最小バージョン | フィルタリングのサポート |
|---|---|---|
| Ons Client (Alibaba Cloud) | 1.8.0.Final 以降 (1.x シリーズ) | -- |
org.apache.rocketmq:rocketmq-client | 4.2.0 以降 (4.x シリーズ) | サーバーサイドとクライアントサイド |
org.apache.rocketmq:rocketmq-client-java | 5.x シリーズ (MSE エージェント 4.2.2+ が必要) | サーバーサイドのみ |
オープンソースの RocketMQ SDK の違いについては、「RocketMQ 公式ドキュメント」をご参照ください。
MSE エージェントはトランザクションメッセージをサポートしていません。
制限事項
メッセージカナリアリリースは、MSE サービスガバナンスでプロデューサーとコンシューマーの両方で有効になっている場合にのみ有効になります。
メッセージ カナリアリリースを有効化すると、MSE Agent は各カナリアコンシューマーのコンシューマーグループを、元のグループ名に
_<tag>を追加することによって変更します。ここで、<tag>は環境タグです。例えば、元のコンシューマーグループが
group1で、環境タグがgrayの場合、コンシューマーグループはgroup1_grayに変更されます。重要Alibaba Cloud RocketMQ を使用する場合、メッセージのカナリアリリースを有効化する前に、修正済みコンシューマーグループ(例:
group1_gray)を作成します。MSE では、サーバー側のフィルタリングに SQL-92 フィルタリングを使用します。オープンソースの RocketMQ 4.x を使用する場合は、SQL-92 サポートを有効にするために、
broker.confでenablePropertyFilter=trueを設定します。ご利用のセットアップが SQL-92 フィルタリングをサポートしていない場合は、メッセージカナリアリリースを有効にする際にクライアントサイドフィルタリングを選択してください。クライアントサイドフィルタリングでは、各環境がすべてのメッセージを処理する必要があるため、プロデューサーとコンシューマーの両方の負荷が増加します。本番環境でのクライアントサイドフィルタリングは避けてください。
メッセージカナリアリリースの有効化
開始する前に、以下を確認してください:
メッセージプロデューサーとコンシューマーの両方がマイクロサービスガバナンスに接続されている、MSE で管理されるアプリケーション
サポートされているRocketMQセットアップ (「互換性」を参照)
(Alibaba Cloud RocketMQ を使用する場合) 各カナリア環境用に事前に作成されたコンシューマーグループ
メッセージカナリアリリースを有効にするには、以下の手順を実行します:
-
MSE コンソールにログインし、上部のナビゲーションバーでリージョンを選択します。
-
左側のナビゲーションウィンドウで、Microservices Governance > Application Governance を選択します。
-
Application list ページで、目的のアプリケーションのリソースカードをクリックします。左側のナビゲーションウィンドウで、[トラフィック管理] をクリックします。
[メッセージ グレースケール] タブをクリックします。
「メッセージのグレースケールを有効化」の横に[編集]をクリックします。フィルタリング方法と消費ルールを設定し、[OK]をクリックします。
説明メッセージカナリアリリースの設定を変更した後、変更を有効にするには、アプリケーションのすべてのノードを再起動する必要があります。これは、サーバーサイドとクライアントサイドの両方のフィルタリングに適用されます。
説明メッセージカナリアリリースは、エンドツーエンドカナリアリリースのサブ機能です。最良の結果を得るには、関連するエンドツーエンドカナリアリリースの機能も設定してください。
カナリアメッセージコンシューマーの設定
デフォルトでは、ベースライン コンシューマーとカナリー コンシューマーの両方がカナリー メッセージを受信します。カナリー メッセージをカナリー コンシューマーのみに制限するには、対応するタグの [ベースライン コンシューマー] チェックボックスをオフにしてください。
この変更後、ベースラインコンシューマーは、ベースラインメッセージと、ベースラインコンシューマーが明示的に選択されているカナリアメッセージのみを処理します。
-
MSE コンソールにログインし、トップナビゲーションバーでリージョンを選択します。
-
左側のナビゲーションウィンドウで、Microservices Governance > Application Governance を選択します。
-
Application list ページで、目的のアプリケーションのリソースカードをクリックします。左側のナビゲーションウィンドウで、[トラフィック管理] をクリックします。
[メッセージグレースケール] タブをクリックします。
「メッセージ カナリアリリース設定」セクションで、[編集] をクリックします。対応するタグの [ベースライン コンシューマー] チェックボックスをクリアし、[OK] をクリックします。
消費ルールの変更は、アプリケーションの再起動を伴わずに動的に有効になります。ただし、[ベースラインコンシューマー] チェックボックスが解除された状態で、すべてのカナリアコンシューマーがオフラインになった場合、そのタグを持つカナリアメッセージは消費されません。
カナリアリリースのワークフロー
永続的なカナリアコンシューマー
このワークフローは、カナリアコンシューマーがベースラインコンシューマーと並行して継続的に実行される場合に使用します。単一の設定で、カナリアメッセージはカナリアコンシューマーに、ベースラインメッセージはベースラインコンシューマーにルーティングされ続けます。
メッセージがべき等でない場合は、カナリアコンシューマーとベースラインコンシューマーがそれぞれのメッセージのみを処理するようにしてください。以下の手順に従ってください。
開始する前に、以下を確認してください:
メッセージプロデューサーとコンシューマーの両方のアプリケーションがマイクロサービスガバナンスに接続されていること
メッセージカナリアリリースが有効化され、すべてのアプリケーションノードが再起動されていること
手順:
コンシューマーアプリケーションの消費ルールを設定します。カナリアタグの場合、[ベースライン コンシューマー] チェックボックスのチェックを解除します。
RocketMQ 側のサブスクリプション関係が更新されるまで 1〜3 分待ちます。
カナリアコンシューマーノードをオンラインにします。
カナリアプロデューサーノードをオンラインにして、カナリアメッセージの送信を開始します。
動的なカナリアコンシューマー
このワークフローは、カナリアノードが一時的なものであり、特定のリリース反復に関連付けられている場合に使用します。検証後にカナリアコンシューマーがオフラインになる可能性があるため、メッセージの蓄積や損失を防ぐために、ベースラインコンシューマーのフィルタリングを調整します。
リリース手順:
コンシューマー アプリケーションの消費ルールを設定します。カナリア タグの場合、[ベースライン コンシューマー] のチェックボックスをオフにして、カナリア メッセージがカナリア コンシューマーでのみ消費されるようにします。RocketMQ 側のサブスクリプション関係が更新されるまで、1~3 分待ちます。
カナリアコンシューマーノードをオンラインにします。
カナリアプロデューサーノードからカナリアメッセージを送信します。
カナリアメッセージを検証します。
カナリアプロデューサーノードをオフラインにします。
コンシューマーグループのオフセットを比較します。ベースラインの
offsetが、カナリアのconsumer_groupのoffset以下であることを確認します。ログおよびモニタリングを使用して、カナリアのメッセージがすべて消費されたことを確認します。重要ベースラインの
consumer_groupオフセットがカナリアのconsumer_groupオフセット以下である場合、ベースラインのコンシューマーは、残っているカナリアのメッセージを安全に取得できます。一部のメッセージは 2 回消費される可能性があります -- ビジネスロジックが冪等性を処理できるようにしてください。ベースラインのオフセットがカナリアのオフセットより大きい場合、次のステップに進むとカナリアメッセージが失われます。オフセットが揃うまで待ってください。
ベースラインの消費を再度有効にします。カナリータグについて、[ベースラインコンシューマー] チェックボックスを選択して、ベースラインコンシューマーが残りのカナリーメッセージを処理できるようにします。サブスクリプション関係が更新されるまで 1~3 分お待ちください。
カナリー コンシューマー ノードをオフラインにして、カナリー
consumer_groupを削除してください。重要カナリア
consumer_groupを削除しない場合、そのグループにメッセージが蓄積されます。次にカナリアコンシューマーがオンラインになると、最新の位置からではなく、最後に記録されたオフセットから消費を再開します。