中间件
“中间件”对于初学者而言,这是一个很抽象的概念。那么,到底什么是中间件呢?我其实,我也不知道,但我可以帮你去理解它。
简单来说,就一个公式:中间件 = 平台 + 通信
那么,如何来解读这个公式呢?
一般,一个平台是包含多个子系统,而用来开发这些子系统的编程语言可能是多种(Java、Go、C++),但这些子系统通过中间件、操作系统进行通信(如:一个电商平台,订单系统是由 Java 语言开发,而支付系统是由 Go 语言开发。当一个用户下完单准备支付时,此时,支付系统是要和订单系统进行通信的,订单系统要告诉支付系统该支付多少钱嘛)
子系统通过中间件进行数据通信:
中间件的特点
那么,从上面的描述来看,中间件有哪些特点呢:
- 遵循某种规范、协议,这样,彼此双方才能互通(通信能力)
- 具有存储功能,能持久化到磁盘(持久性、可靠性)
- 跨平台(微服务 订单系统用 Java 语言,支付系统用 Go 语言,但这两个系统要进行交互)
- 一台机器性能达到物理极限,能支持集群(高可用)
常用的中间件:
- MYSQL
- MQ
- REDIS
- NGINX
中间件的优势
使用中间件,有什么优势?
- 中间件屏蔽了操作系统的复杂性(如:MySql 数据库的持久化。你并不需要知道它是如何持久化到磁盘的,它都已经帮你做好了)
- 屏蔽软件架构的局限性(平台中的子系统可以使用多种开发语言。如: Java、Go)
中间件的分类
常用的中间分为以下几类:消息中间件、负载均衡中间件、缓存中间件、数据库中间件
每一类中间对应的产品如下:
分布式消息中间件 | 负载均衡中间件 | 缓存中间件 | 数据库中间件 |
---|---|---|---|
RabbitMQ:滴滴、美团公司使用;和Spring 是同一家公司开发出来的,Spring 框架支持 | Nginx | Redis | MyCat |
RocketMQ | KeepAlive | MemCache | ShardingJdbc |
Kafka:传输二进制,最接近底层,性能最高 | CDN | ||
ActiveMQ:老技术了 | LVS负载均衡软件 |
这里重点讲述的是消息中间件哈。
消息中间件
什么是消息中间件?
消息中间件 又称 消息队列,简称 MQ。指:利用高效、可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。
消息中间件一般有两种传递模式:点对点模式;发布/订阅模式
- 点对点:基于队列。消息生产者发送消息到队列,消息消费者从队列中接收消息,队列的存在使得消息的异步传输成为可能
- 发布/订阅(一对多广播):消息发布者将消息发布到某个主题 topic,而消息订阅者从主题中订阅消息。主题使得消息的订阅者与消息的发布者互相保持独立,不需要进行接触即可保证消息的传递。
目前,比较主流的消息中间件有:RabbitMQ、Kafka、ActiveMQ、RocketMQ。面向消息的中间件提供了以松散耦合的灵活方式集成应用程序的一种机制。它们提供了基于存储和转发的应用程序之间的异步数据发送。即:应用程序彼此间不直接通信,而是与作为中介的消息队列通信。
消息中间件的工作流程
消息中间件适用于需要可靠的数据传送的分布式环境。采用消息中间件的系统中,不同对象之间通过传递消息来激活对方的时间,已完成相应的操作。
发送者将消息发送给消息服务器,消息服务器将消息存放在若干队列中,在合适的时候再将消息转发给接收者。消息中间件能在不同平台之间通信,它常被用来屏蔽各种平台及协议之间的特性,实现应用程序之间的协同。其优点在于:能够在客户和服务器之间提供同步、异步的连接,并且在任何时刻都可以将消息进行传送或者存储转发。
如下图,应用程序 A 与应用程序 B 通过消息中间件的应用程序编程接口(API,Application Program Interface)发送消息进行通信:
应用程序 A 通过 API 将消息发送给消息中间件,而消息中间件将消息路由给应用程序 B。这样,消息就可存在于完全不同的计算机上。消息中间件负责处理网络通信,如果网络连接不可用,消息中渐渐会存储消息,直至连接变得可用,再将消息转发给应用程序 B。
灵活性的另一方面体现在:当应用程序 A 发送消息时,应用程序 B 甚至可以处于不运行状态,消息中间件将保留这份消息,直至应用程序 B 开始执行并消费消息。这样,还防止了应用程序 A 因为等待应用程序 B 消费消息而出现阻塞。
消息中间件的核心架构
- 协议:数据的存储、分发遵循着某种协议(AMQP 协议,架构在 TCP/IP 之上)。为什么不用 HTTP 协议?HTTP 协议请求头/响应头复杂,包含了 Cookie、状态码、响应码等附加功能,对于消息而言,并不需要这么复杂,只是进行着数据的传递、存储、分发,它一定追求高性能,尽量地简洁、快速;HTTP 协议是短连接,在实际的交互过程中,一个请求很有可能中断,中断后不会进行持久化,就会造成请求的丢失,这不利于消息中间件的业务场景。因为消息中间件是一个长期获取消息的过程,出现问题/故障,就要对数据/消息进行持久化,目的是为了保证消息/数据的高可用和稳健的运行。
- 持久化:以文件的形式持久化到磁盘
- 分发策略:
- 高可用、高可靠
协议
关于消息中间件的协议有: AMQP 协议、 MQTT 协议、OpenMessage 协议、Kafka 协议
-
AMQP 协议:高级消息队列协议,由 Erlang 语言实现(底层由 C 语言开发,性能极高),RabbitMQ 是由 Erlang 语言开发的
它的特点如下:
- 支持分布式事务
- 支持消息的持久化
- 高性能、高可靠
-
MQTT:即时通讯协议,物联网系统架构的重要组成部分
它的特点如下:
- 轻量、结构简单
- 不支持事务,传输快
- 不支持持久化
-
OpenMessage:阿里、雅虎等公司创立的分布式消息中间件、流处理等领域的应用开发标准
它的特点如下:
- 结构简单
- 解析速度快
- 支持事务、持久化
-
Kafka:基于 TCP/IP 的二进制协议,消息内容是通过长度来分割,由一些基本数据类型组成
它的特点如下:
- 结构简单
- 解析速度快
- 不支持事务、
- 支持持久化
消息中间件的分发策略
分发策略的机制和对比:
ActiveMQ | RabbitMQ | Kafka | RocketMQ | |
---|---|---|---|---|
发布订阅 | 支持 | 支持 | 支持 | 支持 |
轮询分发 | 支持 | 支持 | 支持 | |
公平分发 | 支持 | 支持 | ||
重发 | 支持 | 支持 | 支持 | |
消息拉取 | 支持 | 支持 | 支持 |
以上内容,大家留下个印象就行了哈。如果是刚入手,理解起来有点困难,但没关系,不影响后续的学习哈~~