zhangguosheng1121

一、中间件

1、定义

中间件(Middleware)是处于操作系统和应用程序之间的软件,也有人认为它应该属于操作系统的一部分。人们在使用中间件时,往往是一组中间件集成在一起,构成一个平台(包括开发平台和运行平台),但在这组中间件中必须要有一个通讯中间件,即中间件=平台+通信。这个定义也限定了只有用于分布式系统中才能称为中间件,同时还可以把它与支持软件和实用软件区分开来。

2、为什么要使用消息中间件

具体的说,中间件屏蔽了底层操作系统的复杂性,是程序开发人员面对一个简单而统一的开发环境,减少程序设计的复杂性,将注意力集中在自己的业务上,不比再为程序在不同系统软件上的移植二重复工作,从而大大减少了技术上的负担。中间件带给应用系统的不只是开发的简便,开发周期的缩短,也减少了系统的维护、运行和管理的工作量,还减少了计算机总体费用的投入。

3、特点

满足大量应用的需要

运行于多种硬件和OS平台

支持分布计算,提供跨网络、硬件和OS平台的透明性的应用或服务的交互

支持标准的协议

支持标准的接口

 

二、中间件架构

1、分类

①分布式消息中间件:RabbitMQ、ActiveMQ、Kafka、RocketMQ

场景:消息中间件监控数据、异步数据传输场景、任务调度场景、海量数据同步场景、分布式事物场景、日记管理场景、大数据分析场景

②负载均衡中间件:Nginx、LVS负载均衡软件、KeepAlive、CDN

③缓存中间件:Redis、MemCache

④数据库中间件:Mycat、ShardingLdbc

⑤案例分析:异步数据保存、订单数据的消息分发、分布式事务、分布式锁、分布式会话、分库分表

2、单体架构:

在实际的项目中,大部分的企业项目开发中,在早期都采用的是单体的架构模式,如下图:

在企业开发的中,大部分的初期架构都采用的是单体架构的模式进行架构,而这种架构的典型的特点:就是把所有的业务和模块,源代码,静态资源文件等都放在一个一工程中,如果其中的一个模块升级或者迭代发生一个很小变动都会重新编译和重新部署项目。

这种的架构存在的问题就是:

①耦合度太高

②运维成本过高

③不易维护

④服务器成本高

⑤升级架构的复杂性增大

这样就有了后续的分布式架构系统。如下:

3、分布式架构

通俗一点就是:一个请求由服务器端的多个服务(服务或者系统)协同处理完成。

和单体架构不同的是,单体架构是一个请求发起jvm调度线程(确切的是tomcat线程池)分配线程Thread来处理请求直到释放,而分布式是系统是:一个请求是由多个系统共同来协同完成,jvm和环境都可能是独立。

如果生活中的比喻的话,单体架构就想建设一个小房子很快就能够搞定,如果你要建设一个鸟巢或者大型的建筑,你就必须是各个环节的协同和分布,这样目的也是项目发展都后期的时候要去部署和思考的问题。

我们也不能看出来,分布式架构系统存在的特点和问题如下:

存在问题:

①学习成本高,技术栈过多。

②运维成本和服务器成本增高。

③人员的成本也会增高。

④项目的负载度也会上升。

⑤面临的错误和容错性也会成倍增加。

⑥占用的服务器端口和通讯的选择的成本高。

⑦安全性的考虑和因素逼迫可能选择RMI/MQ相关的服务器端通讯。

好处:

①服务系统的独立,占用的服务器资源减少和占用的硬件成本减少。确切的说是,可以合理的分配服务资源,不造成服务器资源的浪费。

②系统的独立维护和部署,耦合度降低,可插拔性。

③系统的架构和技术栈的选择可以变的灵活(而不是单纯的选择java)。

④弹性的部署,不会造成平台因部署造成的瘫痪和停服的状态。

 

三、基于消息中间件的分布式系统的架构

1、消息中间件

利用可靠的消息传递机制进行系统的系统之间的通讯。

通过提供消息传递和消息的排列机制,它可以在分布式系统环境下扩展进程间的通讯。

2、应用场景

①跨系统数据传递

②高并发的流量削峰(并行执行,异步编程)

③数据的分发和异步处理

④大数据的分析与传递

⑤分布式事务

 3、消息中间件的本质和设计

 4、消息中间件的核心组成部分

①消息的协议

②消息的持久化机制

③消息的分发策略

④消息的高可用、高可靠

⑤消息的容错机制

 

四、消息队列协议

 1、协议

我们知道消息中间件负责数据的传递,存储,和分发消费三个部分,数据的存储和分发的过程中肯定要遵循某种约定成俗的规范,你是采用底层的TCP/IP,UDP协议还是其他的等,而这些约定成俗的规范就称之为——协议。

所谓协议是指:

①计算机底层操作系统和应用程序通讯时共同遵守的一组约定,只有遵循共同的约定和规范,系统和底层操作系统之间才能相互交流。

②和一般的网络应用程序的不同,它主要负责数据的接受和传递,所以性能比较的高。

③协议对数据格式和计算机之间交换数据都必须严格遵守规范。

2、网络协议的三要素

①语法。是用户数据与控制信息的结构与格式以及数据出现的顺序。

②语义。是解释控制信息每个部分的意义,它规定了需要发出何种控制信息以及完成的动作与做出什么样的响应。

③时序。是对事件发生顺应的详细说明。

比如我MQ发送一个信息,是以什么数据格式发送到队列中,然后每个部分的含义是什么,发送完毕以后的执行的动作以及消费者消费消息的动作,消费完毕的响应结果和反馈是什么,然后按照对应的执行顺序进行处理。

如果你还是不理解:大家每天都在接触的http请求协议:

①语法:http规定了就求报文和响应报文的格式。

