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有一个宝石可以实现这一点: