Laravel多个应用程序相同的服务器如果相同的名称,队列会冲突吗



我们目前正在同一台专用服务器上运行两个laravel应用程序。每个应用程序都使用laravel的队列系统进行后台作业和通知。每个都使用redis作为驱动程序。两者都没有定义任何特定的队列,都使用默认队列。我们的supervisor.conf如下:

[program:site-one-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/siteone.com/artisan queue:work --sleep=5 --tries=1
autostart=true
autorestart=true
user=www-data
numprocs=4
redirect_stderr=true
stdout_logfile=/var/www/siteone.com/storage/logs/worker.log
[program:site-two-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/sitetwo.com/artisan queue:work --sleep=5 --tries=1
autostart=true
autorestart=true
user=www-data
numprocs=4
redirect_stderr=true
stdout_logfile=/var/www/sitetwo.com/storage/logs/worker.log

在添加第二个站点的配置之前,一切都按预期进行。添加后,我们正在测试并注意到,当调用sitetwo.com上触发通知发送到队列的事件时,本应收到通知的电子邮件地址没有收到通知,而是发送到了siteone.com数据库中只存在的两个电子邮件地址!

只要上述主管工作中只有一个在运行,一切似乎都能按预期运行。

使用相同队列名称进行处理的两个不同应用程序之间是否存在冲突?我把主管的配置搞砸了吗?我还缺少什么吗?

Laravel在读取队列时只关心类名。因此,如果有两个站点在调度作业AppJobsCoolEmailSender,那么无论哪个应用程序首先接收到它,都将对其进行处理,而不管是哪个应用程序调用了它

我可以在这里想到两件事:

  1. 多个redis实例

传递给--queue的唯一队列名称

我刚刚将APP_ENV和APP_NAME更改为.ENV文件,它对我有效。

例如:

  • 第一个.env:APP_env=本地APP_NAME=本地应用
  • Second.env:APP_env=暂存APP_NAME=暂存应用程序

可能晚了,但您是否尝试在config/queue.php 中修改队列配置

'redis' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => 'project1', // 'project2'...
'retry_after' => 90,
'block_for' => null,
],

使用--queue=project1运行队列

注意:这个答案适用于那些拥有多个域、多个应用程序和一个数据库的人

您可以发送&通过指定队列名称从多个服务器侦听作业。

应用程序1

dispatch((new Job($payload))->onQueue('app1'));
php artisan queue:listen --queue=app1

应用程序2

dispatch((new Job($payload))->onQueue('app2'));
php artisan queue:listen --queue=app2

最新更新