什么是MQ
- MQ全称是Message Queue,消息的队列,因为是队列,所以遵循FIFO 先进先出的原则,它是一种跨进程的通信机制,用于上下游传递消息.
- 目前主要有两种MQ协议:AMQP和MQTT
AMQP
- AMQP(Advanced Message Queuing Protocol)
- 设计目标: AMQP 是一种企业级消息协议,旨在提供可靠、灵活和跨平台的消息传递。它的设计目标是解决复杂的消息路由、高可靠性和事务性需求,适合企业应用集成和金融、电信等领域
核心组件
- 消息(Message):
消息是传递的数据单元,包含消息头(Headers)、属性(Properties)和消息体(Body)。
消息头用于存储元数据(如优先级、时间戳等)。
消息体是实际的数据内容。- 队列(Queue):
队列是消息的存储容器,消息按照先进先出(FIFO)的顺序存储。
队列可以持久化,确保消息在系统崩溃后不会丢失。- 交换机(Exchange):
交换机是消息的路由中心,负责将消息分发到队列。
交换机根据绑定规则(Bindings)和路由键(Routing Key)决定消息的去向。- 绑定(Binding):
绑定是交换机和队列之间的连接规则,定义了消息如何从交换机路由到队列。- 生产者(Producer):
生产者是创建并发送消息的应用程序或服务。- 消费者(Consumer):
消费者是从队列中获取并处理消息的应用程序或服务。
使用AMQP的场景
使用场景
流量削峰:解决高并发问题
- 例如秒杀活动,可能会在短时间内产生大量请求同时打到服务端,如果后端对每个请求都进行数据库读写操作,定会造成服务器压力过大,产生服务异常甚至不可用。我们可以通过使用MQ实现流量缓冲,将所有请求先放入消息队列中,服务端每次处理业务先从消息队列获取,从而实现流量削峰,解决高并发问题
应用解耦:提升系统可用性
- 例如电商应用中有订单系统、库存系统、物流系统、支付系统,当用户创建订单后,先后调用库存系统、物流系统、支付系统,任何一个子系统出了故障,都会造成下单失败。引入消息队列后,系统间耦合调用的问题会减少,任何一个子系统出现故障都不会影响用户下单,子系统故障恢复后,会继续处理消息,提升系统可用性。
异步处理:提升响应速度
- 当用户在客户端提交了一个同步请求,后端处理需要耗时很久才能响应,这对用户体验来说无疑是致命的。如果说用户并不关心请求是否处理完成,对于一些耗时的非事务性的业务处理,可以使用消息队列异步请求的方式,将请求信息放入消息队列,直接返回客户端响应,后端监听队列自行处理,提升响应速度
常见的AMQP
Kafka
- 大数据领域内的消息传输,则绕不开Kafka,这款为大数据而生的消息中间件,以其百万级TPS的吞吐量名声大噪
- 优点:单机写入TPS约在百万条/秒,最大的优点,就是吞吐量高。时效性ms级可用性非常高,kafka是分布式的,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用,消费者采用Pull方式获取消息,消息有序,通过控制能够保证所有消息被消费且仅被消费一次;有优秀的第三方Kafka Web管理界面Kafka-Manager;在日志领域比较成熟,被多家公司和多个开源项目使用;主要支持简单的MQ功能,在大数据领域的实时计算以及日志采集场景中大规模使用。
- 缺点:单机超过64个队列/分区,Load会发生明显的飙高现象,队列越多,Load越高,发送消息响应时间变长,使用短轮询方式,实时性取决于轮询间隔时间,消费失败不支持重试;支持消息顺序,但是一台代理宕机后,就会产生消息乱序,社区更新较慢
RabbitMQ
- 2007年发布,是一个在AMQP(高级消息队列协议)基础上完成的,可复用的企业消息系统,是当前最主流的消息中间件之一。
- 优点:由于erlang语言的高并发特性,性能较好;吞吐量到万级,MQ功能比较完备、健壮、稳定、易用、跨平台、支持多种语言,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX文档齐全;开源提供的管理界面非常棒,用起来很好用,社区活跃度高,更新频率相当高。
- 缺点:商业版需要收费,学习成本较高
RocketMQ
- 2007年发布,是一个在AMQP(高级消息队列协议)基础上完成的,可复用的企业消息系统,是当前最主流的消息中间件之一。
- 优点:由于erlang语言的高并发特性,性能较好;吞吐量到万级,MQ功能比较完备、健壮、稳定、易用、跨平台、支持多种语言,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX文档齐全;开源提供的管理界面非常棒,用起来很好用,社区活跃度高,更新频率相当高。
- 缺点:商业版需要收费,学习成本较高
ActiveMQ
- ActiveMQ是一款非常古老的MQ。
- 优点:单机吞吐量万级,时效性ms级,可用性高,基于主从架构实现高可用性,消息可靠,丢失数据的概率较低。
- 缺点:官方社区现在对ActiveMQ 5.x维护越来越少, 高吞吐量场景较少使用。
MQTT
- MQTT(Message Queuing Telemetry Transport)
- 设计目标
MQTT 是一种轻量级消息协议,专为低带宽、不稳定的网络环境设计。它的设计目标是实现高效的发布/订阅通信,适合物联网(IoT)和移动设备等资源受限的场景
核心组件
- 消息(Message):
消息是传递的数据单元,包含主题(Topic)和负载(Payload)。
主题用于标识消息的类型或来源。
负载是实际的数据内容。- 主题(Topic):
主题是消息的分类标识,采用分层结构(如 sensors/temperature)
消费者通过订阅主题来接收消息。- 代理(Broker):
代理是消息的中转站,负责接收发布者的消息并将其分发给订阅者。- 发布者(Publisher):
发布者是创建并发送消息的设备或应用程序。- 订阅者(Subscriber):
订阅者是接收并处理消息的设备或应用程序。
工作流程
- 发布者将消息发送到代理,并指定主题。
代理根据主题将消息分发给所有订阅该主题的订阅者。
订阅者接收消息并进行处理。
高级特性
- 服务质量(QoS):
提供三种消息传递质量级别:
QoS 0:最多一次(消息可能丢失)。
QoS 1:至少一次(消息可能重复)。
QoS 2:恰好一次(消息不丢失且不重复)。- 持久会话(Persistent Session):
订阅者可以设置持久会话,代理会保存离线期间的消息并在订阅者重新连接时重新投递。- 遗言(Last Will and Testament, LWT):
发布者可以设置遗言消息,当发布者异常断开时,代理会发布该消息。- 轻量级:
协议头部开销小,适合资源受限的设备。
适用场景
- 物联网(IoT):设备之间的实时通信。
移动应用:推送通知和实时更新。
远程监控:传感器数据的采集和传输