2017-05-29 147 views
2

我目前有一個多服務器Laravel安裝程序。我有多臺服務器負載均衡並共享一個數據庫。Laravel在同一隊列上的多臺機器上排隊偵聽器

每個實例也運行一個隊列監聽器。我希望能夠派遣兩種類型的工作:

  1. 即只運行一次的作業(如發送電子郵件,更新模型等)
  2. 那是所有隊列監聽器運行的作業(如從文件系統中刪除一個文件)

第一個我覺得很簡單的實現,但不確定如何去實現第二個。有任何想法嗎?

+0

你使用supervisor作爲隊列嗎?你使用數據庫驅動程序的隊列? – Kyslik

+0

使用管理員和數據庫驅動程序。打開使用Redis或類似SQS – nothingtosee

+1

您不需要爲此使用隊列,也不必爲每臺使用的計算機設置特殊的隊列(名稱)(配置服務器時遇到的問題越多,服務器越冗長) 。你很可能最終會得到一臺主機,它必須傳播「信號」給其他機器來完成這項工作;你可以利用共享數據庫。如果服務器數量很少,我會使用命名隊列。 – Kyslik

回答

0

您可以使隊列偵聽器或工作人員處理特定的隊列。例如,運行一個隊列監聽器或工作人員來處理emails隊列。

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

您現在可以派遣工作到這個隊列

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

這可以幫助您設置多個聽衆/工人來處理根據您的要求不同的隊列。

+0

但是我該如何去獲取一個Job來運行隊列上的所有偵聽器? – nothingtosee

+0

據我瞭解,這不是問題;問題是傳播信號以將文件「刪除」到所有服務器。 – Kyslik

+0

@nothingtosee作業從隊列中彈出以便由偵聽器或工作人員處理,因此在所有偵聽器上運行單個作業將很困難,而不會對隊列機制進行重大更改。一種解決方案是將所有隊列命名爲唯一名稱,並且擁有一組隊列名稱並將您的作業分派給陣列中的所有隊列。 – Sandeesh