【发布时间】:2020-09-30 10:46:29
【问题描述】:
我正在探索反应式 kafka,只是想确认反应式 kafka 是否等同于同步生产者。使用同步生产者,我们通过 ACK all 获得消息传递保证,并保持生产者顺序。但是,ASYNC 不能保证交付和排序。响应式生产者相当于 SYNC 还是 ASYNC?
【问题讨论】:
标签: apache-kafka kafka-producer-api reactive-kafka
我正在探索反应式 kafka,只是想确认反应式 kafka 是否等同于同步生产者。使用同步生产者,我们通过 ACK all 获得消息传递保证,并保持生产者顺序。但是,ASYNC 不能保证交付和排序。响应式生产者相当于 SYNC 还是 ASYNC?
【问题讨论】:
标签: apache-kafka kafka-producer-api reactive-kafka
反应性意味着异步。在普通的 Kafka 客户端 API 中,KafkaProducer 也是异步的。当您显式调用阻止程序执行的kafkaProducer.send().get() 时,它将变为同步。
即使使用异步生产者,也可以保证消息传递。这取决于否。重试次数和delivery.timeout.ms。
使用ack=all 可以确保在 ISR 之间复制数据,并且您可以获得具有一致性保证的容错性,以防万一代理死亡,消费者会看到想要看到的内容。
对于顺序,消息在发送之前是经过批处理的。如果多个批次像 batch-1、batch-2、batch-3 那样异步发送,如果由于某种原因 batch-1 batch-2 和 batch-3 发送后 失败,然后重新发送 batch-1 将产生 batch- 1 在 batch-2 之后,batch-3,从而使其乱序。
如果您想要序列,您需要确保将max.in.flight.requests.per.connection 设置为1,以便每个生产者在任何给定时间只能有一个请求在进行中。但是,这可能会对性能产生影响。您可能需要调整其他设置,例如 batch.size,例如增加它,以便在将飞行请求设置为 1 的情况下提高吞吐量。
因此,您认为 ASYNC 无法保证交付和排序的假设是错误的。
【讨论】: