DI には、さまざまなシステムで完了するプロビジョニング タスクを含むタスク テーブルがあります。各システムには個別の Perl プロセスがあり、継続的に実行され、テーブルをチェックして、そのシステムで未完了のタスクがあるかどうかを確認します。1 か月の間に、このテーブルには数十万のレコードが存在する可能性があります。疑似コードは次のようになります。
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
このプロセスをより効率的にする方法を見つけようとしています。スリープ時間を減らすと、DB に追加の負荷がかかりますが、スリープ時間を増やすと、システムの全体的な応答が非常に遅くなります。理想的には、睡眠を完全になくしたいのですが、追加の負荷はかかりません。
ブロッキング読み取りに相当する SQL のようなものはありますか? では、select ステートメントは、何かを返すまでブロックしますか?
未完了のタスクのリストのみを含む別のテーブルを用意することを考えました。しかし、それでも大きなテーブルに結合する必要があるため、それで本当に何かが得られるかどうかはわかりません。
私が思いついた唯一の解決策は、/tmp. 次に、Perl プログラムはそのファイルのタイムスタンプをポーリングできます。または、Perl プログラムがブロッキング読み取りでリッスンしている名前付きパイプに小さなメッセージを送信することもできます。
この問題を解決する方法について何か助けていただければ幸いです。この種の dB ポーリングは、ある程度一般的なパターンでなければなりません。