Apache kafka Kafka Streams:在至少使用一次_时,是否可以保证将存储排序到状态存储?

Apache kafka Kafka Streams:在至少使用一次_时,是否可以保证将存储排序到状态存储?,apache-kafka,apache-kafka-streams,Apache Kafka,Apache Kafka Streams,我们有一个用处理器API构建的Kafka Streams Java拓扑 在拓扑结构中,我们只有一个处理器,可以保存到多个状态存储 当我们至少使用一次时,我们希望看到状态存储之间存在一些不一致的情况,例如,传入的记录会导致写入状态存储A和B,但存储之间的崩溃只会导致写入Kafka更改日志主题的存储A 我们是否保证保存的顺序也将是写入状态存储的顺序?例如,如果我们先保存到存储A,然后保存到存储B,我们当然会出现写入两个更改日志成功的情况,以及只有写入更改日志A已完成的情况,但我们是否也会出现只有写入

我们有一个用处理器API构建的Kafka Streams Java拓扑

在拓扑结构中,我们只有一个处理器,可以保存到多个状态存储

当我们至少使用一次时,我们希望看到状态存储之间存在一些不一致的情况,例如,传入的记录会导致写入状态存储A和B,但存储之间的崩溃只会导致写入Kafka更改日志主题的存储A

  • 我们是否保证保存的顺序也将是写入状态存储的顺序?例如,如果我们先保存到存储A,然后保存到存储B,我们当然会出现写入两个更改日志成功的情况,以及只有写入更改日志A已完成的情况,但我们是否也会出现只有写入更改日志B已完成的情况

  • 什么情况会导致重播?当然是崩溃——但是重新平衡、新的代理分区领导者,或者当我们遇到“Offset commit failed”错误(请求超时)时,又该怎么办呢

  • 前一段时间,我们曾经尝试使用过一次,这导致了很多错误消息,这对我们来说毫无意义。您是否会给我们跨多个状态存储的原子写入

  • 公元3年。根据我的想法,
    eaxctly\u once
    可以跨多个状态存储进行原子写入

    调用stream.commit()时,将按顺序执行以下步骤:

  • 刷新本地状态存储(KTable缓存),以确保所有更改日志记录都发送到下游
  • 调用producer.sendOffsetsToTransactions(offset)提交当前记录的消费者在事务中的位置。请注意,尽管线程的使用者可以在多个任务(因此多个生产者)之间共享,但任务的分配分区始终是独占的,因此只提交此任务的分配分区的偏移量是安全的
  • 调用producer.commitTransaction()以提交当前事务。因此,以上述三元组表示的任务状态是原子提交的
  • 再次调用producer.beginTransaction()以启动下一个事务
  • 公元3年。根据我的想法,
    eaxctly\u once
    可以跨多个状态存储进行原子写入

    调用stream.commit()时,将按顺序执行以下步骤:

  • 刷新本地状态存储(KTable缓存),以确保所有更改日志记录都发送到下游
  • 调用producer.sendOffsetsToTransactions(offset)提交当前记录的消费者在事务中的位置。请注意,尽管线程的使用者可以在多个任务(因此多个生产者)之间共享,但任务的分配分区始终是独占的,因此只提交此任务的分配分区的偏移量是安全的
  • 调用producer.commitTransaction()以提交当前事务。因此,以上述三元组表示的任务状态是原子提交的
  • 再次调用producer.beginTransaction()以启动下一个事务

  • 没有至少一次的订购担保。-常规的重新平衡不应该有任何影响,因为在重新平衡时,首先所有的处理都已完成(即,已刷新的存储和已提交的输入主题偏移)。与您描述的其他场景类似(如果您正确配置了代理和应用程序),这些错误“new broker partition leader”或“offset commit failed”应该在后台处理,而不是影响订单。没有至少一次的订单保证。-常规的重新平衡不应该有任何影响,因为在重新平衡时,首先所有的处理都已完成(即,已刷新的存储和已提交的输入主题偏移)。与您描述的其他场景类似(如果您正确配置了代理和应用程序),这些错误“new broker partition leader”或“offset commit failed”应该在后台处理,而不是影响订单。