問題の説明
Sarama Go クライアントには、ApsaraMQ for Kafka との互換性に関して、メッセージの生成と消費に影響を及ぼす可能性のある、以下の既知の問題があります:
-
新しいパーティションが自動的に検出されない。トピックにパーティションを追加した場合、クライアントは再起動されるまで、それらのパーティションを検出または消費できないことがあります。
-
非標準のプロトコル動作。 Sarama Go クライアントは Apache Kafka のプロトコル標準に完全には準拠していません。これにより、ブローカーで例外が発生した場合に、以下の問題を引き起こす可能性があります:
-
予期しないオフセットリセット (OutOfRange メカニズム)。
auto.offset.resetがOldest(earliest)に設定されている場合、クライアントは最も古いオフセットからすべてのメッセージを再消費し、大規模な重複処理を引き起こす可能性があります。 -
継続的なリバランス状態。 クライアントがリバランス状態でスタックし、メッセージの消費を停止することがあります。
-
ソリューション
Sarama Go クライアントをバージョン 1.41.0 以降にアップグレードするか、Confluent Go クライアントに置き換えてください。
Confluent Go クライアントのデモは kafka-confluent-go-demo で利用できます。
クライアントをすぐに置き換えられない場合は、以下の対策でリスクを軽減してください:
-
コンシューマーオフセットのリセットポリシーを適切に設定する。本番環境では、
auto.offset.resetをNewest(latest)に設定してください。Oldest(earliest)は、デバッグ環境や、大規模なメッセージの重複が許容される場合にのみ使用してください。 -
バックログが発生した場合は、コンソールからコンシューマーオフセットをリセットします。 オフセットのリセットによって大量のメッセージバックログが発生した場合は、ApsaraMQ for Kafka コンソールでコンシューマーオフセットを特定の時点にリセットします。 コードの変更やコンシューマーグループの変更は必要ありません。 「コンシューマーオフセットのリセット」をご参照ください。