我想在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