如何选择正确的消息队列驱动


Laravel 目前支持以下消息队列存储驱动:

  • Redis
  • Database
  • SQS
  • Beanstalkd

大多数时候,选择使用哪个驱动取决于安装的简易性和运行的可靠性。

数据库驱动设置起来最简单,维护也方便,因为我们已经习惯使用它来处理关系数据的存取,最适合不熟悉消息队列的入门者使用,不过,还是要看看其他的驱动。

Redis

目前 Laravel 底层是基于 Redis 列表来实现消息队列的,对应的队列推送和获取指令如下:

由于 Redis 服务是单进程的,所以即便有多个客户端同时过来获取消息,也不会将同一个消息返回,也就不存在并发安全问题。此外,由于 Redis 所有数据都存储在内存中,所以性能非常高。

也正是因为所有队列任务都以序列化方式存储在内存中,而内存通常不会像磁盘那样空间大,所以要尽量减少队列任务的大小,避免占用大量内存。与此同时,也要尽可能多启动几个处理器进程加快队列消费速度,避免任务堆积让内存占用越来越高。

数据库

使用数据库驱动,所有队列任务会存放在 jobs 表中,你可以在任何时候通过 GUI 工具查看队列中的任务。所以数据库驱动的优点是数据可见性,无需引入额外安装和配置,直接基于现有数据库即可。

如果你的队列吞吐量不是很大的话,可以从数据库驱动开始入门。到有一天不足以支持消息队列的并发和吞吐了,切换到其他驱动也很简单。

SQS 和 Beanstalkd

SQS 是 AWS 提供的队列云服务,如果应用部署在 AWS 上,和 SQS 的通信会非常快。一般来说,数据库、Redis 或者队列云服务已经足以应付小、中、大三种吞吐量的队列系统了,不需要使用 Beanstalkd。

同步执行队列任务

本地开发测试时,还可以将队列驱动配置为 sync,这样,所有队列任务会立即同步执行,而不会推送到任何消息队列驱动:

因此,也就不需要运行队列处理器进程消费它们了。

在不同驱动之间切换

如果你想要从一种消息队列驱动切换到另一种,对应步骤如下:

  1. 在配置文件 queue.php 中配置新的队列连接;
  2. 更新代码,将任务推送到这个新的连接;
  3. 启动处理器进程消费来自新的连接的队列任务;
  4. 等到老的队列中所有任务处理完毕后停止老的队列处理器进程。查看老队列是否为空的代码如下:

存储任务到不同机器

如果有多个服务器,可以在一台机器处理 HTTP 请求,在另一台机器通过 Supervisor 维护队列处理器进程,然后在第三台服务器安装和设置队列系统(Redis、MySQL)。

这样一来,你就可以针对不同机器做不同的配置和调整,如果为安装 Redis 队列存储的机器分配更多内存、为运行队列处理器进程的机器分配更多 CPU。

当你配置好每个应用实例的 queue.php.env 后,就可以在一台机器推送任务,在另一台机器消费这些任务了。


Vote Vote Cancel Collect Collect Cancel

<< 上一篇: 处理队列任务生命周期的所有失败

>> 下一篇: 如何确保 Redis 驱动消息队列的高可用