分布式架构中,一个系统由若干个子系统构成,因此系统与系统之间的通讯就显得很重要了
从上图中我们可以看到,消息中间件最根本的功能就是通讯,实现通信就需要遵守通信协议。通信协议有很多,比如TCP/IP协议、HTTP协议、AMQP、OpenMessage协议等,我们应该选择哪种呢?
其次,消息中间件需要具备高可用(持久化、集群),比如消息中间件刚收到消息后就宕机了,等待服务器恢复正常后,消息中间件是否还能够进行正常的消息分发呢?
然后,消息中间件还需要能给将消息分发给消费者,这就涉及到了分发策略的选择,是发布订阅模式?还是公平模式?还是轮询模式?
并且,消息中间件需要做到跨平台,不管我们的业务模块是用什么语言编写的,消息中间件都要能够支持
消息中间件所应该具备的能力
- 跨系统数据传递
- 高并发情况的流量削峰
- 数据的分发和异步处理
- 大数据分析和传递
- 分布式事务
比如我们有一个数据要进行迁移或者请求并发过多的时候,假设我们现在有10w的并发请求下订单,我们可以在这些订单入库之前,将这批订单请求堆积到消息队列中,让它稳健可靠的入库和执行
常见的消息中间件
- ActiveMQ
- RabbitMQ
- Kafka
- RocketMQ
消息中间件的本质
接收数据、存储数据、发送数据
消息中间件的组成部分
消息的协议(TCP/IP、UDP、AMQP、MQTT、Kafka协议、OpenMessage协议等)
所谓的协议是指:
计算机OS和应用程序通讯时所共同遵守的约定,只有遵循共同的约定和规范,应用和底层操作系统之间才能相互交流
网络协议的要素
- 语法:数据的结构与格式,以及数据出现的顺序
- 语义:解释数据中每个部分的含义,它规定了我们需要发出怎样的数据,以及发送完成后的动作和返回怎样的响应
- 时序:对事件发生顺序的详细说明
以http协议为例:
语法:http规定了请求报文和响应报文的格式
语义:客户端主动发起请求才称之为请求
时序:一个请求对应一个响应,先有请求再有响应
那为什么消息中间件的协议不直接使用http协议呢?
因为http请求报文头和响应报文头是比较复杂的,包含cookie、响应码、状态码等附加功能,但是这些东西对于消息中间件来说完全没用,它只需要负责数据的接收、存储、分发,它追求的是高性能、高可用,因此消息中间件所使用的协议一定要简洁、高效
大部分情况下http请求都是短链接,在实际交互过程中,客户端发起请求到响应结果返回,这个过程很可能会中断,中断以后不会进行持久化,就会造成消息的丢失,这对于消息中间件来说是不可接受的。
因为消息中间件所面临的场景是接收、存储、发送消息,这是一个长期的过程,中间出现问题的话,消息中间件需要对消息进行持久化等操作,保证消息的可靠
ps:短链接就是用户发起请求,此时服务器故障,则请求直接丢失,并不会维持客户端和服务端的链接;长链接就是当服务器出现故障,重启之后依然可以进行数据的传递,从而维持长久的关系
消息的持久化机制
ActiveMQ RabbitMQ Kafka RocketMQ 文件存储 √ √ √ √ 数据库 √ - - - 消息的分发策略
高可用、扩展性
消息的容错机制