【问题标题】:Run Scheduled Cron method in Spring from single pod if multiple pods exist on Kubernetes如果 Kubernetes 上存在多个 pod,则在 Spring 中从单个 pod 运行 Scheduled Cron 方法
【发布时间】:2020-02-20 00:48:22
【问题描述】:

我正在 Kubernetes 上为我的 Spring 应用程序从单个 pod(docker 映像)转移到多个 pod 以进行负载处理。但是我遇到了一个问题,因为我的应用程序中有一个 cron 调度程序方法,该方法每天在特定时间运行。如果我部署多个 pod,它们会同时运行,因此多个条目会保存到我的数据库中,但我只需要一个 pod 来执行该功能。

我曾考虑生成 java uuid 并将其保存在数据库中,因为该函数开始在每个 pod 上执行。然后在同一个函数中,放置一个 5 秒的睡眠定时器,并比较每个 pod 中数据库的 uuid。最新更新数据库中值的 pod 将匹配该值并提前执行该方法。

这是一个好方法吗?如果没有,请提出可以解决此问题的建议。

【问题讨论】:

  • 我有同样的问题你找到解决办法了吗?
  • 嘿,我正在使用上面提到的创建 uuid 并从 db(或 redis)中的单个 pod 中仅保存 1 个 uuid 并添加睡眠时间的策略。睡眠时间结束后,我匹配代码中每个 pod 中的 uuid,下一行代码从 uuid 与从 db 获取的 uuid 匹配的 pod 执行。这可能不是最好的方法,但对我来说效果很好,因为这些是 cron 作业,并且一定程度的延迟是可以接受的。

标签: java spring spring-boot kubernetes quartz-scheduler


【解决方案1】:

此外,您可以将工作负载转移到一个独立的进程中,这将很有帮助且更干净,请查看https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/ 这会给您一个想法。

【讨论】:

    【解决方案2】:

    您可以使用带有 JDBC 存储的石英调度程序。这将自动满足您的要求。

    简而言之:“负载平衡会自动发生,集群的每个节点都会尽快触发作业。当触发器的触发时间发生时,第一个获取它的节点(通过对其加锁)是将触发它的节点。”

    详情请参考官方链接-http://www.quartz-scheduler.org/documentation/quartz-2.3.0/configuration/ConfigJDBCJobStoreClustering.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-19
      相关资源
      最近更新 更多