Kafkaで同期メッセージを送信する方法は?
これを実現する1つの方法は、プロパティパラメータを設定することです。max.in.flight.requests.per.connection = 1
。
しかし、kafkaで同期メッセージを送信する直接または代替の方法があるかどうかを知りたいです。 (producer.syncSend(...)などのようなもの)。
プロデューサー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();
ティロが提案した答えは、進むべき道です。一般に、max.in.flight.requests.per.connection = 1の使用に関する提案は、メッセージの順序を失うことなく、再試行を有効にするために使用されます。同期プロデューサーを持つためにはあまり使用されません。
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);
Kafka :-)での私の冒険から、メッセージ生成の順序は、プロデューサースレッドが1つあり、max.in.flight.requests.per.connection
= 1(またはretries
の順番)を設定した場合にのみ保証されます。 、つまりretries
= 0または両方)。
複数のプロデューサーにスケーリングする場合は、同じパーティションに格納されるメッセージが同じプロデューサーインスタンスによって生成されることを「確認」する必要があります。