在传统的单体应用中,所有的功能模块集中在一个应用中,如下图
随着业务扩展,访问量提高,单体应用不易扩展,业务越来越复杂等缺点更加突出,因此开始将服务拆分,根据不同模块拆分成不同的服务,如下图
分布式系统之间相互调用使用RPC技术,这样会导致系统之间耦合度很高,这时又出现一种新的系统架构,即基于消息中间件的分布式系统架构。
什么是消息中间件?
利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成,通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。其本质是一种具备接收请求、保存数据、发送数据等功能的网络应用。
消息中间件的应用场景
跨系统数据传递、高并发流量削峰、数据异步处理等。
常的消息中间件
ActiveMQ, RabbitMQ Kafka, RocketMQ等。
消息中间件和一般网络应用程序的区别是它主要负责数据的接收和传递,所以性能一般都高于普通程序。消息中间件由5大核心组成:协议、持久化机制、消息分发机制、高可用设计、高可靠设计。
协议
协议是计算机之间通信时共同遵从的一组约定,是对数据格式和计算机之间交换数据时必须遵守的规则的正式描述。只有都遵守相同的约定,计算机之间才能相互交流。
协议三要素:
1、语法:即数据与控制信息的结构或格式;
2、语义:即需要发出何种控制信息,完成何种动作以及做出何种响应;
3、时序(同步) :即事件实现顺序的详细说明。
Http协议三要素举例:
语法:http规定了请求报文和响应报文的具体格式。
语义: 客户端主动发起的操作称为请求;
时序: 一个请求对应一个响应。
消息中间件常用的协议:OpenWire、 AMQP、 MQTT、 Kafka、OpenMessage
为什么消息中间件不直接使用Http协议?
Http传输的数据比较大,而MQ功能单一,数据简介,速度快。
AMQP协议: AMQPI (Advanced Message Queuing Protocol)是高级消息队列协议,04年JPMorgan Chase(摩根大通集团)联合其他公司共同设计。
特性: 事务支持、持久化支持,出生金融行业,在可靠性消息处理上具备天然的优势。
具体应用: RabbitMO、Apache ActiveMQ
MQTT协议: MQTT (Message Queuing Telemetry Transport)消息队列遥测传输是IBM开发的一个即时通讯协议,物联网系统架构中的重要组成部分。
特性: 轻量、结构简单、传输快、没有事务支持、没有持久化相关设计。
应用场景: 适用于计算能力有限、低带宽、网络不稳定的场景。
具体应用: RabbitMO、Apache ActiveMQ
Open Message协议: OpenMessaging是近一两年由阿里发起,与雅虎、滴滴出行、Streamlio等公司共同参与创立的分布式消息中间件、流处理领域的应用开发标准。是国内首个在全球范围内发起的分布式消息领域国际标准。
特性: 结构简单、解析快、有事务设计、有持久化设计。
具体应用: Apache RocketMQ
Kafka协议: Kafka协议是基于TCP的二进制协议。消息内部是通过长度来分隔,由一些基本数据类型组成。
特性: 结构简单、解析快、无事务设计、有持久化设计 。
具体应用: kafka
持久化
简单来说就是将数据存入磁盘,而不是存在内存中随服务重启而消失,使数据能够永久保存叫做持久化。
ActiveMQ | RabbitMQ | kafka | RocketMQ | |
---|---|---|---|---|
文件系统 | 支持 | 支持 | 支持 | 支持 |
数据库 | 支持 | / | / | / |
消息分发
消息分发必要性
ActiveMQ | RabbitMQ | kafka | RocketMQ | |
---|---|---|---|---|
发布订阅 | 支持 | 支持 | 支持 | 支持 |
轮询分发 | 支持 | 支持 | 支持 | / |
公平分发 | / | 支持 | 支持 | / |
重发 | 支持 | 支持 | / | 支持 |
消息拉取 | / | 支持 | 支持 | 支持 |
![](https://i-blog.csdnimg.cn/blog_migrate/0a8abe1b3ce56600d39bf2bcd96e035e.png)
对于业务场景一,我们需要分发策略决定发给哪台服务器
![](https://i-blog.csdnimg.cn/blog_migrate/474a7250cc6fcf0fd7968b25dc9e895f.png)
业务场景二中,当支付系统给消息中间件返回失败时,我们需要分发策略来重新发送支付消息
高可用机制
高可用性是指产品在规定的条件和规定的时刻或时间区间内处于可执行规定功能状态的能力。当业务量大时,一台消息中间件服务器可能无法满足需求,所以需要消息中间件能够集群部署,来达到高可用的目的。
![](https://i-blog.csdnimg.cn/blog_migrate/43e802009f3ebe939fffca6bc5085938.png)
在这种模式下,当客户端发送数据时,master将数据写入到文件系统或者数据库中,当master挂掉后,写数据任务切换到另外一台slave服务器上。
![](https://i-blog.csdnimg.cn/blog_migrate/b92587b20bab3746a7ee9655781ee740.png)
在这种模式下,写和修改在主服务器上。主从会有一个同步过程,将主服务器上数据同步到从服务器上,不过这样会占用带宽。
![](https://i-blog.csdnimg.cn/blog_migrate/aff533e446ac14422117cd3cb4295db2.png)
在这种模式下,写和修改可以在任何一台服务器上(主和从),主从服务器之间会相互同步数据,保证数据的一致性。
![](https://i-blog.csdnimg.cn/blog_migrate/ad14370d6b2cb3089f07ab4296663fcc.png)
在这种模式下,例如将数据存储到Broker1中,这时不会同步数据到其他服务器上,而是同步这些数据的描述,让其他服务器知道Broker1中存储了哪些数据。就像你在某宝的裤子专卖店买包包,裤子专卖店是不卖包包的,但是裤子专卖店知道其他哪个店有卖包包的,所以会将你的需求转发到卖包包的专卖店。
这种模式下,服务器之间共享的是元数据,每台服务器都会存储一部分数据,这样同步消耗小,但是当一台服务器挂掉,这台服务器上存储数据也就丢失了。
![](https://i-blog.csdnimg.cn/blog_migrate/b056029840194c71d19a0b70cb24be00.png)
这种模式下,每一组主从共享一个数据库,这样既可实现负载均衡,又能实现数据备份
高可靠
高可靠性是指系统可以无故障地持续运行。比如一个系统从来不崩溃、报错,或者崩溃、报错的几率较低,那就是高可靠。
在高并发业务场景下,如果不能保证系统的高可靠,那造成的损失将会非常严重。
保证消息中间件的高可靠性,可以从以下几方面考虑
1、消息传输可靠:通过协议来保证系统间数据解析的正确性。
2、消息存储可靠:通过持久化来保证消息的存储可靠性。