【发布时间】:2020-05-25 01:06:16
【问题描述】:
我想要实现的是让同一应用程序的多个实例同时运行,但只有其中一个实例运行 cron,方法是将其锁定在 Postgres 数据库中。
到目前为止我的解决方案是:
- 在所有实例上运行 cron。
- 在表 cron_lock 中插入一行,并带有 cron 的唯一标识符。
- 如果我在运行插入查询时出错,很可能是因为该行已经存在(cron 标识符是表的主键)。如果是这样,我什么都不做,然后退出。
- 如果我在运行插入查询时没有出错,那么应用程序实例将运行 cron 进程。
- 在我的流程结束时,我删除了具有唯一标识符的行。
此解决方案有效,但我不确定 Postgres 是否存在另一种锁定机制,特别是不会让我执行产生错误的查询的机制。
【问题讨论】:
-
见13.3.5. Advisory Locks 和9.26.10. Advisory Lock Functions。部分参考是 v12,如果您的版本不同,可能会有所不同。如果是这样,只需单击您的版本。
-
如果进程在插入之后但在删除之前失败,会发生什么?在这种情况下你想发生什么?创建错误有什么问题?
-
@jjanes,为了避免锁永远存在,我会启动一个在所有实例上运行的 cron,删除超过某个时间之前创建的 cron_locks。而对于创建错误,它没有任何问题,除了它是一个错误,所以它会被记录,监控等......所以如果有一个“更清洁”的方式来做,我会更喜欢。跨度>
-
@Belayer 确实,这似乎是我想要的。我会看看我能不能用它做点什么!
-
希望它对你有用。但请注意@jjanes 暗示警告。如果您获得了锁并且该过程随后失败,请确保您释放该锁。建议锁定在您释放它们之前一直有效。
标签: postgresql concurrency cron