問題の説明
サーバーサイドバージョンが 2.2.0 の ApsaraMQ for Kafka インスタンスを使用しています。グループのコンシューマオフセットが期限切れになっても保持されます。ApsaraMQ for Kafka コンソールの トピックの詳細 ページの サブスクリプション関係 タブで 消費の詳細 をクリックすると、その Topic のコンシューマー詳細を引き続き表示できます。
コンシューマーオフセットの保存期間 パラメーターは、コンシューマオフセットを保持できる最大期間を指定します。コンシューマオフセットの保存期間は、オフセットがコミットされた時点から開始されます。保存期間が終了すると、システムはコンシューマオフセットを削除します。コンシューマオフセットを削除してもオフセットは 0 にリセットされず、オフセットレコードが削除されるだけであることに注意してください。コンシューマオフセットが Topic パーティションにコミットされるたびに、そのコンシューマオフセットの保存期間タイマーは 0 にリセットされます。詳細については、「メッセージ構成の変更」をご参照ください。
考えられる原因
オープンソース Kafka の設計上、アクティブなグループのコンシューマオフセットは、指定された保存期間を超えても削除されません。
グループは、`assign` メソッドとは異なる `subscribe` メソッドを使用するコンシューマースレッドが含まれている場合にアクティブと見なされます。
例えば、TestGroup という名前のグループを作成して Topic A をサブスクライブし、そのコンシューマオフセットを正常にコミットしたとします。その後、ビジネス要件の変更により、TestGroup の Topic A へのサブスクリプションを解除し、新しい Topic B をサブスクライブします。この場合、TestGroup はアクティブなままであり、Topic A と Topic B の両方に対するこのグループのコンシューマオフセットは削除されません。
もし TestGroup の Topic A へのサブスクリプションを解除するだけで、新しい Topic をサブスクライブしない場合、TestGroup は非アクティブになります。その結果、Topic A のコンシューマオフセットは、保存期間が終了した後に削除されます。
解決策
期限切れのコンシューマオフセットを削除するには、次のいずれかの操作を実行します。
グループを切断して非アクティブにします。その後、次のいずれかの操作を実行します。
コンシューマオフセットの有効期限が切れるのを待ちます。その後、システムによって自動的に削除されます。
コンソールで、パーティションごとに期限切れのコンシューマオフセットを 0 にリセットします。
コンシューマーを新しいグループに移行します。これにより、元のグループは非アクティブになります。元のグループのコンシューマオフセットの有効期限が切れるのを待ちます。その後、システムによって自動的に削除されます。
サーバーサイドのバージョンを 2.6.0 以降にアップグレードします。
このバージョンでは、コンシューマーを切断する必要はありません。不要になった Topic のサブスクリプションを解除するだけで済みます。例えば、TestGroup が Topic A のサブスクリプションを解除しても、Topic B へのサブスクリプションによってアクティブな状態を維持している場合、TestGroup と Topic A の組み合わせに対するコンシューマオフセットは、その保存期間が終了した後にクリアされます。