web-dev-qa-db-ja.com

kafkaで同期メッセージを送信しますか?

Kafkaで同期メッセージを送信する方法は?
これを実現する1つの方法は、プロパティパラメータを設定することです。
max.in.flight.requests.per.connection = 1

しかし、kafkaで同期メッセージを送信する直接または代替の方法があるかどうかを知りたいです。 (producer.syncSend(...)などのようなもの)。

4
user8339674

プロデューサーAPIは、Futureからsendを返します。 Future#getを呼び出して、送信が完了するまでブロックできます。

これを参照してください Javadocの例

単純なブロッキング呼び出しをシミュレートする場合は、すぐにget()メソッドを呼び出すことができます。

 byte[] key = "key".getBytes();
 byte[] value = "value".getBytes();
 ProducerRecord<byte[],byte[]> record = 
     new ProducerRecord<byte[],byte[]>("my-topic", key, value)
 producer.send(record).get();
4
Thilo

ティロが提案した答えは、進むべき道です。一般に、max.in.flight.requests.per.connection = 1の使用に関する提案は、メッセージの順序を失うことなく、再試行を有効にするために使用されます。同期プロデューサーを持つためにはあまり使用されません。

1
ppatierno

Thiloが提案したように、送信が完了するまでFuture#getを呼び出してブロックできます。ただし、プロデューサーキューにbatch.size要素がある場合、サイズbuffer.memoryのバッファーがいっぱいになる場合、またはmax.block.msミリ秒後にプロデューサーが送信を開始するため、パフォーマンスの問題が発生する可能性があります。

Kafkaにプッシュするスレッドの数が限られている場合は、メッセージが送信されるまで毎回max.block.ms待つ必要があります。したがって、場合によっては、以下を使用することをお勧めします。

// send message to producer queue
Future<RecordMetadata> future = producer.send(new ProducerRecord<>(topic, key, message));
// flush producer queue to spare queuing time
producer.flush();
// throw error when kafka is unreachable
future.get(10, TimeUnit.SECONDS);
0
Camille Vienot

Kafka :-)での私の冒険から、メッセージ生成の順序は、プロデューサースレッドが1つあり、max.in.flight.requests.per.connection = 1(またはretriesの順番)を設定した場合にのみ保証されます。 、つまりretries = 0または両方)。

複数のプロデューサーにスケーリングする場合は、同じパーティションに格納されるメッセージが同じプロデューサーインスタンスによって生成されることを「確認」する必要があります。

0
Vassilis