Laravel 多个应用程序同一个服务器,如果名称相同,队列会发生冲突吗?
Laravel multiple apps same server do queues conflict if same name?
我们目前 运行 两个 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!
的数据库中的两个电子邮件地址
只要上述主管工作中只有一个是 运行,一切似乎都按预期运行。
使用相同队列名称进行处理的两个不同应用程序之间是否存在某种冲突?我搞砸了主管配置吗?我还遗漏了什么吗?
class 的名称是所有 Laravel 在读取队列时所关心的。因此,如果您有 2 个站点分派该作业 App\Jobs\CoolEmailSender
,那么无论哪个应用程序先接收到它,都会处理它,而不管哪个应用程序调用了它。
我能想到两件事:
- 多个redis实例
或
- 传递给
--queue
的唯一队列名称
可能晚了,但您是否尝试在 config/queue 处修改队列配置。php
'redis' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => 'project1', // 'project2'...
'retry_after' => 90,
'block_for' => null,
],
运行 排队 --queue=project1
我刚刚将 APP_ENV 和 APP_NAME 更改为 .env 文件,它对我有用。
例如:
- 首先.env: APP_ENV=local APP_NAME = localapp
- 第二个 .env:APP_ENV=staging APP_NAME=stagingapp
我们目前 运行 两个 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!
的数据库中的两个电子邮件地址只要上述主管工作中只有一个是 运行,一切似乎都按预期运行。
使用相同队列名称进行处理的两个不同应用程序之间是否存在某种冲突?我搞砸了主管配置吗?我还遗漏了什么吗?
class 的名称是所有 Laravel 在读取队列时所关心的。因此,如果您有 2 个站点分派该作业 App\Jobs\CoolEmailSender
,那么无论哪个应用程序先接收到它,都会处理它,而不管哪个应用程序调用了它。
我能想到两件事:
- 多个redis实例
或
- 传递给
--queue
的唯一队列名称
可能晚了,但您是否尝试在 config/queue 处修改队列配置。php
'redis' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => 'project1', // 'project2'...
'retry_after' => 90,
'block_for' => null,
],
运行 排队 --queue=project1
我刚刚将 APP_ENV 和 APP_NAME 更改为 .env 文件,它对我有用。
例如:
- 首先.env: APP_ENV=local APP_NAME = localapp
- 第二个 .env:APP_ENV=staging APP_NAME=stagingapp