laravel队列的消费能力
不知道在项目中使用php artisan queue:work
的有多少, 如果在队列任务里面有http请求
的任务, 数量一多, 就处理不过来, 处理的很慢, 不知道有没有遇到过相同情况的? 以及怎么解决了
高认可度评论:
接上贴(说内容过长了
)
因为 horizon 会根据队列的繁忙程度自动扩缩子进程,而子进程会导致容器的负载和内存开销提升或降低,这时我们再去通过 k8s 的横向扩缩对象进行容器的扩缩,对应的片段如下:
deployment-horizon.yaml 文件用来根据一个 horizon.csv 文件的内容来配置当前队列的名称及其对应的申请资源和限制资源。
HPA对象同样根据 horizon.csv 的内容来控制横向扩缩的 pod 数量。
一个 horizon.csv 就集中控制了这些队列容器的资源:
最终使用 helm 部署到集群问题就解决了大部分。
还剩个尾巴就是节点的扩缩,这个我们用阿里云提供的自动扩缩节点池来实现,配置之后通过调度资源不足导致容器调度失败的事件来动态扩缩按量计费的节点,这个需要的费用可能会较多。
多个消费者 进行消费
异步队列不就是用来解决同步操作耗时的问题吗?处理不过来就增加消费进程数,Http使用并发请求处理,量再大架构就要调整,单节点改为多节点消费。
这个东西感觉并不好用,如果非要用这个的话,建议加上
--queue=xxx
参数,防止所有的任务都挤在一起。我给公司开发了一个内部系统,包含类似 github issue 的工单系统,使用 queue worker 来发送通知邮件。
这个系统还有每天抓取一百多个网站的信息,比如 SEO 信息、SSL、域名等信息,也会发送一定数量的包含 HTTP、 WHOIS 等网络请求,用 laravel scheduler 每天晚上执行一次。
我一般是通过horizon来管理队列 可以针对某些任务在有时候堆积到一定程度后会自动扩容子进程去消费任务 消费完后会自动回收 也可以方便监控你的队列是否有失败等等
可以运行多个队列进程的. 队列《Laravel 10 中文文档》
这道题我熟啊 :smile: 虽然可能不是最优解。
我们先用 horizon 在容器内将子进程进行扩缩,具体反映在启动脚本上,片段如下:
接上贴(说内容过长了
)
因为 horizon 会根据队列的繁忙程度自动扩缩子进程,而子进程会导致容器的负载和内存开销提升或降低,这时我们再去通过 k8s 的横向扩缩对象进行容器的扩缩,对应的片段如下:
deployment-horizon.yaml 文件用来根据一个 horizon.csv 文件的内容来配置当前队列的名称及其对应的申请资源和限制资源。
HPA对象同样根据 horizon.csv 的内容来控制横向扩缩的 pod 数量。
一个 horizon.csv 就集中控制了这些队列容器的资源:
最终使用 helm 部署到集群问题就解决了大部分。
还剩个尾巴就是节点的扩缩,这个我们用阿里云提供的自动扩缩节点池来实现,配置之后通过调度资源不足导致容器调度失败的事件来动态扩缩按量计费的节点,这个需要的费用可能会较多。
共享异步队列,然后多开几台机器跑laravel队列,实现多消费者消费。
mark!