2017-05-29 150 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