2017-05-29 4 views
2

私は現在、複数サーバーのLaravel設定を持っています。負荷分散され、データベースを共有する複数のサーバーがあります。同じキューにある複数のマシンのLaravelキューリスナー

各インスタンスもキューリスナーを実行しています。私は仕事の2種類派遣することができるようにしたい。(例えばなど、モデルを更新し、電子メールを送信)

  1. 一度だけ実行されたジョブを
  2. ALLキューリスナー上で実行されたジョブ(例:ファイルシステムからファイルを削除してください)

私が最初に実装するのは簡単ですが、2番目の実装方法はわかりません。何か案は?

+0

キューにスーパーバイザを使用していますか。キューにデータベースドライバを使用していますか? – Kyslik

+0

スーパーバイザとデータベースドライバの使用。 RedisまたはSQSのようなものを使用して開く – nothingtosee

+1

これにはキューを使用しないでください。使用するマシンごとに特別なキュー(名前)を作成する必要があります(サーバーのプロビジョニングの問題により、 。あなたはほとんどの場合、ジョブを実行するために "信号"を他のマシンに伝播する必要のある1つのマスターマシンで終わるでしょう。共有データベースを活用できます。サーバー数が少ない場合は、名前付きキューを使用します。 – Kyslik

答えて

0

キューリスナーまたはワーカーが特定のキューを処理できるようにすることができます。たとえば、キュ​​ーリスナーまたはワーカーを実行してemailsキューを処理します。

php artisan queue:listen --queue=emails 
php artisan queue:work --queue=emails 

あなたは今、これはあなたの要件に基づいて異なるキューを処理するために、あなたのセットアップ複数のリスナー/労働者を助けることができる

dispatch((new Job)->onQueue('emails')); 

このキューにジョブをディスパッチすることができます。

+0

しかし、キュー上のすべてのリスナーに対してジョブを実行させるにはどうすればいいですか? – nothingtosee

+0

私はこれが問題ではないことを理解しています。問題は、ファイルをすべてのサーバーに「削除」するための信号を伝播することです。 – Kyslik

+0

ジョブがリスナーまたはワーカーによって処理されるキューからポップされるため、すべてのリスナーで1つのジョブを実行すると、キューメカニズムに大きな変更を加えることなくハードになります。 1つの解決策は、すべてのキューに一意の名前を付け、キュー名の配列を持ち、配列内のすべてのキューにジョブをディスパッチすることです。 – Sandeesh