如何在Laravel中无需触发事件即可监听AWS SQS队列
Laravel 无需事件触发实现AWS SQS队列监听方案
你现有的监听逻辑已经很完善,只需要把它封装为Laravel自定义Artisan命令即可独立运行,不需要依赖事件触发,具体操作步骤如下:
步骤1:创建自定义Artisan命令
执行Artisan命令生成命令类:
php artisan make:command SqsOrderWorkerCommand
生成的文件位于app/Console/Commands/SqsOrderWorkerCommand.php,修改类的基础配置:
protected $signature = 'sqs:work-order'; protected $description = '监听AWS SQS订单队列,处理订单发货时间更新逻辑';
步骤2:迁移监听逻辑到命令类
你可以直接把现有UpdateOrderDispatchedAtListener的所有逻辑迁移到命令类中,或者直接在命令类的handle方法中调用现有Listener的逻辑即可:
public function handle() { // 直接实例化你现有的监听类执行即可 $listener = new \App\Listeners\UpdateOrderDispatchedAtListener(); $listener->handle(); }
步骤3:测试运行
直接在终端执行以下命令即可启动队列监听,不需要任何事件触发:
php artisan sqs:work-order
步骤4:生产环境持久化运行
为了保证服务异常退出后自动重启,推荐使用Supervisor管理进程:
- 安装Supervisor后新增配置文件
/etc/supervisor/conf.d/sqs-order-worker.conf,内容参考:
[program:sqs-order-worker] process_name=%(program_name)s_%(process_num)02d command=php /你的项目绝对路径/artisan sqs:work-order autostart=true autorestart=true user=运行项目的系统用户(比如www-data) numprocs=1 # 可根据需要调整进程数 redirect_stderr=true stdout_logfile=/你的项目绝对路径/storage/logs/sqs-worker.log
- 加载配置并启动进程:
supervisorctl reread supervisorctl update supervisorctl start sqs-order-worker:*
可选方案:使用Laravel自带队列系统
如果你的SQS消息是Laravel队列推送的标准格式,不需要自定义解析逻辑,可以直接配置自带SQS驱动,无需自己实现监听逻辑:
- 在
.env中配置SQS相关参数:
QUEUE_CONNECTION=sqs SQS_KEY=你的AWS_ACCESS_KEY SQS_SECRET=你的AWS_SECRET_KEY SQS_REGION=你的SQS区域 SQS_PREFIX=https://sqs.区域.amazonaws.com/账号ID SQS_QUEUE=order_items
- 直接运行Laravel自带的队列监听命令即可:
php artisan queue:work sqs
优化建议
- 不要在业务逻辑中直接调用
env()函数读取配置,建议在config目录下新增自定义配置文件,使用config()函数读取,避免执行配置缓存后env()返回null的问题 - 可增加失败消息重试机制,处理失败的消息暂时存入死信队列,避免直接丢弃异常消息
- 可以增加停止信号监听,收到停止信号后处理完当前消息再退出,避免消息丢失
内容的提问来源于stack exchange,提问作者shorif2000
相关产品推荐
相关产品推荐

