Rails / Postgres - 我需要什么类型的数据库锁?

时间:2017-03-07 02:37:14

标签: ruby-on-rails ruby postgresql locking jobs

我有一个PendingEmail表,我将许多记录推送到我要发送的电子邮件中。

然后我有多个Que工作人员处理我的应用程序的工作。其中一项工作是SendEmailJob

这项工作的目的是检查PendingEmail,提取priority订购的最新500,向我的第三方电子邮件提供商发出批量请求,等待所有500个响应的阵列响应,然后删除成功的项目并标记失败的记录' error列。单个作业将以这种方式继续,直到从DB返回的记录为0,作业将退出/销毁。

问题是:

  • 一次只有一个SendEmailJob处理电子邮件至关重要。
  • 如果当前SendEmailJob未运行,我需要每秒检查一次数据库。如果它正在运行,那么没有问题,因为该作业将在~3秒内到达。
  • 如果表被锁定(但可能是这样),我的应用程序/其他工作者必须仍然可以INSERT,因为我的应用程序的其他部分需要向表中添加电子邮件。我主要只需要限制SELECT我认为。
  • 这一切都需要快速。我这样做的部分原因是因为我在短时间内发送了数百万封电子邮件。
  • 目前我的工作是通过时钟进程(发条)启动的,因此它会每1秒添加一次此作业。

我在想什么......

  • Que已经使用了咨询锁和其他PG机制。我宁愿不试图弄乱那张桌子试图阻止首先添加一个以上的工作。相反,我认为可能很多SendEmailJob可以同时运行,只要它们在有锁定的情况下提前中止。
  • 显然有一些Rails方法可以做到这一点,但我想我需要直接向PG执行代码以在每个作业中启动某种锁定,但在此之前它会检查是否已有一个锁定,如果有是中止)

我只是不知道选择哪种类型的锁,无论是在Rails中还是在数据库中直接执行。他们中有很多人有这么微妙的差异(我使用的是PG)。任何见解将不胜感激!

1 个答案:

答案 0 :(得分:0)

答案:我需要一个advisory lock