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、セロリなどをチェックしてください。

于 2012-12-17T00:17:49.333 に答える
1

Heroku のqueue_classicを使用して、Postgres データベースに保存されているジョブをスケジュールしました。

于 2012-12-17T04:13:21.177 に答える
0

これを行うとしたら、db 側のキュー以外のものになります。標準的なクライアント処理のように聞こえますが、本当に必要なのは結果セットの並列処理です。

最も簡単な解決策は、あなたがしていることを実行することですが、それらをクライアント側でロックし、そこでワーカー間で分割します (スピンロックなど)。その後、トランザクションをコミットし、これらの処理が完了した後に再実行できます。

問題は、サーバーの外部で発生するはずの処理を行っているレコードがあり、クラッシュが発生した場合、どのレコードが処理されたかを実際に知ることができないことです。おそらくロールバックする方が安全ですが、それを覚えておいてください。

于 2013-03-02T15:21:57.180 に答える