9

コンシューマーがメッセージを読み取り、スレッドがデータベースへのアクセスなど、メッセージが別のトピックに生成される前にさまざまなことを行うアプリケーションがあります。スレッドでメッセージを消費してから生成するまでの時間は、数分かかる場合があります。メッセージが新しいトピックに生成されると、コンシューマー キュー メッセージの作業が完了したことを示すためにコミットが行われます。このため、自動コミットは無効になっています。

私は高レベルのコンシューマーを使用していますが、私が気づいているのは、ズーキーパーとカフカのセッションがタイムアウトすることです。これは、コンシューマー キューで何かを行う前に時間がかかりすぎて、スレッドが戻ってコンシューマーからより多くを読み取るたびにカフカがリバランスすることになるためです。しばらくすると、コンシューマーが新しいメッセージを読み取るまでに長い時間がかかり始めます。

Zookeeper セッションのタイムアウトを非常に高く設定して問題にならないようにすることはできますが、それに応じてリバランス パラメータを調整する必要があり、kafka は他の副作用の中でもしばらくの間、新しいコンシューマを取得しません。

この問題を解決するためのオプションは何ですか? 両方を幸せに保つためにカフカと飼育係にハートビートする方法はありますか? 単純なコンシューマを使用した場合でも、これらと同じ問題がありますか?

4

2 に答える 2

4

あなたの問題は、最終的に読み取られたオフセットを管理するために高レベルの消費者に依存することに要約されるようです。そのオフセットの永続性を制御するため、単純なコンシューマを使用するとその問題が解決します。高レベルのコンシューマ コミットは、最後に読み取ったオフセットを Zookeeper に格納するだけであることに注意してください。他のアクションは実行されず、読み取ったメッセージはまだパーティションに存在し、他のコンシューマーが読み取ることができます。

kafka の単純なコンシューマーを使用すると、そのオフセット ストレージがいつ、どのように行われるかをより詳細に制御できます。そのオフセットを Zookeeper 以外の場所 (データベースなど) に保持することもできます。

悪いニュースは、単純なコンシューマー自体は高レベルのコンシューマーよりも単純ですが、それを機能させるためにコードごとに行う必要がある作業がはるかに多いことです。また、複数のパーティションにアクセスするためのコードを作成する必要があります。これは、高レベルのコンシューマーが非常にうまく処理してくれます。

于 2014-12-21T16:18:59.427 に答える
0

問題は、コンシューマーのポーリング メソッドがコンシューマーのハートビート リクエストをトリガーすることだと思います。そして、session.timeout を増やすと。コンシューマーのハートビートはコーディネーターに届きません。このハートビート スキップのため、コーディネーターはコンシューマーをデッドとしてマークします。また、特に単一のコンシューマーの場合、コンシューマーの再参加は非常に遅くなります。

私は同様の問題に直面しており、それを解決するには、コンシューマ構成プロパティで次のパラメータを変更する必要があります

session.timeout.ms= request.timeout.ms= セッション タイムアウト以上

また、kafka ブローカー ノードの server.properties に次のプロパティを追加する必要があります。group.max.session.timeout.ms =

詳細については、次のリンクを参照してください。 http://grokbase.com/t/kafka/users/16324waa50/session-timeout-ms-limit

于 2016-08-11T10:20:15.140 に答える