2

MySQLデータベースに200Kレコードを含むテーブルがあります。各レコードには、何らかの方法で処理する必要のあるURLが含まれています。私の場合のURL処理は簡単な作業ではないため、Gearmanキューを使用してこれらをバックグラウンドジョブとして実行することを選択しました。

したがって、テーブル内のレコード(URL)ごとに、個別のタスクを作成してGearmanに提供する予定です。

また、私のテーブルのデータは静的ではなく、新しいURLがそこに追加されることがよくあります。

私のビジネスロジックによると、このURLのリストを継続的に処理する必要があります。DBテーブルの最後のレコードの処理が完了したら、最初のレコードに移動して、すべてのレコードに対してプロセスを再度繰り返す必要があります。

だから私の質問:

  • この場合、Gearmanにタスクをより適切に提供するにはどうすればよいですか?
  • cronを使用する必要がありますか、それともGearmanが自動的にタスクをプルするロジックを整理することは可能ですか?
  • 一度にいくつのタスクをGearmanに送信できますか?

では、このシステムを実装するための最善の方法を教えてください。

4

1 に答える 1

3

必要なのはキューで、処理されたアイテムがキューの一番下に追加されるようです。次のようにワークフローを整理することをお勧めします。

  1. システムに新しいURLが表示されたら、それをGearmanバックグラウンドジョブキューに追加します。

  2. Gearmanワーカーの実装では、ジョブが処理されたら、それを再びキューに追加します。

このようにして、キューに追加された順序でURLを常に処理し、キュー全体が無限に繰り返されます。もちろん、これは1つのタスクを繰り返し実行していることを前提としています。

複数のタスクがある場合(たとえば、最初にすべてのURLでタスク#1を実行し、次にタスク#2を実行するなど)、同様のパターンに従って、最初のキューの後に2番目のキュー(別のワーカーなど)にジョブを送信することができます。タスク。次に、作業をどの程度正確に注文するかに応じて、すべてが自動的に行われるか(両方のワーカーが常に使用可能である場合)、キュー#1を監視し、キュー#2が空の場合にのみ開始する必要があります。 。このような監視の詳細については、「ギアマン管理にアクセスする方法はありますか?」を参照してください。

一般的に、Gearmanは200,000アイテムを簡単かつ迅速に処理できました。現在、永続キューを使用すると、処理速度が少し遅くなりますが(基本的には、MySQL /その他のDB接続です)、ひどいことは何もしないはずです。私自身は試していませんが、サクセスストーリーには通常、さらに多くのアイテムが含まれ、多くの場合、永続的なキューも含まれます。

注意する必要がある唯一のことは、Gearmanがバッチでのジョブの処理(たとえば、同時に10個のアイテム)を許可しないことです。URLを処理しているため、一度に1つのURLを処理する必要があります。これは、各URLが個別にダウンロードされるのを待つ必要があるためコストがかかります。処理にイベント駆動型/非ブロッキングプログラミング言語を使用するか、このようなバッチ処理を可能にするbeanstalkdを確認することで、これを回避できます。

于 2012-06-01T11:43:05.820 に答える