MQ 的应用场景:
- 第一个应用就是商品秒杀以及产品抢购等使用场景
- 使用 MQ 实现消息通讯,实现实时通讯功能
- 使用 MQ 实现日志系统
常用的 MQ 中间件有 RabbitMQ、Kafka 和 Redis 等,其中 Redis 属于轻量级的消息队列,而 RabbitMQ、Kafka 属于比较成熟且比较稳定和高效的 MQ 中间件
MQ 的特点:
- 先进先出
- 发布、订阅工作模式
- 持久化
- 分布式
- 消息确认
引入 MQ 系统会带来的问题
- 增加了系统的运行风险。如果 MQ 系统挂掉的话可能会导致整个业务系统瘫痪。
- 增加了系统的复杂度。引入 MQ 系统后,需要考虑消息丢失、消息重复消费、消息的顺序消费等问题。
redis
优点
redis 是一种轻量级的消息中间件。
在业务不复杂的场景下可以尝试性的使用Redis
提供的消息队列。
缺点
Redis 5.0 之前,是不支持消息确认的。
通过 List 数据类型的 lpush 和 rpop 方法来实现队列消息的存入和读取功能,或者使用 Redis 提供的发布订阅(pub/sub)功能来实现消息队列,但这种模式不支持持久化。
Redis 5.0 之后提供了新的数据类型 Stream 解决了消息确认的问题,它同样不能提供复杂的路由匹配规则。
RabbitMQ
分布式情况下,至少需要一个磁盘节点,内存节点不做限制。
优点
保证数据不丢失。
RabbitMQ 支持拉取数据模式和主动推送数据的模式,也就说 RabbitMQ 服务器会主动把消息推送给订阅的消费者;
RabbitMQ 支持多租户的功能
缺点
RabbitMQ 并不支持消息回溯;
RabbitMQ 是没有幂等性功能支持的
Kafka
Kafka 是 LinkedIn 公司开发的基于 ZooKeeper 的多分区、多副本的分布式消息系统
优点
1、Kafka 支持消息回溯,它可以根据 Offset(消息偏移量)、TimeStamp(时间戳)等维度进行消息回溯;
2、Kafka 的消息消费是基于拉取数据的模式,也就是消费者主动向服务器端发送拉取消息请求;
3、在相同配置下,Kafka 的吞吐量通常会比 RabbitMQ 高一到两个级别,比如在单机模式下,RabbitMQ 的吞吐量大概是万级别的处理能力,而 Kafka 则可以到达十万甚至是百万的吞吐级别;
4、Kafka 用户多,社区活跃;
此外,Kafka 从 0.11 版本就开始支持幂等性了
缺点
- Kafka 并不支持多租户的功能;
- 需要依赖
Zookeeper
进行数据管理。