我有一个 PendingEmail
表,我将许多记录推送到该表以获取我要发送的电子邮件。
然后我有多个 Que处理我的应用程序作业的工作人员。其中一项工作是我的 SendEmailJob
。
这项工作的目的是检查PendingEmail
,拉取最新的 500 个按 priority
排序的邮件,向我的第 3 方电子邮件提供商发出批量请求,等待数组响应在所有 500 个响应中,然后删除成功的项目并标记失败记录的 error
列。单个作业将以这种方式继续,直到从 DB 返回的记录为 0,并且作业将退出/销毁。
问题是:
- 一次只有一个
SendEmailJob
处理电子邮件,这一点很重要。 - 如果当前的
SendEmailJob
没有运行,我需要每秒检查一次数据库。如果它正在运行,那么就没有问题,因为该作业将在大约 3 秒内完成。 - 如果表被锁定(无论如何),我的应用程序/其他工作人员必须仍然能够插入,因为我的应用程序的其他部分需要将电子邮件添加到表中。我认为我主要只需要限制 SELECT。
- 所有这些都需要快速。我这样做的部分原因是为了提高性能,因为我要在短时间内发送数百万封电子邮件。
- 目前我的作业是通过时钟进程 (Clockwork) 启动的,因此它会每 1 秒添加一次该作业。
我在想什么...
- Que 已经使用了咨询锁和其他 PG 机制。我宁愿不试图弄乱该表,试图首先阻止添加多个工作。相反,我认为可以同时运行许多
SendEmailJob
是可以的,只要它们在有锁定的情况下提前中止即可。 - 显然有一些 Rails 方法可以做到这一点,但我假设我需要直接对 PG 执行代码以在每个作业中启动某种锁,但在这样做之前它会检查是否已经有一个锁,如果有它是否中止)
我只是不知道选择哪种类型的锁,是在 Rails 中还是直接在数据库中进行。它们中有很多具有如此细微的差异(我使用的是 PG)。任何见解将不胜感激!
最佳答案
答案:我需要一个 advisory lock .
关于ruby-on-rails - Rails/Postgres - 我需要什么类型的数据库锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42639161/