队列处理器进程的弹性伸缩
通常情况下,有固定数量的队列处理器进程消费队列,不断清空队列的同时让服务器资源得到有效利用,但是对于某些情况,需要通过以下方式实现处理器进程的弹性伸缩:
- 从集群新增/移除服务器;
- 在单台服务器启动/停止处理器进程;
- 向单台服务器新增/移除资源(CPU/RAM)。
以便在不耗尽服务器资源的前提下,提高或降低队列任务消费速度。
在多台服务器运行
可以通过服务器提供商管理服务器节点的水平扩展。我们可以配置通过监控 CPU/内存的使用率自动新增/移除服务器。当新增服务器时,确保 Supervisor 已完成安装和配置,并且可以自动管理队列处理器进程的启动。同时还要确保所有服务器使用同一个队列连接。
通过固定调度伸缩
在每个工作日的上班高峰期,拼车应用都会遇到暴增的流量,同样,一个早餐店也会在早上接到很多订单。
如果我们知道何时需要新增队列处理器进程以及何时不需要,就可以通过 CRON 任务来调度特定的 Supervisor 进程组启动和停止。
新增 /etc/supervisor/conf.d/extra-workers.conf
:
该进程组会启动 3 个队列处理器进程来处理 orders
和 notifications
队列,这里我们设置 autostart=false
,这样在服务器重启时就不会自动启动这个进程组。
运行如下命令将其添加到 Supervisor 内存:
然后通过 CRON 任务来管理它的启动和停止:
在每天上午 7-11 点会新增 3 个队列处理器进程。
基于负载进行伸缩
要基于负载伸缩处理器进程,需要监控队列任务的数量,如果队列繁忙,则新增处理器,否则减少处理器。新增和减少的数量则取决于服务器的大小和当前任务的数量。
这里我们使用 Laravel 任务调度器而非 CRON 任务来实现,以便可以控制队列连接:
scaleDown
和 scaleUp
方法代码如下:
如果队列任务数量少于 30(通过 Queue::size
获取),则停止额外的处理器进程,而如果队列任务数量持续 4 分钟超过 30,则启动额外的处理器进程加速队列任务处理。
通过这种方式我们可以控制启动进程的数量、检查是否启动的时机。
更简单的伸缩策略
更简单的伸缩策略是每隔几分钟启动额外的处理器进程,然后在队列任务为空时自动停止这些处理器进程:
不过,如果队列实在繁忙,下个 CRON 调度周期到来时上次启动的进程还没有停止,则会导致系统资源使用的上升。要避免这种进程的无限新增,可以限定最长执行时间:
这样一来,即便是队列不为空,该进程也会在执行 4 分钟后退出。
No Comments