Laravel异步队列选择Redis还是Redis

39次阅读

共计 1157 个字符,预计需要花费 3 分钟才能阅读完成。

原文来着 https://www.jianshu.com/p/16c92227076c

今天我在异步队列的选择上,犹豫了一下。

RabbitMQ

RabbitMQ 是实现 AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。

Redis

是一个 Key-Value 的 NoSQL 数据库,开发维护很活跃,虽然它是一个 Key-Value 数据库存储系统,但它本身支持 MQ 功能,所以完全可以当做一个轻量级的队列服务来使用。

因为 RabbitMQ 具有天然的发布订阅模式, 而且还提供了其他模式,当然你也可以用 RabbitMQ 来做GRPC。但是 Redis 没有这个,需要自己实现,换句话来说就是当消费者消费失败的时候,消息体丢失,需要手动处理。

持久化

Redis:将整个 Redis 实例持久化到磁盘
RabbitMQ:队列,消息,都可以选择是否持久化

这样一些特点之后,我们可以得到一个应用场景就是

Redis:轻量级,高并发,延迟敏感
即时数据分析、秒杀计数器、缓存等

RabbitMQ:重量级,高并发,异步
批量数据异步处理、并行任务串行化,高负载任务的负载均衡等

比如异步的发送邮箱呀、浏览器的用户行为、等非主要主线任务,异步发送 Socket 消息 等 都可以交给 RabbitMQ 消息队列来处理。如果是主线业务流程的话,还是考虑使用 Redis 吧,性能高。

RabbitMQ+PHP 教程一 Hello World
这是一篇简单文章,没用过的同学可以先试着安装,可以当时没有业务支持,并没有使用。

现在有业务支持,使用的是 laravel-queue-rabbitmq 这个扩展包, 可以参考以下文章。

Laravel5.6 整合 RabbitMQ 消息队列

注意:
运行 php artisan queue:work rabbitmq 后,他运行的地方是在 cli 中,所以你每次修改完,代码之后请务必要重新运行 `php artisan queue:work rabbitmq
`
其他问题

RabbitMQ 怎么运行?

如果你不是 java 出身的同学,可能比较麻烦 ….
我们可以借用 docker,我们用的是 rabbitmq:management,默认密码都为guest
运行两步曲

docker pull rabbitmq:management

docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq:management

然后浏览器可以通过 IP:15672 访问 rabbitmq 后台。

如果你的主程序在 docker 里面运行 php 填写的地址请填写你本机的 IP, 例如 192.168.1.1 而不是127.0.0.1

正文完
 0