一、什么是中间件
1.中间件概述
中间件产生的原因
- 由于方法和体系的不成熟,以及企业业务和市场需求的不断变化,一个企业可能同时运行着多个不同的业务系统
- 这些系统可能基于不同的操作系统、不同的数据库、异构的网络环境
- 现在的问题是,如何把这些信息系统结合成一个有机地协同工作的整体,真正实现企业跨平台、分布式应用。中间件便是解决之道,它用自己的复杂换取了企业应用的简单
中间件的定义:
- 中间件(Middleware)是处于操作系统和应用程序之间的软件,也有人认为它应该属于操作系统中的一部分。
- 人们在使用中间件时,往往是一组中间件集成在一起,构成一个平台(包括开发平台和运行平台),但在这组中间件中必须要有一个通信中间件,即中间件=平台+通信
- 这个定义也限定了只有用于分布式系统中才能称为中间件,同时还可以把它与支撑软件和实用软件区分开来。
例如 Mysql 就是一个中间件:
- 程序员可以用不同的语言使用 MySQL 向硬盘中读写数据
- 不同语言都能使用 MySQL 的原因是它们与 MySQL 都遵循了 TCP/IP 协议
- 中间件必须要遵循指定的协议才能
中间件可以屏蔽操作系统的复杂性,也可以屏蔽应用程序架构之间的局限性
像一个系统可以用多种语言开发,中间使用中间件进行连接。
2.中间件技术及架构
3.消息中间件
消息中间件是:
- 一种接受数据、请求,存储数据,发送数据的技术服务
- MQ消息队列:负责数据的传接受,存储和传递,所以性能要过于普通服务和技术。
消息中间件的核心组成:
- 消息的协议
- 消息的持久化机制
- 消息的分发策略
- 消息的高可用,高可靠
- 消息的容错机制
4.消息队列协议
- 消息队列协议就是数据的存储和分发的过程中肯定要遵循某种约定成俗的规范
- 计算机底层操作系统和应用程序通讯时共同遵守的一组约定,只有遵循共同的约定和规范,系统和底层操作系统之间才能相互交流。
- 和一般的网络应用程序不同的是:它主要负责数据的接受和传递,所以性能比较高。
- 协议对数据格式和计算机之间交换数据都必须严格遵守规范。
网络协议的三要素:
- 语法。语法是用户数据与控制信息的结构与格式,以及数据出现的顺序。
- 语义。语义是解释控制信息每个部分的意义。它规定了需要发出何种控制信息,以及完成的动作与做出什么样的响应。
- 时序。时序是对事件发生顺序的详细说明。
拿http协议举例:
- 语法:http规定了请求报文和响应报文的格式。
- 语义:客户端主动发起请求称之为请求。(这是一种定义,同时你发起的是post/get请求)
- 时序:一个请求对应一个响应。(一定先有请求在有响应,这个是时序)
常见的消息中间件协议有:OpenWire、AMQP、MQTT、Kafka,OpenMessage协议
面试题:为什么消息中间件不直接使用http协议呢?
- 因为http请求报文头和响应报文头是比较复杂的,包含了cookie,数据的加密解密,状态码,响应码等附加的功能,但是对于一个消息而言,我们并不需要这么复杂,也没有这个必要性,它其实就是负责数据传递,存储,分发就行,一定要追求的是高性能。尽量简洁,快速。
- 大部分情况下http大部分都是短链接,在实际的交互过程中,一个请求到响应很有可能会中断,中断以后就不会就行持久化,就会造成请求的丢失。这样就不利于消息中间件的业务场景,因为消息中间件可能是一个长期的获取消息的过程,出现问题和故障要对数据或消息就行持久化等,目的是为了保证消息和数据的高可靠和稳健的运行。
4.1 AMQP 协议
(Advanced Message Queuing Protocol) 高级消息队列协议:
- 是一个基于 Erlang 开发的、提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。
- 基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。
- AMQP 协议的支持者有 RabbitMQ、ActiveMQ
特性:
- 分布式事务支持
- 消息的持久化支持。
- 高性能和高可靠的消息处理优势。
4.2 MQTT 协议
- MQTT(Message Queueing Telemetry Transport)消息队列是IBM开放的一个即时通讯协议,物联网系统架构中的重要组成部分。
- 支持 RabbitMQ、ActiveMQ
特点:
- 轻量
- 结构简单
- 传输快,不支持事务
- 没有持久化设计。
应用场景:
- 适用于计算能力有限
- 低带宽
- 网络不稳定的场景。
4.3 OpenMessage 协议
- 是近几年由阿里、雅虎和滴滴出行、Stremalio等公司共同参与创立的分布式消息中间件、流处理等领域的应用开发标准。
- 支持 RocketMQ
特点:
- 结构简单
- 解析速度快
- 支持事务和持久化设计。
4.4 Kafka 协议
Kafka协议是基于TCP/IP的二进制协议。消息内部是通过长度来分割,由一些基本数据类型组成。
特点:
- 结构简单
- 解析速度快
- 无事务支持
- 有持久化设计
5.消息队列持久化
- 简单来说就是将数据存入磁盘,而不是存在内存中随服务器重启断开而消失,使数据能够永久保存。
常见的持久化方式:
ActiveMQ | RabbitMQ | Kafka | RocketMQ | |
---|---|---|---|---|
文件存储 | 支持 | 支持 | 支持 | 支持 |
文件存储 | 支持 | / | / | / |
6.消息队列的分发策略
- MQ消息队列有生产者、存储消息、消费者这三个角色
- 生产者生成消息以后,MQ进行存储,MQ推送消息给消费者获取数据。
ActiveMQ | RabbitMQ | Kafka | RocketMQ | |
---|---|---|---|---|
发布订阅 | 支持 | 支持 | 支持 | 支持 |
轮询分发 | 支持 | 支持 | 支持 | / |
公平分发 | / | 支持 | 支持 | / |
重发 | 支持 | 支持 | / | 支持 |
消息拉取 | / | 支持 | 支持 | 支持 |
正常情况下,消息中间件发送消息,并将数据存储到硬盘
但是当 MQ 发送消息给订单系统的时候,订单系统挂掉了,返回给 MQ 失败的消息,进行重发。支持重发的消息队列:在出现问题和故障的情况下,消息不丢失还可以进行重发。
7.消息队列的高可用和高可靠
7.1 高可用机制
高可用:
- 是指产品在规定的条件和规定的时刻或时间内处于可执行规定功能状态的能力
- 当业务量增加时,请求也过大,一台消息中间件服务器会触及硬件(CPU,内存,磁盘)的极限,一台消息服务器已经无法满足业务的需求,所以消息中间件必须支持集群部署。来达到高可用的目的。
7.2 集群模式
7.2.1.主从共享
也称 主写从读
Master 节点负责数据的写入,与 Slave 节点从同一块存储区域获取数据,实现主从共享,即使 Master 节点挂掉了, Slave 节点依旧可以获取数据
缺点是 一旦 Master 节点挂掉了,客户端无法再写入数据
7.2.2.主从同步部署
也称主从复制
这种模式写入消息同样在Master主节点上,但是主节点会同步数据到slave节点形成副本,和zookeeper或者redis主从机制很类同
缺点:消息的拷贝和同步会暂用很大的带宽和网络资源
7.2.3.多主集群同步部署模式
相较于是 主从同步部署的升级版,从节点也可以存储数据
减缓了主节点的压力,每个节点之间相互拷贝
缺点:消息的拷贝和同步会暂用很大的带宽和网络资源
7.2.4.多主集群转发部署
元数据信息 会存储数据的位置。当访问的当前服务器不存在要查找的数据时,会根据元数据信息提供的位置转发到对应的服务器。
减少数据空间的存储,不造成服务器资源的浪费。
7.2.5.多诸多从
一般时大型的项目中采用。
这么集群模式,具体在后续的课程中会进行一个分析和讲解。他们的最终目的都是为保证:消息服务器不会挂掉,出现了故障依然可以抱着消息服务继续使用。
集群模式的最终共性:
- 要么消息共享
- 要么消息同步
- 要么元数据共享
7.3 高可靠机制
系统可以无故障低持续运行,比如一个系统突然崩溃,报错,异常等等并不影响线上业务的正常运行,出错的几率极低。
如何保证中间件消息的可靠性?
- 消息的传输:通过协议来保证系统间数据解析的正确性。
- 消息的存储可靠:通过持久化来保证消息的可靠性。加粗样式