12

最近、PHP での Beanstalkd の使用について調査しています。かなりのことを学びましたが、サーバーのセットアップなどについていくつか質問があります。

これが私がそれをどのように機能させているかです:

  1. Beanstalkd と依存関係 (libevent など) を Ubuntu サーバーにインストールします。次に、Beanstalkd デーモンを開始します (これは基本的に常に実行する必要があります)。
  2. 私の Web サイトのどこか (ユーザーが何らかのアクションを実行したときなど) のタスクは、Beanstalkd キュー内のさまざまなチューブに追加されます。
  3. 基本的に PHP スクリプトを実行するデーモンとして実行される bash スクリプト (次のようなもの) があります。

    #!/bin/sh
    php worker.php
    

4) ワーカー スクリプトには、キューに入れられたタスクを実行するための次のようなものがあります。

while(1) {
  $job = $this->pheanstalk->watch('test')->ignore('default')->reserve();
  $job_encoded = json_decode($job->getData(), false);
  $done_jobs[] = $job_encoded;
  $this->log('job:'.print_r($job_encoded, 1));
  $this->pheanstalk->delete($job);
}

ここで、上記の設定に基づいた私の質問を次に示します (間違っている場合は訂正します)。

  1. RSS フィードをデータベースなどにインポートするタスクがあるとします。一度に 10 人のユーザーがこれを行うと、全員が「テスト」チューブのキューに入れられます。ただし、一度に 1 つずつしか実行されません。10 個の異なるチューブをすべて同時に実行した方がよいでしょうか?

  2. さらにチューブが必要な場合、10 個のワーカー スクリプトが必要になるということですか? 各チューブに 1 つずつ、watch() 関数の文字列リテラルを除いて、基本的に同じコードですべて同時に実行されます。

  3. そのスクリプトをデーモンとして実行すると、どのように機能しますか? worker.php スクリプトを常に実行しますか? そのスクリプトは、理論的にはキューが空になるまでループするので、一度だけ開始するべきではありませんか? デーモンは worker.php を実行する頻度をどのように決定しますか? 設定だけですか?

ありがとう!

4

1 に答える 1

5
  1. ワーカーがフィードを取得するのに時間がかかりすぎていなければ、問題ありません。一度に複数のワーカーを処理する必要がある場合は、複数のワーカーを実行できます。私はシステムを持っています (現在 Amazon SQS を使用していますが、以前に BeanstalkD で同様のことを行ったことがあります)、最大 200 (またはそれ以上) のワーカーがキューからプルします。
  2. 単一のワーカー スクリプト (複数回実行される同じスクリプト) で問題ありません。スクリプトは同時に複数のチューブを監視でき、最初に利用可能なものが予約されます。コマンドを使用してjob-stat、特定の $job がどこから来たか (どのチューブ) を確認したり、各タイプを別のタイプから伝える必要がある場合は、メッセージにメタ情報を追加したりすることもできます。
  3. ワーカーを実行する良い例がここで説明されています。また、マシンごとに多数のワーカーを簡単に開始して実行し続けるために、 supervisord (開始に役立つ投稿)も追加しました (最初のリンクのように、シェル スクリプトを実行します)。ループの回数を制限しreserve()、次のジョブが使用可能になるまで数秒またはそれ以上待機するように数値を入力します。すべて - 何もすることがなくても。

補遺:

  1. シェル スクリプトは、必要な回数だけ実行されます。(リンクは、必要に応じて再実行する方法を示していますexec $@)。PHP スクリプトが終了するたびに、PHP が再実行されます。
  2. どうやらいくつかの統計を表示するDjanjoアプリがあるようですが、デーモンに接続してチューブのリストを取得し、各チューブの統計を取得するのは簡単です-または単にカウントします。
于 2011-10-11T21:20:12.547 に答える