②语义:客户端主动发起请求称之为请求。(这是一种定义,同时你发起的是post/get请求)

③时序:一个请求对应一个响应。(一定先有请求在有响应,这个是时序)

而消息中间件采用的并不是http协议,而常见的消息中间件协议有:OpenWire、AMQP、MQTT、Kafka、OpenMessage协议。

面试题:为什么消息中间件不直接使用http协议呢?

①因为http请求报文头和响应报文头是比较复杂的,包含了cookie,数据的加密解密,状态码,响应码等附加的功能,但是对于一个消息而言,我们并不需要这么复杂,也没有这个必要性,它其实就是负责数据传递,存储,分发就行,一定要追求的是高性能。尽量简洁,快速。

②大部分情况下http大部分都是短链接,在实际的交互过程中,一个请求到响应很有可能会中断,中断以后就不会进行持久化,就会造成请求的丢失。这样就不利于消息中间件的业务场景,因为消息中间件可能是一个长期的获取消息的过程,出现问题和故障要对数据或消息进行持久化等,目的是为了保证消息和数据的高可靠和稳健的运行。

3、AMQP协议

AMQP(Advanced Message Queuing Protoco):是高级消息队列协议,由摩根大面集团联合其他公司共同设计。是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中问件设计。基于此协议的客户端与消息中问件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。Eriang中的实现有RabbitMQ等。

特性:

①分布式事务支持。

②消息的持久化支持。

③高性能和高可靠的消息处理优势

4、小结

协议是在tcp/ip协议基础之上的构建的一种约定书城的规范和机制,他主要的目的可以让客户端或者应用程序进行沟通和通讯,并且这种协议下规范必须具有持久性、高可用、高可靠特性。

 

五、消息队列持久化

1、持久化

简单来说就是将数据存入磁盘,而不是存在内存中随服务器重启断开而消失,使数据能够永久保存。

2、常见的持久化方式

  ActiveMQ RabbitMQ Kafka RocketMQ
文件存储 支持 支持 支持 支持
数据库 支持 / / /

 

六、消息的分发策略

1、消息的分发策略

MQ消息队列有如下几个角色:

①生产者

②存储消息

③消费者

那么生产者生成消息以后,MQ进行存储,消费者是如何获取消息的呢?一般获取数据的方式无外乎推(push)或者拉(pull)两种方式,典型的git就有推拉机制,我们发送的http请求就是一种典型的拉取数据库数据返回的过程。而消息队列MQ是一种推送的过程,而这些推机制会适用到很多的业务场景也有很多对应推机制策略。

2、分析场景一

比如我在APP上下了一个订单,我们的系统和服务很多,我们如何得知这个消息被哪个系统或者哪些服务进行消费,那这个时候就需要一个分发的策略。这就需要消费策略,或者称之为消费的方法论。

3、分析场景二

 

在发送消息的过程中可能会出现异常,或者网络的抖动,故障等等因素造成消息的无法消费,比如用户在下订单,消费MQ接受,订单系统出现故障,导致用户支付失败,那么这个时候就需要消息中间件必须支持消息重试机制策略。也就是支持:出现问题和故障的情况下,消息不丢失还可以进行重发。

4、消息分发策略的机制和对比

  ActiveMQ RabbitMQ Kafka RocketMQ
发布订阅 支持 支持 支持 支持
轮询分发 支持 支持 支持 /
公平分发 / 支持 支持 /
重发 支持 支持 / 支持
消息拉取 / 支持 支持 支持

 

七、消息队列高可用

1、高可用

所谓高可用:是指产品在规定的条件和规定的时刻或时间内处于可执行规定功能状态的能力。

当业务量增加时,请求也过大,一台消息中间件服务器的会触及硬件(CPU、内存、磁盘)的极限,一台消息服务器你已经无法满足业务的需求,所以消息中间件必须支持集群部署来达到高可用的目的。

2、集群模式1:Master-Slave主从共享数据的部署方式

生产者将消息发送到Master节点,所有的都连接这个消息队列共享这块数据区域,Master节点负责写入,一旦Master挂掉,Slave节点继续服务,从而形成高可用。

3、集群模式2:Master-Slave主从同步部署方式

这种模式写入消息同样在Master主节点上,但是主节点会同步数据到slave节点形成副本,和zookeeper或者redis主从机制很类同。

这样可以达到负载均衡的效果,如果消费者有多个这样就可以去不同的节点进行消费,因为消息的拷贝和同步会占用很大的带宽和网络资源。

在后续的rabbtmq中会有使用。

4、集群模式3:多主集群同步部署模式

和上面的区别不大,但是它的写入可以任意节点去写入。

5、集群模式5:多主集群转发部署模式

如果你插入的数据是broker-1中,元数据信息会存储数据的相关描述和记录存放的位置(队列)。

它会对描述信息也就是元数据信息进行同步,如果消费者在broker-2中进行消费,发现自己几点没有对应的消息,可以从对应的元数据信息中去查询,然后返回对应的消息信息。

场景:比如买火车票或者黄牛买演唱会门票,第一个黄牛有顾客说要买的演唱会门票,但是没有但是他会去联系其他的黄牛询问,如果有就返回。

 

八、消息队列高可靠

1、高可靠

是指系统可以无故障的运行,比如一个系统突然崩溃,报错,异常等等并不影响线上业务的正常运行,出错的几率极低,就称之为高可靠。

在高并发的业务场景中,如果不能保证系统的高可靠,那造成的隐患和损失是非常严重的。

如何保证中间件消息的可靠性可以从两个方面考虑:

①消息的传输:通过协议来保证系统间数据解析的正确性。

②消息的存储可靠:通过持久化来保证消息的可靠性。

 

分类:

技术点:

相关文章: