协议是在 TCP/IP协议基础之上构建的一种约定成俗的规范和机制,主要目的可以让客户端(应用程序 java,go)进行沟通和通讯。并且这种协议下规范必须具有持久化,高可用,高可靠的性能。
常见的消息中间件协议有:OpenWire、AMQP、MQTT、Kafka、OpenMessage协议。
什么是协议?
计算机底层操作系统和应用程序通讯时共同遵守的一组约定,只有遵循共同的约定和规范,系统和底层操作系统之间才能互相交流
和一般的网络应用程序的不同,它主要负责数据的接收和传递,所以性能比较高
协议对数据格式和计算机之间交换数据都必须严格遵守规范
AMQP协议
全称:Advanced Message Queuing Protocol 高级消息队列协议
由摩根大通集团联合其他公司共同设计,是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制,Erlang中的实现有RabbitMQ等
★ 特性
- 分布式事务支持
- 消息的持久化支持
- 高性能和高可靠的消息处理优势
协议支持者:RabbitMQ(支持的更加完善)、ActiveMQ
MQTT协议
全称:Message Queuing Telemetry Transport 消息队列是IBM开放的一个即时通讯协议,
物联网系统架构中的重要组成部分
★ 特性
- 轻量
- 结构简单
- 传输快,不支持事务
- 没有持久化设计
应用场景:使用于计算能力、有限低带宽、网络不稳定的场景
协议支持者:RabbitMQ、ActiveMQ
OpenMessage协议
是近几年由阿里、雅虎和滴滴出行、Stremalio等公司通过参与创立的分布式消息中间件、流处理等领域的应用开发标准
★ 特性
- 结构简单
- 解析速度快
- 支持事务和持久化设计
协议支持者:Apache RocketMQ
Kafka协议
消息传送过来转换成二进制,然后就直接传送过去
基于TCP/IP的二进制协议。消息内部是通过长度来分割,由一些基本数据类型组成。
★ 特性
- 结构简单
- 解析速度快
- 无事务支持
- 有持久化设计
协议支持者:Kafka 性能最快,传输速度最快的一个消息队列
结论
RabbitMQ 市面上非常流行,开源产品,滴滴美团都在使用,支持的模式和持久化机制非常健全,与Spring是同一家公司开发出来的产品,Spring的框架对它的支持,以及开发领域和运用领域非常完善
Kafka 性能最高, 基于tcp/ip底层二进制协议,逼近于底层协议,不支持事务,支持持久化和分发机制,大数据领域用的比较多
RocketMQ 是由阿里和滴滴联合开发出来的,开源半开源,已托管给Apache,由国内团队开发,该研发团队一旦解散,就会面临技术停更,如果遇到开发问题,无法进行解决
性能依次从高到低如下:Kafka——RabbitMQ——RocketMQ——ActiveMQ
思考:为什么消息中间件不直接使用http协议呢?
-
因为http请求报文头和响应报文头是比较复杂的,包含了cookie,数据的加密解密,状态码,响应等附加的功能,但对于一个消息而言,负责数据传递、存储、分发就行;追求的是高性能,尽量简洁,快速。
-
http大部分都是短链接,在实际交互过程中,一个请求到响应很有可能会中断,中断后就不会就行吃就好,从而造成请求的丢失,不利于消息中间件的业务场景,因为消息中间件可能是一个长期的获取消息的过程,出现问题和故障要对数据或消息就行持久化等,包装消息和数据的高可靠和稳健的运行
——追求极致的性能和体验,和具有高可用,高可靠性,显然http是无法达成了
短链接指:一路发的请求,当服务器发生故障,请求会丢失,并不会维持连接的关系,中断后,不会就行持久化
长链接指:当服务器发生故障,重启后,依然可以进行数据的传递
思考:为什么不直接使用TCP/IP协议?
由于TCP太过于简洁,没办法满足定义的需求和规范,里面的东西并不能承载这些消息的内容和载体(还涉及到队列、交换机等等信息),故此在此协议上重新定义些语法规范等