Spring 批处理 - 在 worker 崩溃时重新启动行为
Spring Batch - restart behavior upon worker crash
我一直在探索 Spring 使用远程分区时批处理在某些失败情况下的工作方式。
假设我有 3 个工作节点和 1 个管理节点。管理器节点创建 30 个分区,工作人员可以选择这些分区。消息层是 Kafka。
工人们已经起床,等待特定主题的工作到来。管理器节点创建分区,将它们放入数据库并在具有 3 个分区的 Kafka 主题上发送消息。
所有节点都已开始处理,但突然有一个节点崩溃了。崩溃的节点会将其最初选择的分区的步骤执行状态设置为 STARTED/STARTING。
由于 Kafka 分区将被撤销和重新分配,另一个节点将进行救援,因此两个节点之间的一个节点将读取崩溃节点所做的分区。
在这种情况下,当然不会发生任何事情,因为原始的 Kafka 偏移量已由崩溃的节点提交,即使处理尚未完成。假设当分区被重新分配时,我将消费者设置回主题的开头 - 对于它管理的分区。
太棒了,这样消费者将开始从崩溃节点的分区中消费消息。
这就是问题所在。即使崩溃节点处理的某些步骤执行处于 COMPLETED 状态,接管的新节点将再次重新处理该特定步骤执行,即使它之前已由崩溃节点完成。
这对我来说似乎很奇怪。
也许我试图以错误的方式解决这个问题,不确定,但我很感激任何关于如何让工作人员对崩溃容错的建议。
谢谢!
如果 StepExecution
在作业存储库中标记为 COMPLETED
,则不会重新处理。没有数据将再次 运行。可能会创建一个新的 StepExecution
(我现在没有代码在我面前)但是当 Spring Batch 根据之前的 运行 评估要做什么时,它不会'不要再处理了。这是 Spring Batch 分区工作方式的一个关键特性。您可以向工作人员发送 100 条消息来处理每个分区,但由于作业存储库中的同步,它实际上只会被处理一次。如果您看到其他行为,我们需要更多信息(来自您的作业存储库和配置细节的详细信息)。
我一直在探索 Spring 使用远程分区时批处理在某些失败情况下的工作方式。
假设我有 3 个工作节点和 1 个管理节点。管理器节点创建 30 个分区,工作人员可以选择这些分区。消息层是 Kafka。 工人们已经起床,等待特定主题的工作到来。管理器节点创建分区,将它们放入数据库并在具有 3 个分区的 Kafka 主题上发送消息。
所有节点都已开始处理,但突然有一个节点崩溃了。崩溃的节点会将其最初选择的分区的步骤执行状态设置为 STARTED/STARTING。 由于 Kafka 分区将被撤销和重新分配,另一个节点将进行救援,因此两个节点之间的一个节点将读取崩溃节点所做的分区。 在这种情况下,当然不会发生任何事情,因为原始的 Kafka 偏移量已由崩溃的节点提交,即使处理尚未完成。假设当分区被重新分配时,我将消费者设置回主题的开头 - 对于它管理的分区。 太棒了,这样消费者将开始从崩溃节点的分区中消费消息。
这就是问题所在。即使崩溃节点处理的某些步骤执行处于 COMPLETED 状态,接管的新节点将再次重新处理该特定步骤执行,即使它之前已由崩溃节点完成。 这对我来说似乎很奇怪。
也许我试图以错误的方式解决这个问题,不确定,但我很感激任何关于如何让工作人员对崩溃容错的建议。
谢谢!
如果 StepExecution
在作业存储库中标记为 COMPLETED
,则不会重新处理。没有数据将再次 运行。可能会创建一个新的 StepExecution
(我现在没有代码在我面前)但是当 Spring Batch 根据之前的 运行 评估要做什么时,它不会'不要再处理了。这是 Spring Batch 分区工作方式的一个关键特性。您可以向工作人员发送 100 条消息来处理每个分区,但由于作业存储库中的同步,它实际上只会被处理一次。如果您看到其他行为,我们需要更多信息(来自您的作业存储库和配置细节的详细信息)。