DI 有一个任务表,其中包含要为不同系统完成的供应任务。每个系统都有一个独立的 Perl 进程,该进程连续运行并检查表以查看它是否有针对该给定系统的任何未完成的任务。在一个月的时间里,这个表中可能有几十万条记录。伪代码如下所示:
select oldest uncompleted task for a given provisioning system
if found a task
update task to "in progress"
go do some work
update task to completed
sleep 15 seconds
repeat
试图弄清楚如何使这个过程更有效率。如果我减少睡眠时间,我会在数据库上增加额外的负载,但如果我增加睡眠时间,系统的整体响应会变得非常缓慢。理想情况下,我想完全消除睡眠,但没有额外的负载。
是否有类似于阻塞读取的 SQL 等价物?所以一个 select 语句会阻塞,直到它有东西要返回?
我曾考虑过另一个表,其中只有一个不完整的任务列表。但我仍然需要加入大桌子,所以不确定这是否真的能给我带来任何好处。
我能想出的唯一解决方案可能是在表上插入触发器,这可能会触及 /tmp 中的文件。然后 Perl 程序可以轮询那个文件的时间戳。或者也许向 Perl 程序正在通过阻塞读取侦听的命名管道发送一条小消息。
我将不胜感激有关如何解决此问题的任何帮助。这种 dB 轮询必须是一种常见的模式。