MySQLのキューを持つ単純なタスクサーバー(ロックの問題なし)

ほぼすべての動的プロジェクトで、バックグラウンドでタスクキューを実行する必要があります(電子メールの送信、キャッシュの更新、検索のインデックスの再作成など)。 Job Server(Gearmanなど)は優れていますが、ほとんどの単純なタスクでは冗長です。 時間の経過とともに負荷が増加するMySQLのキューの従来の実装(SELECT ... LOCK FOR UPDATEを使用)は、ロックの問題につながり始めます。 そのため、通常のように、バックグラウンドタスクを操作するための「自転車」を独自に作成する必要がありました。



根拠:Cron、PHP 5.3(mysqli)、MySQL> 5.1-ほとんどすべてのホスティングに固執するのは簡単です。

タスクを取得(キャプチャ)する操作はアトミック(1つのUPDATE要求)です。 ロックとRCに問題はありません。

ワーカーと優先順位のグループにタスクを分散し、データの配列を実行可能なメソッド(関数)に転送する可能性。

完了したタスクを処理する3つのモード:レコードを別のテーブルに移動し、レコードを削除し、レコードを残して、正常に処理されたものとしてマークします。

不完全なタスクやエラーで処理されたタスクの処理は、開発者の良心にかかっています。

400行のコード(PHPDOCをすべて使用)のすべてについて。

制限:現在の実装は永続的な接続には適していませんが、誰かがそれを必要とする場合、簡単に終了できます。 別の言語に書き換えたい場合でも:)



キューでの非ブロッキング作業の可能性は、UPDATE要求でユーザー変数を使用し、後続の選択で実現します。 このテクニックに記事全体を捧げることはばかげています。 ケースに適用できる最終的な実装は、はるかに優れています(私たちはあなたと一緒に練習していますよね?)。 他のすべての点で、それはグループと優先順位を持つ独占的に古典的なラインナップです。



使用例(クライアント):

$task_server = \DBTaskServer::create('localhost', 'root', '', 'testDB', 'jobs_queue'); $task_server->addTask('mywork', $data);
      
      





myworkは、ワーカーが使用できる機能です。 $データの配列が渡されます。 静的クラスメソッドの呼び出しを指定することもできます。

 $task_server->addTask('MyWork::doWork', $data);
      
      







ワーカーの例:

 \DBTaskServer::create('localhost', 'root', '', 'testDB', 'jobs_queue') //  . ->setByCLIAgruments($argv) //     . ->setMode(\DBTaskServer::MODE_MARK_AS_COMPLETED) //   . ->run(); //  .
      
      







パラメーターを使用してコンソールからワーカーを起動します。

 /path/to/script/worker.php [max_tasks_per_lifecycle] [comma_separated_group_ids]
      
      





名前が示すように、最初のオプションは、作業を完了する前にワーカーが完了できるタスクの数を示します(もちろん、それらが使用可能な場合を除きます)。2番目のオプションは、このワーカーが処理するタスクのgroup_id値です。 グループが指定されていない場合、ワーカーはグループを処理します。



例:

 /path/to/script/worker.php 100 3,5,6
      
      





グループ3、5、6から100個のタスクを完了します。

タスクが見つからない場合、ワーカーはすぐに作業を終了します。



クラウンにワーカーを追加します。

 0-59/5 * * * * /path/to/script/worker.php 5 3 >/dev/null 2>&1
      
      





5分ごとに、group_id = 3で5つのジョブを処理します。



アーカイブには、クライアント、ワーカー、サーバークラス自体(ドキュメント化)、タスクテーブルを含むsqlファイルの例が含まれています。

ここからダウンロードします(最大5kB)。



素敵なコードがあります。



All Articles