ApsaraMQ for Kafka は、設定された保持期間を超過したコンシューマーオフセットを削除します。しかし、アクティブなグループのコンシューマーオフセットは、期限切れになった後も保持されます。本トピックでは、その原因と解決策について説明します。
現象
バージョン 2.2.0 の ApsaraMQ for Kafka サーバーで、グループのコンシューマーオフセットが設定したコンシューマーオフセットの保持期間を超過しても削除されません。これらのコンシューマーオフセットは、コンソールで引き続き表示できます。ApsaraMQ for Kafka コンソールで トピックの詳細 ページを開き、サブスクリプション関係 タブをクリックして、対象トピックの 消費の詳細 を表示します。
コンシューマーオフセットの保存期間 は、コンシューマーオフセットが保持される最大期間を指定します。この期間は、コンシューマーオフセットがコミットされた時点からカウントされます。期間を超過したコンシューマーオフセットは削除されます。コンシューマーオフセットを削除しても、オフセットが 0 に設定されるわけではありません。代わりに、コンシューマーオフセットが存在しなくなります。トピックパーティションにコンシューマーオフセットをコミットするたびに、そのコンシューマーオフセットの保持タイマーは 0 にリセットされます。詳細については、「メッセージ設定の変更」をご参照ください。
考えられる原因
オープンソースの Kafka の設計に基づき、アクティブなグループのコンシューマーオフセットは、コンシューマーオフセットの保持期間を超過しても削除されません。
グループは、assign メソッドではなく subscribe メソッドを使用するコンシューマースレッドを含む場合、アクティブなグループとなります。
たとえば、TestGroup という名前のグループを作成して TopicA をサブスクライブし、コンシューマーオフセットをコミットしたとします。ビジネス上の変更により、TopicA のサブスクライブを解除し、TopicB をサブスクライブした場合、TestGroup はアクティブなままであるため、このグループの TopicA と TopicB 両方のコンシューマーオフセットは削除されません。
TopicA のサブスクライブのみを解除し、TopicB をサブスクライブしない場合、TestGroup は非アクティブになります。TestGroup の TopicA におけるコンシューマーオフセットは、コンシューマーオフセットの保持期間を超過した後に削除されます。
ソリューション
期限切れのコンシューマーオフセットを削除するには、次のいずれかの方法を使用します。
subscribeメソッドを使用するすべてのコンシューマースレッドを切断してグループを非アクティブにし、ビジネス要件に基づいて次のいずれかの方法を使用します。コンシューマーオフセットが期限切れになるまで待ちます。期限切れになると、コンシューマーオフセットは自動的に削除されます。
コンソールで、期限切れのコンシューマーオフセットをパーティションごとに 0 にリセットします。
新しいグループに移行し、元のグループのすべてのコンシューマースレッドを非アクティブにして、元のグループのコンシューマーオフセットが期限切れになるまで待ちます。期限切れになると、コンシューマーオフセットは自動的に削除されます。
サーバーのバージョンを 2.6.0 にアップグレードします。
グループの接続を維持し、ビジネスで不要になったトピックのサブスクライブを解除します。グループがアクティブなままであっても、サブスクライブを解除したトピックのコンシューマーオフセットは、コンシューマーオフセットの保持期間を超過した後に削除されます。
上記の方法のいずれかを適用した後、コンソールで結果を確認します。[Topic Details] ページを開き、[Subscriptions] タブをクリックして、トピックの [Consumer Details] を表示します。コンシューマーオフセットが削除された場合、コンシューマーオフセットは存在しなくなります。コンシューマーオフセットを 0 にリセットした場合、コンシューマーオフセットは値 0 のまま残ります。