【问题标题】:Spring Batch - handle worker configuration errorSpring Batch - 处理工作人员配置错误
【发布时间】:2021-09-17 08:28:19
【问题描述】:

我们有一个 Spring Batch 应用程序计划每 30 分钟运行一次,它在云上创建工作人员作为单独的 pod。

在 Configuration 类中,其中一个 bean 连接到数据库并读取一些属性。如果此 DB 连接由于某种原因失败,则 Worker 不会启动,并且 Master 作业不会在 30 分钟后再次触发。

发生这种情况是因为如果 worker 在启动时失败,它不会更新 DB 中的最终状态,也不会将其作为 Failed 传达给主节点。因此,Master 假定它仍在运行并且不会再次触发 Batch。

对于如何处理这个问题以及如何确保 Master 在预定的时间内再次触发工作人员有任何建议吗?

【问题讨论】:

  • that creates workers on the Cloud as separate pods:工人是如何产生的?工人的生命周期是如何管理的?你能分享更多关于你的设置的细节吗?
  • Workers 是使用 Docker 资源加载器创建的。主作业定期运行一个查询,获取要处理的记录列表。一旦有了列表,它会根据列表的大小生成一个或多个工作 pod,并在它们之间分配负载。然后这些工作 pod 处理数据,并进入 Completed 状态。
  • 如果工人不报告,经理无法知道工人的状态。然而,管理员可以为此配置timeout。因此,如果您希望管理器在下一个计划运行之前失败,您需要将超时设置为低于 30 分钟的值。也就是说,我建议让每个计划都有自己的工作,这样失败的工作不会影响后续计划。
  • 谢谢。是否还有一个方便的属性可以添加到 application.properties 来设置超时(找不到)或者我们必须通过代码设置它?
  • 不,您可以在MessageChannelPartitionHandler 或通过构建器RemotePartitioningManagerStepBuilder#timeout 设置超时。

标签: java spring spring-batch


【解决方案1】:

问题在于高可用性。

你可以在db前面添加redis。如果我们无法从redis读取配置然后连接db。

第二,将resilience4j之类的重试服务添加到您的bean中以多次读取您的配置。

3rd,对于警告,您可以添加云的相关警告服务,以通知您哪个 pod 启动失败。然后您可以手动或自动重启该 pod。

【讨论】:

  • 好的,我们可以添加弹性读取多次和Redis层,但是没有办法自动重新调度,以便调度器运行并再次触发批处理?问题是在生产中,批次计划在夜间运行。各种维护活动也在夜间进行。因此,如果正在进行维护活动并且批处理恰好在同一时刻被触发,那么它根本不会在第二天运行,除非我们手动重新启动它。
  • 对不起。我在 10 月做了一个噩梦来实现一个实时消息队列,以至于我什至没有时间检查 stackoverflow 上的消息。我想我现在明白你的意思了。您必须需要服务注册表和发现。如果 worker pod 由于维护或任何其他错误而失败。我们会收到通知。如果您的石英作业在 30 分钟的日程安排上,则专属日程安排服务会通知工人在 30 分钟后完成作业。如果这 30 分钟的延迟会影响您的系统,您必须将错误信息保存到某个位置,然后在中心重新启动工作人员后调用它。
猜你喜欢
  • 2017-10-14
  • 1970-01-01
  • 1970-01-01
  • 2018-09-18
  • 1970-01-01
  • 1970-01-01
  • 2014-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多