web-dev-qa-db-ja.com

Kafka Consumer-アンケート行動

KafkaConsumer(> = 0.9)に関して、自分のニーズに合ったソリューションを実装しようとするいくつかの深刻な問題に直面しています。

kafkaトピックからのメッセージをnメッセージだけを読み取らなければならない関数があるとします。

例:getMsgs(5)->gets next 5 kafkaトピック内のメッセージ。

そのため、このようなループがあります。実際の正しいパラメーターで編集。この場合、消費者のmax.poll.records paramが1に設定されたため、実際のループは1回だけ反復されました。さまざまな消費者(一部は多くのメッセージを通じて繰り返されます)は抽象的な父親(この男性)を共有しているため、そのようにコーディングされています。 numMss部分は、このコンシューマーにとってアドホックでした。

for (boolean exit= false;!exit;)
{
   Records = consumer.poll(config.pollTime);
   for (Record r:records) {
       processRecord(r); //do my things
       numMss++;
       if (numMss==maximum) //maximum=5
          exit=true;
   }
}

これを考慮に入れると、問題はpoll()メソッドが5つ以上のメッセージを取得できることです。たとえば、10個のメッセージを受け取った場合、Kafkaはすでに消費されていると考えるので、他の5つのメッセージは永久に忘れられます。

私はオフセットをコミットしようとしましたが、動作していないようです:

    consumer.commitSync(Collections.singletonMap(partition,
    new OffsetAndMetadata(record.offset() + 1)));

オフセット構成でも、コンシューマを再度起動するたびに6番目のメッセージから開始しない、5つのメッセージが必要だったことを思い出してください) 、しかし11thから(最初のポーリングは10メッセージを消費したため)。

これには解決策がありますか、またはおそらく(間違いなく)何かが欠けていますか?

前もって感謝します!!

13
aran

max.poll.recordsを任意の数に設定して、各ポーリングで多くてもその数のレコードを取得できます。

この問題で述べたユースケースでは、自分で明示的にオフセットをコミットする必要はありません。 enable.auto.committrueに設定し、auto.offset.resetearliestに設定するだけで、コンシューマが存在しないときに起動するgroup.id(他の単語パーティションからの読み取りを初めて開始することについてです)。 group.idといくつかのコンシューマオフセットをKafkaに保存し、Kafka=コンシューマプロセスが停止した場合、最後にコミットされたオフセットから続行しますコンシューマが起動すると、コミットされたオフセットがあるかどうかを最初に検索し、存在する場合は最後にコミットされたオフセットから続行し、auto.offset.resetwo n'tキックインするため、デフォルトの動作です。

13
user1870400

auto.offset.resetプロパティを「最新」に設定します。次に、消費を試行します。コミットされたオフセットから消費されたレコードを取得します。

または、ポーリングの前にconsumer.seek(TopicPartition、offset)apiを使用します。

0
Hussain

Enable.auto.commitをfalseに設定して自動コミットを無効にした場合。オフセットを手動でコミットする場合は、無効にする必要があります。次のpoll()の呼び出しがないと、以前のpoll()から受け取ったメッセージの最新のオフセットが自動的にコミットされます。

0
Deeps

Kafka 0.9からauto.offset.resetパラメーター名が変更されました。

Kafkaに初期オフセットがない場合、または現在のオフセットがサーバー上にもう存在しない場合(たとえば、そのデータが削除されたため)):

earliest: automatically reset the offset to the earliest offset

latest: automatically reset the offset to the latest offset

none: throw exception to the consumer if no previous offset is found for the consumer's group

anything else: throw exception to the consumer.
0
Amit_Hora