Axo*_*xon 6 concurrency cron docker nestjs
在 docker 中,我们用于deploy: replicas: 3微服务。我们有一些 Cronjob,问题是运行所有 cronjob 的系统被调用 3 次,这不是我们想要的。我们只想运行一次。Nest.js 中的 cron 示例:
@Cron(CronExpression.EVERY_5_MINUTES)
async runBiEventProcessor() {
const calculationDate = new Date()
Logger.log(`Bi Event Processor started at ${calculationDate}`)
Run Code Online (Sandbox Code Playgroud)
我怎样才能只运行一次这个 cron 而不将副本更改为 1?
Amo*_*ble 20
当 cron 或后台作业是同时运行多个实例的应用程序的一部分时,这是一个相当普遍的问题。
有多种方法可以处理这种情况。如果您没有具体的解决方案,以下是一些解决方法:
仅为后台处理创建一项单独的服务,并确保一次仅运行一个实例。
将 cron 作业公开为 API 并触发 API 启动后台处理。在这种情况下,负载均衡器只会将请求移交给一个实例。这种方法将确保只有一个实例可以处理该作业。您仍然需要外部实体来访问 API,该实体可以是内部实体,也可以是第三方实体。
使用 Bull Queue 中的可重复作业功能或提供类似功能的任何其他工具或库。Bull 会将工作移交给任何活跃的处理者。这样,它可以确保作业仅由一个活动处理器处理一次。Nest.js 有相同的包装器。在此处阅读有关 Bull 队列可重复作业的更多信息。
实现自定义锁定机制听起来并不困难。其他框架中的许多其他调度程序都按照类似的原则来处理并发。
如果您没有任何其他具体选择,这些是解决方法。
| 归档时间: |
|
| 查看次数: |
11065 次 |
| 最近记录: |