【发布时间】:2010-09-22 18:35:36
【问题描述】:
我有一个包含大约 50K 行的数据库表,每行代表一项需要完成的工作。我有一个程序从数据库中提取工作,完成工作并将结果放回数据库。 (本系统正在运行)
现在我想允许多个处理任务执行作业,但要确保没有任务被执行两次(作为性能问题而不是这会导致其他问题)。因为访问是通过存储过程的方式进行的,所以我目前的做法是将所述存储过程替换为看起来像这样的东西
update tbl
set owner = connection_id()
where available and owner is null limit 1;
select stuff
from tbl
where owner = connection_id();
顺便说一句;工人的任务可能会在获得工作和提交结果之间失去联系。此外,除非我把那部分搞砸(每分钟约 5 个工作),否则我不认为数据库会接近瓶颈。
这有什么问题吗?有没有更好的方法来做到这一点?
注意:"Database as an IPC anti-pattern" 在这里只是稍微合适,因为
- 我没有做 IPC(没有进程生成行,它们现在都已经存在)和
- 针对该反模式描述的主要问题是,当进程等待消息时,它会导致数据库上出现不必要的负载(在我的情况下,如果没有消息,则一切都可以在完成后关闭)
【问题讨论】:
-
正确 - 错误 = 同步 IPC,在 dbms SELECT 上阻塞作为读取。您可能将这样做作为引入异步性的策略。
-
顺便说一句,如果你想给读者设置一个计时器,让他们不经常检查是很有用的,但如果他们找到工作,他们可以在再次睡觉之前排空队列。
-
注意我的编辑:如果他们找不到工作,他们将永远找不到工作。但如果那不是真的……
标签: sql database concurrency locking job-queue