Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails/Postgres-我需要什么类型的DB锁?_Ruby On Rails_Ruby_Postgresql_Locking_Jobs - Fatal编程技术网

Ruby on rails Rails/Postgres-我需要什么类型的DB锁?

Ruby on rails Rails/Postgres-我需要什么类型的DB锁?,ruby-on-rails,ruby,postgresql,locking,jobs,Ruby On Rails,Ruby,Postgresql,Locking,Jobs,我有一个PendingEmail表,我将许多记录推送到该表中,以便发送电子邮件 然后我有多个工人处理我的应用程序的作业。上述作业之一是我的sendmailjob 此作业的目的是检查PendingEmail,提取按优先级排序的最新500个,向我的第三方电子邮件提供商发出批处理请求,等待所有500个响应的阵列响应,然后删除成功的项,并标记失败记录的错误列。单个作业将以这种方式继续,直到从DB返回的记录为0,并且作业将退出/销毁 这些问题是: 关键是一次只有一个sendmailjob处理电子邮件 如

我有一个
PendingEmail
表,我将许多记录推送到该表中,以便发送电子邮件

然后我有多个工人处理我的应用程序的作业。上述作业之一是我的
sendmailjob

此作业的目的是检查
PendingEmail
,提取按
优先级排序的最新500个,向我的第三方电子邮件提供商发出批处理请求,等待所有500个响应的阵列响应,然后删除成功的项,并标记失败记录的
错误列。单个作业将以这种方式继续,直到从DB返回的记录为0,并且作业将退出/销毁

这些问题是:

  • 关键是一次只有一个
    sendmailjob
    处理电子邮件
  • 如果当前的
    sendmailjob
    未运行,我需要每秒检查一次数据库。如果它正在运行,则没有问题,因为该作业将在约3秒钟内到达
  • 如果某个表被锁定(尽管可能被锁定),我的应用程序/其他工作人员仍必须能够插入,因为我的应用程序的其他部分需要向表中添加电子邮件。我想我主要是需要限制选择
  • 所有这些都需要尽快完成。我这样做的部分原因是为了性能,因为我在短时间内发送了数百万封电子邮件
  • 目前,我的作业是通过时钟进程(Clockwork)启动的,因此它将每隔1秒添加一次此作业
我在想什么

  • Que已经使用了建议锁和其他PG机制。我不想试图弄乱那张桌子,试图阻止一开始就增加一个以上的工作。相反,我认为很多潜在的
    sendmailjob
    可以同时运行,只要它们在有锁的情况下提前中止就可以了
  • 显然有一些Rails方法可以做到这一点,但我假设我需要直接向PG执行代码,以在每个作业中启动某种类型的锁,但在执行之前,它会检查是否已经有一个锁,如果有,则会中止)

我只是不知道该选择哪种类型的锁,是在Rails中还是直接在数据库中。它们中有很多有着如此细微的差别(我用的是PG)。如有任何见解,将不胜感激

回答:我需要一个。

Heroku有一个宝石可以实现这一点: