〜50K行のデータベーステーブルがあり、各行は実行する必要があるジョブを表しています。DBからジョブを抽出し、ジョブを実行して結果をdbに戻すプログラムがあります。(このシステムは現在稼働中です)
ここで、複数の処理タスクがジョブを実行できるようにしたいのですが、タスクが 2 回実行されないようにします (これが他の問題を引き起こすのではないというパフォーマンス上の懸念から)。アクセスはストアド プロシージャを介して行われるため、私の現在の方法は、ストアド プロシージャを次のようなものに置き換えることです。
update tbl
set owner = connection_id()
where available and owner is null limit 1;
select stuff
from tbl
where owner = connection_id();
ところで; ワーカーのタスクは、ジョブの取得と結果の送信の間の接続を切断する可能性があります。また、その部分を台無しにしない限り、DBがボトルネックに近づくことさえないと思います(1分あたり〜5ジョブ)
これに問題はありますか?これを行うより良い方法はありますか?
注: 「IPC アンチパターンとしてのデータベース」は、ここでは少しだけ適切です。
- 私はIPCを行っていません(行を生成するプロセスはありません。現在、それらはすべてすでに存在しています)
- そのアンチパターンについて説明されている主な不満は、プロセスがメッセージを待機するときにDBに不要な負荷がかかることです(私の場合、メッセージがない場合、すべてが完了するとすべてがシャットダウンする可能性があります)