web-dev-qa-db-ja.com

メッセージがプロデューサーによって生成された場合、Kafkaブローカーから確認応答を取得する方法は?

メッセージを作成するときにブローカーから応答を受け取りたいのですが。 KafkaProducer.sendで使用されるCallBackメカニズム(CallBackを実装することによる)を試しましたが、機能せず、onCompletionメソッドを呼び出しません。

Kafkaサーバーをシャットダウンしてメッセージを生成しようとすると、コールバックメソッドが呼び出されます。

承認を得る他の方法はありますか?

@Override
    public void onCompletion(RecordMetadata metadata, Exception exception) {
        long elapsedTime = System.currentTimeMillis() - startTime;
        System.out.println("Called Callback method");
        if (metadata != null) {
            System.out.println("message(" + key + ", " + message
                    + ") sent to partition(" + metadata.partition() + "), "
                    + "offset(" + metadata.offset() + ") in " + elapsedTime
                    + " ms");
        } else {
            exception.printStackTrace();
        }

    }

props.put("bootstrap.servers", "localhost:9092");
props.put("client.id", "mytopic");
props.put("key.serializer", org.Apache.kafka.common.serialization.StringSerializer.class);
props.put("value.serializer", org.Apache.kafka.common.serialization.ByteArraySerializer.class);

KafkaProducer<String, byte[]> producer = new KafkaProducer<String,byte[]>(props);
long runtime = new Date().getTime(); 
String ip = "192.168.2."+ rnd.nextInt(255); 
String msg = runtime + ".www.ppop.com," + ip;
producer.send(new ProducerRecord<String, byte[]>("mytopic", msg.getBytes()), `new TransCallBack(Calendar.getInstance().getTimeInMillis(), key, msg));`

kafka-client api0.9.1とブローカーバージョン0.8.2を使用しています。

8
usman

kafka 0.9バージョンを使用してKafkaProducerによってメッセージを公開した後、ブローカーから情報を取得する簡単な方法があります。次のような情報を取得できるRecordMetadataオブジェクトを返すget()メソッドを呼び出すことができます。例として、コードスニペットの下のoffset、topicPartition:

RecordMetadata m = kafkaProducer.send(new ProducerRecord<byte[], byte[]>(
                        topic, key.getBytes("UTF-8"), message
                                .getBytes("UTF-8"))).get();
System.out.println("Message produced, offset: " + m.offset());
System.out.println("Message produced, partition : " + m.partition());
System.out.println("Message produced, topic: " + m.topic());
4
Hugo Carmona

そのため、Kafkaでどのバージョンがどのバージョンで動作するかを100%確信していません。現在私は0.8.2を使用していますが、0.9でいくつかの重大な変更が導入されたことは知っていますが、現在何が機能するのか、何が機能しないのかを明確に伝えることはできませんでした。

非常に強力な推奨事項の1つは、ブローカーのバージョンに対応するKafka-Clientバージョンを使用することです。ブローカー0.8.2を使用している場合は、kakfa-client0.8.2も使用します。

あなたはこれをどのように使用しているかのコードを提示したことがないので、私は暗闇の中で少し推測しています。しかし、プロデューサーで このメソッド を使用してKafka 0.8.2にコールバック機能を実装しました。以下は、メソッドのシグネチャです。

public Java.util.concurrent.Future<RecordMetadata> send(ProducerRecord<K,V> record, Callback callback)

そのメソッドをどこで呼び出すのか、実際にはオーバーライドされたメソッドを使用してクラスを渡します。

KafkaProducer<String, String> prod = new KafkaProducer<String, String>(props);
ProducerRecord<String, String> record = //data to send to kafka
prod.send(record, new Callback() {
  @Override
  public void onCompletion(RecordMetadata metadata, Exception e) {
    if (e != null) {
      e.printStackTrace();
    } else {
      //implement logic here, or call another method to process metadata
      System.out.println("Callback");
    }
  }
}); 

私はあなたがそれをしたようにそれをする方法もあると思います。ただし、実際にレコードをKafkaに送信する方法を示すコードを提供する必要があります。それ以外は私が推測しているだけです。

4
Morgan Kenyon

すべてのメッセージの公開が完了したら、次のようにプロデューサーを閉じます。

producer.close();

これにより、コールバックから次のメソッドが常に呼び出されるようになります。

onCompletion(RecordMetadata metadata, Exception exception)

注意:その行を このサンプルのProducerクラス に追加してこれをテストしましたが、機能します。

3
user3881282