我在Openshift上部署了一个应用程序,我使用了至少2个pod。
我的战争包含一个由Spring cron安排的Spring Batch应用程序。
当然,每个pod同时启动同一批,这是我的问题/问题。
有没有办法避免这种行为?我想只启动一个批处理实例(或者有没有办法配置Spring批处理以检查批处理是否已经运行?)
提前致谢。
答案 0 :(得分:1)
假设您使用部署,这不是微不足道的,但这里有一些可以帮助您的想法。
使用Kubernetes的ScheduledJobs / CronJobs。这意味着您将完全放弃控制从您的应用程序启动批处理并启动专用pod以执行批处理作业并死亡
使用主选手边车建立执行批次的权利(https://github.com/kubernetes/contrib/tree/master/election)
自行实施一些锁定机制
使用StatefulSet和绑定批处理只能在特定的主机名上运行(即通过config var传递给Pods,如BATCH_HOSTNAME.StatefulSets具有确定性名称,因此您可以说该批处理应仅在my-pods-0
<上运行/ p>
答案 1 :(得分:0)
听起来你需要在你的情况下选举领袖。 Spring Integration提供了领导者选举功能,您可以使用它来确定谁是主人。那个主人将是真正开始工作的人。另一个会忽略预定的事件。您可以在此处的文档中阅读有关Spring Integration的领导者选举的更多信息:https://docs.spring.io/spring-integration/api/org/springframework/integration/support/leader/LockRegistryLeaderInitiator.html