什么是消息中间件
利用高效可靠的消息传递机制进行平台无关的数据交流;并基于数据通信来进行分布式系统的集成;通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信;
应用场景:跨系统数据传递,高并发流量削峰、数据异步处理等。
常用的消息中间件:ActiveMQ、RabbitMQ、kafka、RocketMQ
消息中间件核心设计
本质:一种具备接受请求、保存数据、发送数据等功能的网络应用。和一般网络应用的区别是它主要负责数据的接收和传递,所以性能一般高于普通程序。
5大核心组成:
- 协议
- 持久化机制
- 消息分发机制
- 高可用设计
- 高可靠设计
设计是协议?
协议是计算机之间通信时共同遵从的一组约定,都遵守相同的约定,计算机之间才能相互交流。是对数据格式和计算机之间交换数据时必须遵守的规则的正式描述。就比如:和中国人交流用中文,与美国人交流用英文一样的。中文,英文就可以当作一种协议。
协议三要素:
1.语法:即数据与控制信息的结构或格式;
2.语义:即需要发出何种控制消息,完成何种动作以及做出何种响应;
3.时序(同步):即事件实现顺序的详细说明。
下面以HTTP协议为例:语法就是http规定了请求报文和响应报文的具体格式;语义是客户端主动发起的操作成为请求,请求可以为post,get等;时序就是一个http请求对应一个响应。
在消息中间件中常见的消息协议为:OpenWire、AMQP、MQTT、kafka、OpenMessage。
持久化
简单来说就是将数据存入磁盘,如果存在内存中,数据就会随着服务重启而消息,无法保证持久化。所以能将数据永久保存就叫持久化。
常用的持久化方式无非就两种,一种就是文件系统,一种就是将数据保存在数据库中。其主流的MQ对这种两种方式的支持如下表:
| ActiveMQ | RabbitMQ | Kafka | RocketMQ | |
| 文件系统 | Y | Y | Y | Y |
| 数据库 | Y | N | N | N |
消息分发
消息分发主要保证的就是,一条消息到底要发送给谁去消费,以及采用何用策略去分配,对于一个消费失败的数据是否可以进行重发等,主流的消息中间件是如何支持的呢?如下表所示:
| ActiveMQ | RabbitMQ | kafka | RocketMQ | |
| 发布订阅 | Y | Y | Y | Y |
| 轮询分发 | Y | Y | Y | N |
| 公平发布 | N | Y | Y | N |
| 重发 | Y | Y | N | Y |
| 消息拉取 | N | Y | Y | Y |
高可用
高可用性是指产品在规定的条件和时刻或者时间区间内处于可执行规定功能状态的能力。当业务量大时,一台消息中间件服务器可能无法满足需求,所以需要消息中间件能够集群部署,来达到高可用的目的。
高可用的实现方式:
1.Master-Slave主从共享数据的部署:就是提供一台主节点来负责将客户端发送的持久化起来,其他从节点可以从中读取提供服务。
2.Master-Slave主从同步的部署:就和mysql主从类似,主节点接收到消息后,会将消息分发给其从节点,从节点通过同步主节点的数据来对外提供服务。
3.Broker-Cluster多主集群同步部署方式:相比与上面就是可以提供多个主节点进行读取数据的操作,主节点之间相互同步数据,来提供对外服务。
4.Broker-Cluster多主集群转发部署方式:数据单独存在一个节点当中,但是当请求打在另一个节点时,此节点没有数据,但是可以通过转发请求拿到真实数据的方式。
5.Master-Slave与Broker-Cluster组合方案:
高可靠
高可靠性是指系统可以无故障的持续运行,比如一个系统从来不崩溃、搞错,或者说崩溃报错的几率较低,那就是高可靠的系统。在高并发业务场景下,如果不能保证系统的高可靠,那造成的损失将会非常严重。
保证消息中间件的高可靠性,只要有两点:
1.消息传输可靠:可以通过协议来保证系统间数据解析的正确性。
2.消息存储可靠:通过持久化来保证消息的存储可靠性。