在postresql中实现工作队列

时间:2018-06-01 09:22:23

标签: postgresql rowlocking

我想在postgresql中创建一个持久的作业队列。这样多个工作人员可以从队列中选择一个作业(使用带有select for update的{​​{1}}),处理它,然后从队列中删除它。我有一张桌子:

skip locked

现在,如果有两个工作,那么它可以正常工作:

create table queue ( id serial primary key some_job_param1 text not null some_job_param2 text not null ) 启动一个事务并选择第一个作业

worker1

开始处理。 begin; select * from queue for update skip locked limit 1; 做同样的事情并选择具有相同查询的第二个作业。

worker2完成工作后,将其从队列中删除并提交交易:

worker1

然后delete from queue where id=$1; commit; 已准备好接受新工作,所以它做同样的事情。开始新交易,选择未锁定的工作。但问题是,没有更多的工作,查询返回零行。

理想情况是,如果查询将阻塞,直到有新作业并返回结果。它有可能吗?或者我走向错误的方向?

修改

工人是一个外部过程。因此,如果工人死亡,会话也会死亡,交易也会死亡。然后,所选作业将不再被锁定,并为另一名工作人员做好准备。伪代码看起来像这样:

worker1

0 个答案:

没有答案