如何选择正确的消息队列驱动
Laravel 目前支持以下消息队列存储驱动:
- Redis
- Database
- SQS
- Beanstalkd
大多数时候,选择使用哪个驱动取决于安装的简易性和运行的可靠性。
数据库驱动设置起来最简单,维护也方便,因为我们已经习惯使用它来处理关系数据的存取,最适合不熟悉消息队列的入门者使用,不过,还是要看看其他的驱动。
Redis
目前 Laravel 底层是基于 Redis 列表来实现消息队列的,对应的队列推送和获取指令如下:
由于 Redis 服务是单进程的,所以即便有多个客户端同时过来获取消息,也不会将同一个消息返回,也就不存在并发安全问题。此外,由于 Redis 所有数据都存储在内存中,所以性能非常高。
也正是因为所有队列任务都以序列化方式存储在内存中,而内存通常不会像磁盘那样空间大,所以要尽量减少队列任务的大小,避免占用大量内存。与此同时,也要尽可能多启动几个处理器进程加快队列消费速度,避免任务堆积让内存占用越来越高。
数据库
使用数据库驱动,所有队列任务会存放在 jobs
表中,你可以在任何时候通过 GUI 工具查看队列中的任务。所以数据库驱动的优点是数据可见性,无需引入额外安装和配置,直接基于现有数据库即可。
如果你的队列吞吐量不是很大的话,可以从数据库驱动开始入门。到有一天不足以支持消息队列的并发和吞吐了,切换到其他驱动也很简单。
SQS 和 Beanstalkd
SQS 是 AWS 提供的队列云服务,如果应用部署在 AWS 上,和 SQS 的通信会非常快。一般来说,数据库、Redis 或者队列云服务已经足以应付小、中、大三种吞吐量的队列系统了,不需要使用 Beanstalkd。
同步执行队列任务
本地开发测试时,还可以将队列驱动配置为 sync
,这样,所有队列任务会立即同步执行,而不会推送到任何消息队列驱动:
因此,也就不需要运行队列处理器进程消费它们了。
在不同驱动之间切换
如果你想要从一种消息队列驱动切换到另一种,对应步骤如下:
- 在配置文件
queue.php
中配置新的队列连接; - 更新代码,将任务推送到这个新的连接;
- 启动处理器进程消费来自新的连接的队列任务;
- 等到老的队列中所有任务处理完毕后停止老的队列处理器进程。查看老队列是否为空的代码如下:
存储任务到不同机器
如果有多个服务器,可以在一台机器处理 HTTP 请求,在另一台机器通过 Supervisor 维护队列处理器进程,然后在第三台服务器安装和设置队列系统(Redis、MySQL)。
这样一来,你就可以针对不同机器做不同的配置和调整,如果为安装 Redis 队列存储的机器分配更多内存、为运行队列处理器进程的机器分配更多 CPU。
当你配置好每个应用实例的 queue.php
和 .env
后,就可以在一台机器推送任务,在另一台机器消费这些任务了。
No Comments