【问题标题】:How to achieve that a task just run on one instance with spring-boot microservice architecture如何使用 spring-boot 微服务架构在一个实例上运行一项任务
【发布时间】:2016-09-11 13:04:04
【问题描述】:

有一个名为 AccountService 的服务。需要 5 个实例来支持流量。所有这些实例都在 docker 容器中运行。现在我需要运行一个计划任务。这个任务应该只在单个 AccountService 实例上运行。但是不是所有五个实例。哪个不重要

我的问题是如何配置来实现这个。eureka可以做到吗?而且zookeeper似乎有能力管理集群。我需要将AccountService注册到Zookeeper中吗?

希望有人能和我分享经验

【问题讨论】:

标签: spring spring-boot spring-boot-actuator


【解决方案1】:

考虑使用 Redis 之类的共享数据存储,或者,如果您已经在使用数据库,则考虑使用数据库中的表来获得任务锁。第一个出现的实例可以获取锁,运行任务,然后释放锁。

【讨论】:

  • 这样的话,可能就不需要锁db了。只要从db中查询一个结果,如果一个实例得到了,然后更新它。所以状态改变了,其他实例不会执行任务作为查询结果不是我想要的。
【解决方案2】:
  1. 在您的依赖项中包含 spring-cloud-task(适用于计划任务)。
  2. 然后启用此属性 - spring.cloud.task.single-instance-enabled=true
  3. 添加 Spring 集成 依赖项。从这里复制/粘贴 - https://docs.spring.io/spring-cloud-task/docs/current/reference/#features-single-instance-enabled

注意: 锁被创建并存储在 TASK_LOCK 表下。确保其干净,否则您将无法重新启动。

【讨论】:

    【解决方案3】:

    使用基于Spring的任务调度@Schedule

    了解更多click here

    【讨论】:

      猜你喜欢
      • 2019-02-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-11
      • 2015-07-12
      • 2019-07-15
      • 1970-01-01
      • 2022-01-15
      • 2016-01-27
      相关资源
      最近更新 更多