队列日记
消息队列的主要特点是异步处理,主要目的是减少请求响应时间和解耦。所以主要的使用场景就是将比较耗时而且不需要即时(同步)返回结果的操作作为消息放入消息队列。同时由于使用了消息队列,只要保证消息格式不变,消息的发送方和接收方并不需要彼此联系,也不需要受对方的影响,即解耦和。
解耦:生成 Slug 只是一个优化功能(不需要即时返回结果),并非是发帖的必要功能(需要即时返回结果),我们希望无论生成 Slug 的结果如何,用户都能顺利的发帖,并且完全察觉不到延迟。
减少请求响应时间:利用队列系统可以做到这点。队列允许你异步执行消耗时间的任务,比如请求百度翻译API。这样可以有效的降低请求响应的时间。
composer require "predis/predis:~1.0"
QUEUE_DRIVER=redis(修改env,默认SYNC)
php artisan queue:failed-table(生成任务失败的迁移表)
$ php artisan migrate(执行迁移)
php artisan make:job namejob(生成任务队列类,app/Jobs,注入模型,要执行的方法)
利用模型监控实现任务分发dispatch(new namejob($topic));
任务队列监控:
composer require "laravel/horizon:~1.0"
php artisan vendor:publish --provider="Laravel\Horizon\HorizonServiceProvider"
开启监控php artisan horizon
线上部署须知
在开发环境中,我们为了测试方便,直接在命令行里调用 artisan horizon 进行队列监控。然而在生产环境中,我们需要配置一个进程管理工具来监控 artisan horizon 命令的执行,以便在其意外退出时自动重启。当服务器部署新代码时,需要终止当前 Horizon 主进程,然后通过进程管理工具来重启,从而使用最新的代码。
1,简而言之,生产环境下使用队列需要注意以下两个问题:
2,使用 Supervisor 进程工具进行管理,配置和使用请参照 文档 进行配置;
每一次部署代码时,需 artisan horizon:terminate 然后再 artisan horizon 重新加载代码。