当前位置: 首页 > 知识库问答 >
问题:

Kafka在批处理写入方面有什么原子性保证(如果有的话)?

太叔航
2023-03-14

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

共有1个答案

庄飞
2023-03-14

当你说你一批发送100条消息时,你的意思是,你想控制这个消息的数量,还是让生产者批量发送一定数量的消息,然后批量发送?

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

如果您不介意让API为您批处理一定数量的消息,以下是有关如何确认它们的一些线索。

与制作人打交道时,Kafka在写操作(也叫“批量写”)方面有一定的可靠性

如本幻灯片分享帖子所述:https://www.slideshare.net/miguno/apache-kafka-08-basic-training-verisign(83)

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

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

如果您在制作时需要更清楚地了解认知规则,请参阅此处所述的工作原理https://docs.confluent.io/current/clients/producer.html :

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.

你也可以四处看看。幂等性行为,如果你的目标是在生产过程中没有重复项。

扬尼克

 类似资料:
  • 主要内容:可见性,原子性,举个例子首先要了解的是,volatile可以保证可见性和顺序性,这些都很好理解,那么它为什么不能保证原子性呢? 可见性 可见性与Java的内存模型有关,模型采用缓存与主存的方式对变量进行操作,也就是说,每个线程都有自己的缓存空间,对变量的操作都是在缓存中进行的,之后再将修改后的值返回到主存中,这就带来了问题,有可能一个线程在将共享变量修改后,还没有来的及将缓存中的变量返回给主存中,另外一个线程就对共享变量

  • 主要内容:可见性,原子性,举个例子首先要了解的是,volatile可以保证可见性和顺序性,这些都很好理解,那么它为什么不能保证原子性呢? 可见性 可见性与Java的内存模型有关,模型采用缓存与主存的方式对变量进行操作,也就是说,每个线程都有自己的缓存空间,对变量的操作都是在缓存中进行的,之后再将修改后的值返回到主存中,这就带来了问题,有可能一个线程在将共享变量修改后,还没有来的及将缓存中的变量返回给主存中,另外一个线程就对共享变量

  • 问题内容: 我是hibernate的新手,我对hibernate批处理有疑问,我读了一些有关hibernate批处理的教程,他们说 Hibernate将所有持久化的对象缓存在会话级缓存中,最终您的应用程序将在第50,000行附近出现OutOfMemoryException崩溃。如果您将批处理与Hibernate一起使用,则可以解决此问题, 我的疑问是不是要在外部初始化会话,为什么我们不能将其初始化

  • 问题内容: 给定一个简化的表结构,如下所示: 我可以使用这样的子查询插入记录而不会导致竞争条件吗? 还是子查询不是原子的?我担心同时s获取相同的值,然后导致唯一约束冲突。 问题答案: 是的,这肯定可以创建竞争条件,因为尽管保证所有语句都是原子的,但这并不要求它们在查询执行的各个部分中对不变的数据集进行操作。 客户提交您的上述查询。只要引擎找到只持有与其他读取器兼容的锁的锁,则另一个客户端可以在执行

  • 我被删除时的火神留档弄糊涂了。留档说: 也不能保证删除操作会统一成功或失败,因此请准备好处理部分删除的情况......没有原子删除集合的操作。 https://cloud.google.com/firestore/docs/solutions/delete-collections 我不知道上面的语句是否只是指示例中的云函数,还是通常执行大规模删除。 然而,批写入可以执行删除,并且它们是原子的。因此

  • 本文向大家介绍Kafka有内部的topic吗?如果有是什么?有什么所用?相关面试题,主要包含被问及Kafka有内部的topic吗?如果有是什么?有什么所用?时的应答技巧和注意事项,需要的朋友参考一下 __consumer_offsets,保存消费者offset