6

Kafka Async プロデューサーを使用している場合、バッファーに X 個のメッセージがあると仮定します。それらがクライアントで実際に処理され、ブローカーまたは特定のパーティションがしばらくダウンしている場合、kafka クライアントは再試行し、メッセージが失敗した場合、特定のメッセージを失敗としてマークし、次のメッセージに移動します (これは可能性があります)。順不同のメッセージにつながる)?または、順序を維持するために、バッチ内の残りのメッセージは失敗しますか?

次に順序を維持するので、理想的には、失敗した場所からバッチを失敗させて、失敗したポイントから再試行できるようにしたいのですが、どうすればそれを達成できますか?

4

2 に答える 2

1

再試行に関するカフカのドキュメントにあるように

0 より大きい値を設定すると、クライアントは一時的なエラーで送信が失敗したレコードを再送信します。この再試行は、クライアントがエラーを受信したときにレコードを再送信する場合と同じであることに注意してください。再試行を許可すると、レコードの順序が変更される可能性があります。これは、2 つのレコードが 1 つのパーティションに送信され、最初のレコードが失敗して再試行され、2 番目のレコードが成功した場合、2 番目のレコードが最初に表示される可能性があるためです。

したがって、タイトルの質問に答えると、カフカには非同期送信での順序保証がありません。


Peter Davisの質問に基づいて回答を更新しています。

バッチモードで送信したい場合、それを保護する唯一の方法はを設定することだと思います max.in.flight.requests.per.connection=1が、ドキュメントにあるように:

この設定が 1 より大きい値に設定されていて、送信に失敗した場合、再試行によりメッセージの順序が変更されるリスクがあることに注意してください (つまり、再試行が有効になっている場合)。

于 2016-02-08T13:54:49.770 に答える