Producer 的职责是把 record 发往 broker。
一条 record 需要指定 topic。可以指定 partition 及 key:
发往同个 partition 的纪录,会被攒成一批次(batch)一起发过去。
发送成功后,Kafka 会返回该 record 的 topic、partition 及 partition 中的 offset。
Kafka 的 Java 库提供这些方式
AsyncProducer
中支持这种模式send()
返回一个 Future 对象;Future.get()
会阻塞直至返回成功失败send()
带有一个 callback 参数Producer 可以配置成自动重试。
可以给 producer 配置 acks 参数,来表示分区 leader 在什么情况下对写请求作出回应。
acks=0 | 不等 leader 回应;client 不知道有没有写成功 |
---|---|
acks=1 | leader 在落自己 log 成功后回应;如果此时 leader 挂掉,有可能丢数据 |
acks=all | leader 在自己及所有 follower 落盘成功后返回。除非所有 replicas 挂掉,否则不会丢数据 |
如果 record 有 key,默认的 Partitioner
会采用 key 的 hash 来确定分区。根据 batch.size
及 linger.ms
参数,这些 record 会攒成一批次发送给 broker。
如果 record 不带 key:
参考文档: