是否可以仅在一个实例上启动调度程序?

问题描述

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

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

在localhost上,一切正常,但是在暂存环境中,有时我的API任务具有多个实例,并且在同一确切时间启动了多个cronjob。因此,我不必为每条记录工作,而是为同时运行的每条记录都有多个工作。这是一个大问题。

是否有一种方法可以处理这种情况,并且只执行一个实例的cronjob? 也许我可以有一个任务定义(仅在一个实例中始终包含调度程序部分),而API和redis包含多个实例?

问题在于我编写的代码与后端紧密相连,因此我无法使用lambda函数或其他外部服务之类的东西。

解决方法

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