什么是消息队列?
(Message Queue)消息队列是一种在软件系统中用于异步通信的机制。
在消息队列中,消息发送方将消息发送到队列中,接收方从队列中获取消息。消息队列充当了一个中间件角色。
如图:左侧是http接口调用,右侧使用消息队列
消息队列的特点
优势
-
异步通信:发送方无需等待接收方的响应即可继续处理其他任务,实现了异步通信的能力。(提升用户体验和系统吞吐量)
-
解耦:消息队列将消息的发送者和接收者解耦和解偶,它们可以独立开发、部署和扩展,不需要直接相互依赖。(提高容错性和可维护性)
-
缓冲和削峰填谷:消息队列可以作为缓冲层,将消息暂存起来,使得消息的发送和接收可以在不同的时间和速度上进行,平衡不同组件之间的处理能力,避免系统的峰值负载压力。举例(淘宝秒杀,这种情形时大量的服务突然打进来,那服务就会直接被压死了。但是如果采用消息队列,这秒杀进来的所有的请求都不会直接打到具体服务上,都会先打到消息队列里,然后后面的服务再慢慢消费。)
-
可靠性和持久化:消息队列提供持久化机制,将消息保存在持久化存储中,确保消息在发送和接收过程中不会丢失。
劣势:
-
实时性限制:消息队列的异步特性导致消息的传递会引入一定的延迟。(相比于直接的HTTP接口调用,消息队列需要将消息发送到队列中并等待消费者处理,这可能会导致处理时间的延迟。)
-
数据一致性:由于消息队列的异步特性,无法保证消息的即时一致性。(在消息发送和消费的过程中,由于网络问题、系统故障或其他原因,可能会导致消息丢失、重复消费或乱序消费等情况,这对于某些应用场景可能会带来数据一致性的问题。)
-
复杂性:引入消息队列会增加系统的复杂性。(需要额外的配置、部署和维护消息队列系统,涉及到消息的序列化、反序列化、消息格式等。同时,消息队列的引入也会带来一些新的概念和机制,如消息确认、重试机制、消息丢失处理等,增加了系统的复杂性和开发成本。)
-
可见性和调试:相对于直接的HTTP接口调用,消息队列对于消息的可见性和调试能力较差。(在消息队列中,消息被发送到队列中后,除了消费者之外,其他系统无法直接查看和调试消息的内容和状态。这可能增加故障排查和调试的难度。)
使用消息队列的条件
-
生产者不需要从消费者处获得反馈
-
容许短暂的不一致性
-
MQ的解耦异步削峰大于负面影响
目前市面上的消息队列有很多,例如:Kafka、RabbitMQ、ActiveMQ、RocketMQ、ZeroMQ等。
目前的吞吐量上面,kafka是这些中间件的做得最好