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

标签 ruby-on-rails ruby postgresql locking jobs

我有一个 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/

相关文章:

database - Postgres 约束表的写入和删除顺序

ruby-on-rails - 在子域 Rails 中实现 Spree Cart

ruby-on-rails - Rake 中止,无法连接到 postgresql : connection refused

ruby - 在测试 HTML 属性是否包含预期 URL 时,如何忽略主机名?

postgresql - 在 Postgis 中,如何从空间表和相关(非空间)表之间的一对多关系构建 Geojson

postgresql - 我有一篇由 bool 字段管理的文章 "state",但是当复选框被保存为已发布时,如何获取第一个日期(时间戳)?

ruby-on-rails - 使用rvm在Snow Leopard for Rails 3上安装mysql2 gem

ruby-on-rails - ruby 在 rails 上。回形针 mp3 验证失败

mysql - 由于 MySQL 内存限制而关闭 Amazon EC2 上的 Rails 应用程序?

ruby - :^ in reduce method mean? 是什么