Laravel - 作业在一台服务器上分派,在另一台服务器上处理
Laravel - Job dispatched on one server, handled on another
我正在研究 Laravel 应用程序的日志记录方面,amd 计划将数据发送到 SQS 以便稍后检索。但是,我想将工作从我的生产服务器分派到 AWS 队列,然后让一个队列在一个单独的日志服务器上工作,该服务器监听该队列。
我了解如何设置 Queue worker 以侦听 Queue,但是,Laravel 的作业是自行处理的。因此,当 Logging 服务器上的 worker 从 SQS 检索消息时,它将在相同的命名空间(具有相同的 Class 名称)中寻找作业来处理它。有什么不同的方法来处理这个问题,还是我只需要在日志服务器上命名 Job Handler,就像生产服务器上的 Job Dispatcher 一样。
您可以为每个特定的服务器创建不同的队列,并根据必须执行的位置将每个作业发送到其中一个。
基本上,这是将作业推送到特定队列的方法:
$job = (new SendReminderEmail($user))->onQueue('emails');
下面是处理来自特定队列的作业的命令:
php artisan queue:listen --queue=emails
希望对您有所帮助
我遇到过类似的挑战。由于我们为我们的应用程序使用 docker 容器,因此我们定义了一个专用的 工作者服务 ,它与网络应用程序共享一个卷。这个辅助服务使用一个非常简单的图像和 supervisord 来使用网络应用程序推送的工作。通过这种方式,我们可以在两个服务之间共享作业 类,并有可能单独扩展辅助服务。
这是 docker-compose 文件的示例:
version: '2'
services:
web:
image: ${AWS_ACC}.dkr.ecr.us-east-1.amazonaws.com/nginx-php:1.0
env_file:
- "env.list.${APP_ENV}"
ports:
- 80:80
- 443:443
tty: true
volumes:
- ${PWD}:/var/www/html
worker:
image: ${AWS_ACC}.dkr.ecr.us-east-1.amazonaws.com/php-worker:1.0
env_file:
- "env.list.${APP_ENV}"
tty: true
volumes:
- ${PWD}:/var/www/html
depends_on:
- web
...
我想到的另一个可能的解决方案是使用 git 子模块在两个项目之间共享作业 类。由于 laravel 只是序列化作业 类,只要它们匹配签名,它就应该可以工作。
我正在研究 Laravel 应用程序的日志记录方面,amd 计划将数据发送到 SQS 以便稍后检索。但是,我想将工作从我的生产服务器分派到 AWS 队列,然后让一个队列在一个单独的日志服务器上工作,该服务器监听该队列。
我了解如何设置 Queue worker 以侦听 Queue,但是,Laravel 的作业是自行处理的。因此,当 Logging 服务器上的 worker 从 SQS 检索消息时,它将在相同的命名空间(具有相同的 Class 名称)中寻找作业来处理它。有什么不同的方法来处理这个问题,还是我只需要在日志服务器上命名 Job Handler,就像生产服务器上的 Job Dispatcher 一样。
您可以为每个特定的服务器创建不同的队列,并根据必须执行的位置将每个作业发送到其中一个。
基本上,这是将作业推送到特定队列的方法:
$job = (new SendReminderEmail($user))->onQueue('emails');
下面是处理来自特定队列的作业的命令:
php artisan queue:listen --queue=emails
希望对您有所帮助
我遇到过类似的挑战。由于我们为我们的应用程序使用 docker 容器,因此我们定义了一个专用的 工作者服务 ,它与网络应用程序共享一个卷。这个辅助服务使用一个非常简单的图像和 supervisord 来使用网络应用程序推送的工作。通过这种方式,我们可以在两个服务之间共享作业 类,并有可能单独扩展辅助服务。
这是 docker-compose 文件的示例:
version: '2'
services:
web:
image: ${AWS_ACC}.dkr.ecr.us-east-1.amazonaws.com/nginx-php:1.0
env_file:
- "env.list.${APP_ENV}"
ports:
- 80:80
- 443:443
tty: true
volumes:
- ${PWD}:/var/www/html
worker:
image: ${AWS_ACC}.dkr.ecr.us-east-1.amazonaws.com/php-worker:1.0
env_file:
- "env.list.${APP_ENV}"
tty: true
volumes:
- ${PWD}:/var/www/html
depends_on:
- web
...
我想到的另一个可能的解决方案是使用 git 子模块在两个项目之间共享作业 类。由于 laravel 只是序列化作业 类,只要它们匹配签名,它就应该可以工作。