Apache kafka 卡夫卡在批处理写入方面有哪些原子性保证(如果有)?

Apache kafka 卡夫卡在批处理写入方面有哪些原子性保证(如果有)?,apache-kafka,atomicity,Apache Kafka,Atomicity,我们现在正在将我们的一项服务从通过传统通信技术推送数据转移到ApacheKafka 当前的逻辑是向IBM MQ发送一条消息,并在出现错误时重试。我想重复一遍,但我不知道在这种情况下经纪人提供了什么样的担保 假设我通过producer通过Java客户端库批量发送100条消息。假设它到达集群,是否有可能只接受其中的一部分(例如,磁盘已满,或者我在写操作中接触到的某些分区未被复制)?我能从我的制作者那里检测到这个问题,然后只重试那些不被接受的消息吗 我搜索了卡夫卡原子性保证,但结果是空的,可能有一个众

我们现在正在将我们的一项服务从通过传统通信技术推送数据转移到ApacheKafka
当前的逻辑是向IBM MQ发送一条消息,并在出现错误时重试。我想重复一遍,但我不知道在这种情况下经纪人提供了什么样的担保
假设我通过producer通过Java客户端库批量发送100条消息。假设它到达集群,是否有可能只接受其中的一部分(例如,磁盘已满,或者我在写操作中接触到的某些分区未被复制)?我能从我的制作者那里检测到这个问题,然后只重试那些不被接受的消息吗

我搜索了
卡夫卡原子性保证
,但结果是空的,可能有一个众所周知的术语

当你说你在一批中发送100条消息时,你的意思是,你想控制消息的数量,还是让制作者批处理一定数量的消息,然后再发送该批

因为不确定您是否可以控制一个生产者批处理中生成的消息的数量,API将为您对它们进行排队和批处理,但不保证将它们全部批处理在一起(不过我会检查一下)

如果您同意让API为您批处理一定数量的消息,下面是一些关于如何确认消息的线索

与制作人打交道时,卡夫卡在写操作(也叫“批写”)方面具有某种可靠性

如本幻灯片所述: (83)

所以关于原子性。。就上述行为而言,不确定整个批次是否会被视为原子。也许您可以保证为每条消息使用相同的密钥发送一批消息,因为它们将进入相同的分区,因此可能会变成原子

如果您需要更清楚地了解生成时的确认规则,请参见此处所述的确认规则的工作原理:

如果您的目标是在生产过程中没有重复项,则还可以查看producer enable.幂等行为


Yannick

我同意客户为我进行批处理(我知道内部队列)-很抱歉,我不清楚这个问题。我不能为一个批处理中的所有消息指定相同的密钥,因为我需要基于其他字段进行分区。因此,如果客户端发送队列已满,它将向每个相应的分区叶程序发送3个微批处理,其中一个已确认-我想由客户端决定是否引发异常?是的,客户端可以对KafkaProducer.send()调用(异步)的未来结果执行get(),在元数据中,如果我没记错的话,每个分区应该有类似于result的结果。(
根据ReplicaManager类代码映射[TopicPartition,LogAppendResult]
)。在未来,您将拥有元数据和异常(如果发生错误),您可以检查此异常并执行任何您认为有用的操作。还有另一个选项-使用。它有一些限制,主要的限制是必须设置
acks=all
,这意味着如果至少有一个经纪人出现问题,制作人将暂停
The original list of messages is partitioned (randomly if the default partitioner is used) based on their destination partitions/topics, i.e. split into smaller batches. 
Each post-split batch is sent to the respective leader broker/ISR (the individual send()’s happen sequentially), and each is acked by its respective leader broker according to request.required.acks
You can control the durability of messages written to Kafka through the acks setting. 
The default value of "1" requires an explicit acknowledgement from the partition leader that the write succeeded. 
The strongest guarantee that Kafka provides is with "acks=all", which guarantees that not only did the partition leader accept the write, but it was successfully replicated to all of the in-sync replicas.