消息队列有什么用?
- 异步:请求后立刻返回,后续慢慢处理,如订单等复杂业务,后续通过邮件等进行通知。
- 削峰/限流:短时间高并发请求放在消息队列中,慢慢消费,避免被打垮
- 降低系统耦合性:业务拆分,每个模块实现自己的业务,通过消息队列联通。
- 分布式事务:如 RocketMQ,允许将生产、消费、处理定义成一个原子操作。
- 顺序保证:按顺序消费。
- 延时/定期处理
- 数据流处理:如日志、监控数据等。
使用消息队列会带来哪些问题?
- 系统可用性降低:消息可能会丢失或者消息队列挂掉
- 系统复杂性提高: 需要克服消息丢失、重复消费、消费顺序混乱等问题
- 一致性问题: 需要保证消息正确消费。
分布式消息队列技术选型
常见的消息队列都支持持久化到磁盘。
比对
语言
- Kafka:采用Scala语言开发
- RabbitMQ:由Erlang语言开发(定制比较麻烦),但是比较适用于高并发,且延时较低(语言特性)
- RocketMQ:采用Java语言开发(定制比较容易)
性能和可靠性
- Kafka:吞吐量极高,使用了零拷贝
- TPS可达百万条/秒
- 支持同步和异步复制消息,但异步复制存在丢消息的可能。
- 采用分布式架构,一个数据多个副本
- 可能处在重复消费的问题(在大数据或者日志领域可以忽略)
- RocketMQ:性能较高
- 单机写入TPS单实例约7万条/秒
- 采用分布式架构
- 支持强一致性
- RabbitMQ:性能稍逊于Kafka和RocketMQ
- 可靠性较好,支持确认机制、事务、委托和备份交换器等机制。
- 采用主从架构
- 数据丢失的概率最低
