1

我(为了争论)有 1000 条记录和 10 名 Heroku 工作人员在运行。我想让每个工人处理不同的记录集..

我现在拥有的东西很好,但还不够完整。

sql = 'update products set status = 2 where id in 
         (select id from products where status = 1 limit (100) ) return *'
records = connection.execute(sql)

这工作得很好..我得到 100 条记录,同时,我确保我的其他工作人员没有得到相同的 100..如果我把它扔到一个 while 循环中,那么即使我有 20000 条记录和 2 个工作人员,最终它们都会得到处理。

我的问题是,如果发生崩溃或异常,那么这 100 条记录看起来像是由另一个工作人员处理的,但事实并非如此。
我不能使用事务,因为其他选择会选择相同的记录。

我的问题 其他人使用什么策略让许多工作人员在同一数据集上工作,但记录不同。

我知道这是一个对话问题……我会把它当作社区 wiki,但我再也看不到这种能力了。

4

3 回答 3

2

在 RDBMS 中构建任务队列非常困难。我建议使用专为这项工作设计的排队系统。

查看PGQ、 Celery 等。

于 2012-12-17T00:17:49.333 回答
1

我使用Heroku 的queue_classic来安排存储在 Postgres 数据库中的作业。

于 2012-12-17T04:13:21.177 回答
0

如果我要这样做,那将不是数据库端队列。这听起来像是标准的客户端处理,但您真正想要的是结果集的并行处理。

最简单的解决方案可能是做你正在做的事情,但将它们锁定在客户端,并将它们分配给那里的工作人员(自旋锁等)。然后,您可以提交事务并在完成处理后重新运行。

困难在于,如果您有记录正在处理应该在服务器之外发生的事情,并且发生了崩溃,那么您永远不会真正知道处理了哪些记录。回滚可能更安全,但请记住这一点。

于 2013-03-02T15:21:57.180 回答