在分布式的环境下,我们除了使用httprest、rpc、消息中间件也是一个去使两个系统之间进行通信的方式,当我们想提高程序响应速度的时候,一个就是 【使用多线程进行并行处理】,另外就是使用【异步的方法】,那就可以使用(消息中间件)MQ
【消息中间件】: 利用高效可靠的消息传递机制,进行多平台之间直接的交流的一种媒介(就是一个第三方的工具,可以让一个或者多个系统收到某个系统发出的消息。)主要做【数据的接受和传递】
【应用场景】:跨系统之间的信息传递、高并发的流量削峰(当请求峰值来临,把数据放在中间件去慢慢处理)、以及数据的异步处理(类似注册,发短信这些东西就可以异步进行)
【常用的消息中间件】:
Active(太老了,支持很多功能,所以性能不怎么样,一些老一点的项目会使用)、Rabbit、kafka、rokcet
【核心组成】:
【协议】:设置一种系统直接的语言规则,简而言之就是大家都要遵守相同的规则,否则彼此不知道对方发过来的是什么意思。
【持久化机制】:在中间件内部保留数据的手段
【消息分发机制】:一种消费消费模式,比如主动推送数据、或者别人来拉取数据。
【高可用】:中间件自己不能宕机(有很多方式:分片复制,镜像、主从 so on)
【高可靠】:保障消息被消费。
协议:
协议是计算机之间通讯时共同遵守的一组约定,对数据格式和计算机交换数据的一种规范。http、tcp/ip、 upd这些都是数据一种通讯协议
这里用【http协议】举个例子说明协议的三个要素:
【语法】:传输信息的格式或者结构(请求报文和响应报文)
【语义】 :他则定义了数据格式,编码、信号、数据出现的顺序等(客户端主动发起的操作成为请求)
【时序】::通信双方通信的次序,他里面定义了速度匹配和排序等(一个请求,对应一个响应)
常用的消息中间件协议:OpenWire、AMQP、MQTT(物联网)、Kafka、OpenMessage。他们等于是一系列规范,然后各种中间件对他们进行实现,就想servelet的实现有tomcat、jetty等
【HTTP】不适合作为中间件的协议原因是:是因为http太重了,而且不高效(需要一次请求、一次响应)。
【AMQP】:【rabbit】和【active】使用他,他的出现最早是解决金融行业的可靠性的,所以【可靠性】是它的最大优势。
【MQTT】:主要用在物联网上,【速度非常快】(用c编写的)【计算能力有限】
【OpenMessage】:近两年由阿里、滴滴等共同发起的标准,【rocket】使用他,【结果简单、解析快、事务性】
【Kafka】:是一个基于TCP的二进制协议,所以他的能传输大数量,【简单、解析快、传输数据量大】【没有事务】
持久化:
简而言之,就是把消息数据存储起来,不能让数据存储在内存中,随着服务器重启而没有数据了。持久化的媒介: 磁盘上、数据库。除了active其他的mq都不支持数据库持久化
消息分发:
当消息中间件获取到数据后,是它主动发给其他系统,还是其他系统从它这里获取。还有是否需要消息重新发送(比如支付场景)。等等一系列消息分发机制。
高可用:
指的是当前的中间件本身,必须在使用的时间中,处于可以使用的状态,这个一般使用服务器集群进行解决
【master-slave->主从共享数据的部署方式】:类似于Mysql、Redis、Monogdb,每个从属中都有数据,但是只能通过master节点获取。他的高可用体现到各个节点存储的数据是一样的,宕机后可以从别的地方获取相同的数据
【Bloker-cluster->主从同步部署的方法】:分为多个副本,比如一个数据把他分开存储
【master-slave& Bloker-cluster】:前面两种方式的结合体,分为多个主节点,每个节点都有副本节点。【使用最多】
高可靠:
指的是系统可以无障碍的持续运行,并且报错的几率比较低,以及保障消息被消费。
【消息传输可靠】:通过协议保证系统直接的数据解析的正确性
【消息存储可靠】:通过持久化保障消息存储的可靠性。