一、什么是消息队列?
消息队列(Message Queue),简称MQ,是一种应用间的通信方式,主要由三部分组成:
- 生产者(Producer):负责消息发送
- 代理(Broker):负责消息存储
- 消费者(Consumer):负责消息消费
二、消息队列有什么好处?
消息队列的好处主要有:解耦、异步、削峰
- 解耦:在一个复杂的系统里,不同的模块或服务之间可能需要相互依赖,如果直接用接口调用的方式进行交互,那么会造成代码耦合。如果其中一个模块发生改变,那么依赖的其他模块就需要同时做出改变。而使用消息队列后,我们只需要负责往队列里写消息,然后依赖的模块去监听即可,实现了模块之间的解耦。
- 异步:比如有些场景不要求实时、或者比较耗时,如果用同步的方式去处理就会阻塞流程,导致系统性能下降。所以使用消息队列可以异步处理这些消息,提高系统响应速度。(如发短信、下单通知等)
- 削峰:一般适用于流量高的场景,避免来不及消费的问题,使用消息队列的话就可以提高系统的吞吐量和响应速度。
三、市面上主流的消息队列对比
市面上主流的消息队列主要有Kafka、RabbitMQ、RocketMQ等,他们的区别如下表所示:
Kafka | RabbitMQ | RocketMQ | 备注 | |
---|---|---|---|---|
消费推拉模式 | pull | push | pull | pull适用于高吞吐量场景,允许消费者自己进行流量控制,但可能消息不实时,相反push适用于实时性较高的场景,但是要保证消费者的消费能力 |
消息丢失 | 参数优化(ack机制)后可以0丢失 | 参数优化后可以0丢失 | 可能性很低 | |
可用性 | 很高(分布式) | 很高(主从) | 高(主从) | |
消息传递模型 | 发布-订阅模型 | 点对点模式、发布-订阅模式 | 点对点模式、发布-订阅模式 | |
数据持久化 | 支持,追加写 | 支持 | 支持 | |
延迟队列 | 不支持 | 支持 | 支持 | |
消息回溯 | 支持 | 不支持 | 支持 | 如Kafka通过指定Offset或时间戳可重复消费消息 |
消息顺序性 | 分区有序 | 不支持 | 不支持 | |
消息延迟 | 毫秒 | 微秒 | 毫秒 | |
优先级队列 | 不支持 | 支持 | 不支持 | 优先级队列里的消息会优先消费 |
适用场景 | 适用于高吞吐量、低延迟的实时数据处理和事件驱动架构场景,具有良好的可伸缩性和持久性。如用户行为日志分析等 | 适用于需要可靠消息传递和灵活消息模型的场景,具有丰富的插件和社区支持。如金融系统的支持、订单处理等 | 适用于高性能、高可用性的消息传递场景,具有丰富的消息过滤和分布式事务等特性。如电商秒杀、用户推送等 |