较新版本的Kafka生产商是否还有“producer.type”?

时间:2017-08-25 03:17:05

标签: java apache-kafka producer

旧版本的doc说它是必不可少的属性之一。

较新版本的doc根本没有提及它。

较新版本的Kafka制作人是否还有producer.type

或者,新制作人总是async,我应该致电future.get()使其成为sync

2 个答案:

答案 0 :(得分:1)

新生产者始终是异步的,您应该调用future.get()使其同步。当添加future.get()之类的东西给你基本相同的功能时,不值得制作两个apis方法。

来自send()的文档

https://kafka.apache.org/0110/javadoc/index.html?org/apache/kafka/clients/producer/KafkaProducer.html

  

由于send调用是异步的,因此返回Future   将分配给此记录的RecordMetadata。调用get()   这个未来将阻止,直到相关的请求完成然后   返回记录的元数据或抛出任何异常   发送记录时发生了。

     

如果你想模拟一个简单的阻塞调用你可以调用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();

答案 1 :(得分:0)

为什么要让send()同步?

这是批量邮件的kafka功能,可提高吞吐量。

  

异步发送

     

批处理是效率的重要驱动因素之一,并且为了实现批处理,Kafka生产者将尝试在内存中累积数据并在单个请求中发送更大批量。批处理可以配置为累积不超过固定数量的消息,并且等待不超过一些固定的延迟限制(例如64k或10ms)。这允许累积更多字节以发送,并且在服务器上几乎没有更大的I / O操作。这种缓冲是可配置的,并提供了一种机制来权衡少量的额外延迟以获得更好的吞吐量。

没有办法进行发送同步,因为api只支持异步方法,但是你可以指定一些配置来做一些工作。

您可以将batch.size设置为0.在这种情况下,将禁用消息bacthing。

但是我认为您应该保留默认 batch.size 并将 linger.ms 设置为0(这也是默认设置)。在这种情况下,如果许多消息同时出现,它们将立即在一次发送中进行批处理。

  

生产者将请求传输之间到达的任何记录组合到一个批处理请求中。通常情况下,只有在记录到达的速度超过发送速度时才会在负载下发生。

如果您想确保邮件成功发送并保留,您可以将确认设置为-1或1,将重试设置为3(例如)< / p>

有关生产者配置的更多信息,您可以参考https://kafka.apache.org/documentation/#producerconfigs