概述
消息中间件是基于队列与消息传递技术,在网络环境中为应用系统提供同步或异步、可靠的消息传输的支撑性软件系统。
那 MQ 解决了什么问题?
对于电商app来说,顾客下单后要扣减商品库存,还要更新订单状态等一系列操作。当并发量大的时候,服务器磁盘、IO、CPU load 会很高,因此有的时候需要一个相对较长的时间间隔才能完成上述的一系列操作。如果用户提交完订单,让用户等待几秒才能成功,对于用户来说,会很不耐烦,甚至会流失大量用户。
如果有了 MQ ,可以让系统间的通信变为异步通信,系统A 发个消息到 MQ,系统 B什么时候获取消息进行处理,系统A不用管,系统A向MQ发送完消息只需要给用户及时反馈即可,剩下的操作系统B可能会在未来的几秒、几分钟甚至几小时后才进行处理。
使用场景
- 跨系统数据传递
- 高并发流量削峰
- 数据分发和异步处理
- 大数据分析与传递
- 分布式事务
消息中间件
协议
AMQP(Advanced Message Queuing Protocol) 是高级消息队列协议,是一个提供统一消息服务的应用层标准高级消息队列协议,是应用协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。
常见的消息中间件协议有:OpenWire、AMQP、MQTT、Kafka、OpenMessage
大部分消息中间件采用的是 AMQP 协议,那为什么不用 http 协议?
- http请求报文头和响应报文头比较复杂,包含了 cookie,数据的加密解密、状态码、响应码等附加的功能,但对于一个消息而言,不需要这么复杂,没有这个必要性,它其实就是负责数据传递、存储、分发就可以,追求的是高性能、尽量简洁、快速。
- 大部分情况下 http 都是短连接,在实际交互中,一个请求到响应很有可能中断,没进行持久化中断的话,会造成请求丢失。不利于消息中间件的业务场景,消息中间件可能是一个长期的获取消息的过程,出现问题和故障要对数据或消息进行持久化,目的是为了保证消息和数据的高可靠性。
实际上,AMQP是基于以上原因在 TCP/IP 协议基础上设计的协议。
AMQP特性:
- 分布式事务支持
- 消息的持久化支持
- 高性能和高可靠的消息处理优势
消息分发策略机制
实现方式
高可用机制
是指产品在规定的条件和规定的时间内处于可执行规定功能状态的能力。当业务量增加时,请求也过大,一台消息中间件服务器会触及硬件的极限,一台消息服务器已经无法满足业务的需求,所以消息中间件必须支持集群部署,来达到高可用的目的。
集群模式1 - Master - Slave 主从共享部署
生产者将消息写入到 master 节点,slave 节点连接 master 队列共享一个数据区域。一旦 master 挂掉,生产者就无法将消息发送到队列。
集群模式2 - Master - Slave 主从同步部署
生产者将消息写入到 master 节点,master 会同步数据到 slave 形成副本,如果有多个消费者就可以去不同的节点进行消费。但是消息的拷贝和同步会占用很大的带宽和网络资源。
集群模式3 - 多主集群同步部署
生产者将消息写入到master和slave所有节点,消费者也可以从任意节点消费消息。
集群模式4 - 多主集群转发部署
生产者可以向任意节点写入消息,如果向 broker1 中写入消息,broker1 中会存储数据的相关描述和记录存放的位置,也就是元数据信息。broker1 会向其他的 broker 同步元数据信息。消费者也可以从任意节点消费消息,如果从 broker2 中消费消息,broker2 自己没有对应的信息,可以从对应的元数据信息中查询,返回对应的元消息信息。
集群模式5 - Master - Slave 与 Breoker - Cluster 组合
实现多主多从的热备机制保证消息的高可用。