【问题标题】:Is it possible to have a scheduler starting only on one instance?是否可以让调度程序仅在一个实例上启动?
【发布时间】:2020-12-31 14:53:08
【问题描述】:

我在 AWS ECS 上部署了一个用 Adonis v4.1 (node.js) 编写的后端。 在我的 API 的任务定义中,我有 Adonis 和 Redis,它们通过桥接网络链接。

我使用 adonis-scheduler 每 30 分钟运行一次 cronjob。此 cronjob 进行数据库查询,并为每一行创建一个作业(使用 adonis-queue-pro 库)。作业并发为 1(因此,如果我有 30 条记录,一次将处理一项作业)。每个作业都会进行外部 API 调用并更新数据库中的记录。

在本地主机上一切正常,但在暂存环境中有时会发生我的 API 任务有多个实例并且多个 cronjob 在同一确切时间启动。因此,我没有为每条记录工作,而是为同时运行的每条记录提供多个工作。这是个大问题。

有没有办法处理这种情况并且只执行一个实例的 cronjob? 或者也许我可以有一个任务定义,其中只有一个实例中的调度程序部分(总是),而 API 和 redis 有很多实例?

问题是我写的代码与我的后端有很深的联系,所以我不能使用像 lambda 函数或其他外部服务这样的东西。

【问题讨论】:

    标签: node.js cron scheduler amazon-ecs adonis.js


    【解决方案1】:

    使用 ECS,您可以拥有 REPLICADAEMON 服务类型。 DAEMON 确保只有一个任务实例放置在集群中的每个实例上。在您的情况下,这意味着在集群后面只有一个实例。如果这个限制是可以接受的,试一试,看看问题是否仍然存在。

    【讨论】:

    • 感谢您的回答。我正在尝试遵循您的方法:我仅为我的调度程序创建了一个任务定义并将其设置为DAEMON。但它向我显示Desired count 2 (Automatic),因此默认情况下它将 2 个实例设置为所需的数量。在服务创建期间,我无法编辑此字段。我希望它始终是 1 个活动任务,并且在部署时我想先让活动任务停止,然后再启动新任务。我怎样才能做到这一点?
    • 集群后面有多少个 EC2 实例?这会强制启动任务的数量。
    猜你喜欢
    • 2018-05-31
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    • 2022-08-16
    • 1970-01-01
    • 1970-01-01
    • 2014-01-19
    • 2013-06-13
    相关资源
    最近更新 更多