旧版本的doc说它是必不可少的属性之一。
较新版本的doc根本没有提及它。
较新版本的Kafka制作人是否还有producer.type
?
或者,新制作人总是async
,我应该致电future.get()
使其成为sync
?
答案 0 :(得分:1)
新生产者始终是异步的,您应该调用future.get()使其同步。当添加future.get()之类的东西给你基本相同的功能时,不值得制作两个apis方法。
来自send()的文档
由于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