クロスリージョンレプリケーション中、ソースインスタンスとデスティネーションインスタンスのコンシューマーグループは、異なるレートでメッセージを処理します。フェールオーバーが発生した場合、デスティネーションインスタンスに再接続するコンシューマーは、大量のメッセージを再処理することを避けるために、正しいオフセットから再開する必要があります。グローバルメッセージレプリケーションのコンシューマー進捗の同期機能は、ソースとデスティネーションの ApsaraMQ for RocketMQ インスタンス間でコミット済みオフセットを同期し、フェールオーバー後にコンシューマーが中断した箇所から処理を再開できるようにします。
仕組み
グローバルメッセージレプリケーションは、ソースインスタンス内の各コンシューマーグループのコミット済みオフセットを定期的にチェックし、デスティネーションインスタンス内の対応するコンシューマーグループにレプリケートします。同期は、次の両方の条件を満たすコンシューマーグループにのみ適用されます。
グループがソースインスタンスとデスティネーションインスタンスの両方に同じ名前で存在します。
グループが両方のインスタンスで同じトピックをサブスクライブしています。
進捗は非同期にレプリケートされるため、コンシューマーがソースインスタンスでオフセットをコミットしてから、そのオフセットがデスティネーションインスタンスに反映されるまでに数分程度の遅延が発生することがあります。フェールオーバー後、一部のメッセージが再度消費されることがあります。メッセージ ID やビジネスレベルの一意キーに基づいて重複排除を行ってから副作用を適用するなど、コンシューマーが重複メッセージをべき等に処理できるように設計してください。
単方向同期と双方向同期の比較
項目 | 単方向同期 | 双方向同期 |
方向 | ソースからデスティネーションへのみ | ソースからデスティネーション、およびデスティネーションからソースへの切り替えが可能 |
自動同期 | サポートされています。すべてのトピックマッピングを対象に 10 秒ごとに同期します。 | サポートされていません。手動同期のみです。 |
同期条件 | 自動同期では、デスティネーションのコンシューマーグループがオンラインである必要があります。手動同期は、コンシューマーグループがオンラインであるかどうかにかかわらず動作します。 | デスティネーションからソースへの手動同期では、両方のグループがアクティブにメッセージを消費している必要があり、かつソースグループの進捗がデスティネーショングループの進捗より遅れている必要があります。 |
単方向のコンシューマー進捗同期の設定
始める前に、グローバルメッセージレプリケーションの同期タスクが設定済みであり、同じ名前とトピックのサブスクリプションを持つコンシューマーグループがソースインスタンスとデスティネーションインスタンスの両方にデプロイされていることを確認してください。
単方向同期は、自動同期モードと手動同期モードの両方をサポートしています。
自動同期: [コンシューマーの進捗を自動的に更新] を有効にすると、システムはソースインスタンスと宛先インスタンス間のすべてのトピックマッピングで、コンシューマーの進捗を 10 秒ごとに同期します。 自動同期は、宛先インスタンスでオフラインになっているコンシューマーグループをスキップします。
手動同期:デスティネーションのコンシューマーグループがオンラインかオフラインかにかかわらず動作します。
初めて[コンシューマー進捗同期]を有効にすると、デフォルトで[コンシューマー進捗の自動更新]が有効になります。
単方向のコンシューマー進捗同期を設定するには:
ApsaraMQ for RocketMQコンソールにログインします。
トップナビゲーションバーで、中国 (杭州) など、同期タスクが存在するリージョンを選択します。
左側のナビゲーションペインで、[グローバルメッセージレプリケーション] をクリックします。設定するタスクを探します。
[基本タスク情報] ページで、左側のナビゲーションペインの [コンシューマー進捗同期] をクリックします。
[コンシューマー進捗同期] をオンにします。
同期方法を選択します。
自動同期: [コンシューマーの進捗を自動的に更新] をオンにします。
手動同期: [コンシューマー進捗の自動更新] をオフにして、[クイック同期] をクリックします。確認ダイアログで [OK] をクリックします。
双方向のコンシューマー進捗同期の設定
双方向同期は手動同期のみをサポートしています。ビジネス上の例外が発生した場合に手動同期を使用して、重複メッセージの消費を減らします。
デスティネーションからソースに進捗を同期するには、次の両方の条件を満たす必要があります。
ソースとデスティネーションの両方のコンシューマーグループがアクティブにメッセージを消費しています。
ソースコンシューマーグループの進捗がデスティネーションコンシューマーグループの進捗より遅れています。
双方向のコンシューマー進捗同期を設定するには:
ApsaraMQ for RocketMQコンソールにログインします。
トップナビゲーションバーで、中国 (杭州) など、同期タスクが存在するリージョンを選択します。
左側のナビゲーションウィンドウで、[グローバルメッセージレプリケーション] をクリックします。設定するタスクを探します。
[基本タスク情報] ページで、左側のナビゲーションペインにある [コンシューマー進捗の同期] をクリックします。
[コンシューマー進捗同期] をオンにします。
(オプション) 同期方向を変更するには、[同期方向の切り替え] をクリックします。確認ダイアログで、[OK] をクリックします。
[クイック同期]をクリックします。 確認ダイアログで、[OK] をクリックします。
よくある質問
一部のコンシューマーグループが同期されないのはなぜですか?
ソースインスタンスとデスティネーションインスタンスの両方で同じ名前を持ち、同じトピックをサブスクライブしているコンシューマーグループのみが同期の対象となります。グループ名とトピックのサブスクリプションが両方のインスタンスで完全に一致していることを確認してください。
自動同期が有効になっている単方向タスクの場合は、デスティネーションインスタンスのコンシューマーグループがオンラインであるかどうかも確認してください。自動同期はオフラインのグループをスキップします。
フェールオーバー後に重複メッセージを処理するにはどうすればよいですか?
コンシューマーの進捗の同期には、数分程度の遅延が発生することがあります。フェールオーバー後、コンシューマーはソースインスタンスで既に消費されたメッセージを再処理する可能性があります。メッセージ ID やビジネスレベルの一意キーに基づいて重複排除を行ってから副作用を適用してください。