队列处理器进程的弹性伸缩


通常情况下,有固定数量的队列处理器进程消费队列,不断清空队列的同时让服务器资源得到有效利用,但是对于某些情况,需要通过以下方式实现处理器进程的弹性伸缩:

  • 从集群新增/移除服务器;
  • 在单台服务器启动/停止处理器进程;
  • 向单台服务器新增/移除资源(CPU/RAM)。

以便在不耗尽服务器资源的前提下,提高或降低队列任务消费速度。

在多台服务器运行

可以通过服务器提供商管理服务器节点的水平扩展。我们可以配置通过监控 CPU/内存的使用率自动新增/移除服务器。当新增服务器时,确保 Supervisor 已完成安装和配置,并且可以自动管理队列处理器进程的启动。同时还要确保所有服务器使用同一个队列连接。

通过固定调度伸缩

在每个工作日的上班高峰期,拼车应用都会遇到暴增的流量,同样,一个早餐店也会在早上接到很多订单。

如果我们知道何时需要新增队列处理器进程以及何时不需要,就可以通过 CRON 任务来调度特定的 Supervisor 进程组启动和停止。

新增 /etc/supervisor/conf.d/extra-workers.conf

该进程组会启动 3 个队列处理器进程来处理 ordersnotifications 队列,这里我们设置 autostart=false,这样在服务器重启时就不会自动启动这个进程组。

运行如下命令将其添加到 Supervisor 内存:

然后通过 CRON 任务来管理它的启动和停止:

在每天上午 7-11 点会新增 3 个队列处理器进程。

基于负载进行伸缩

要基于负载伸缩处理器进程,需要监控队列任务的数量,如果队列繁忙,则新增处理器,否则减少处理器。新增和减少的数量则取决于服务器的大小和当前任务的数量。

这里我们使用 Laravel 任务调度器而非 CRON 任务来实现,以便可以控制队列连接:

scaleDownscaleUp 方法代码如下:

如果队列任务数量少于 30(通过 Queue::size 获取),则停止额外的处理器进程,而如果队列任务数量持续 4 分钟超过 30,则启动额外的处理器进程加速队列任务处理。

通过这种方式我们可以控制启动进程的数量、检查是否启动的时机。

更简单的伸缩策略

更简单的伸缩策略是每隔几分钟启动额外的处理器进程,然后在队列任务为空时自动停止这些处理器进程:

不过,如果队列实在繁忙,下个 CRON 调度周期到来时上次启动的进程还没有停止,则会导致系统资源使用的上升。要避免这种进程的无限新增,可以限定最长执行时间:

这样一来,即便是队列不为空,该进程也会在执行 4 分钟后退出。


点赞 取消点赞 收藏 取消收藏

<< 上一篇: 管理队列处理器进程和内存泄露问题

>> 下一篇: 基于 Laravel Horizon 管理队列处理器进程和伸缩策略