消息中间件
在了解rabbitmq之前,需要先了解什么是消息中间件。
首先消息中间件是:一种接受数据,接受请求、存储数据、发送数据等功能的技术服务。
消息中间件包含以下五部分
消息的协议
消息的持久化机制
消息的分发策略
消息的高可用,高可靠
一、消息队列协议
消息中间件采用的并不是http协议,而常见的消息中间件协议有:OpenWire、AMQP、MQTT、Kafka,OpenMessage协议。
面试题:为什么消息中间件不直接使用http协议呢? 1: 因为http请求报文头和响应报文头是比较复杂的,包含了cookie,数据的加密解密,状态码,响应码等附加的功能,但是对于一个消息而言,我们并不需要这么复杂,也没有这个必要性,它其实就是负责数据传递,存储,分发就行,一定要追求的是高性能。尽量简洁,快速。 2:大部分情况下http大部分都是短链接,在实际的交互过程中,一个请求到响应很有可能会中断,中断以后就不会就行持久化,就会造成请求的丢失。这样就不利于消息中间件的业务场景,因为消息中间件可能是一个长期的获取消息的过程,出现问题和故障要对数据或消息就行持久化等,目的是为了保证消息和数据的高可靠和稳健的运行。
1.1 AMQP协议
AMQP:(全称:Advanced Message Queuing Protocol) 是高级消息队列协议。由摩根大通集团联合其他公司共同设计。是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。Erlang中的实现有RabbitMQ等。 特性:
分布式事务支持。
消息的持久化支持。
高性能和高可靠的消息处理优势。
支持AMQP协议的消息队列:Rabbitmq、ActiveMq
1.2 MQTT协议
MQTT协议:(Message Queueing Telemetry Transport)消息队列是IBM开放的一个即时通讯协议,物联网系统架构中的重要组成部分。 特点:
轻量
结构简单
传输快,不支持事务
没有持久化设计。
应用场景:
适用于计算能力有限
低带宽
网络不稳定的场景。
支持Mqtt协议的消息队列:Rabbitmq、ActiveMq
1.3 OpenMessage协议
是近几年由阿里、雅虎和滴滴出行、Stremalio等公司共同参与创立的分布式消息中间件、流处理等领域的应用开发标准。 特点:
结构简单
解析速度快
支持事务和持久化设计。
支持OpenMessage协议的消息队列:apache RocketMq
1.4 Kafka协议
Kafka协议是基于TCP/IP的二进制协议。消息内部是通过长度来分割,由一些基本数据类型组成。 特点是:
结构简单
解析速度快
无事务支持
有持久化设计
支持Kafka协议的消息队列:Kafka
1.5 小结
协议:是在tcp/ip协议基础之上构建的一种约定成俗的规范和机制、它的主要目的可以让客户端(应用程序 java,go)进行沟通和通讯。并且这种协议下规范必须具有持久性,高可用,高可靠的性能。
二、消息队列持久化
简单来说就是将数据存入磁盘,而不是存在内存中随服务器重启断开而消失,使数据能够永久保存。
三、消息的分发策略
MQ消息队列有如下几个角色:生产者、存储消息、消费者 生产者生成消息以后,MQ进行存储,消费者是如何获取消息的呢?一般获取数据的方式无外乎推(push)或者拉(pull)两种方式,典型的git就有推拉机制,我们发送的http请求就是一种典型的拉取数据库数据返回的过程。而消息队列MQ是一种推送的过程,而这些推机制会适用到很多的业务场景也有很多对应推机制策略。
发布订阅:是最基础的,即生产者发布消息,订阅后的消费者就能收到消息
轮询分发:在分布式集群常见下,多台服务器依次收到消息,他不会考虑消费者的机器性能,不会造成数据倾斜
公平分发:在分布式集群常见下,多台服务器依次收到消息,会考虑消费者的机器性能,造成数据倾斜
重发:在分布式集群常见下,当MQ推送消息后,消费者没有应答,消息会堆积,等待下一次发送
消息拉取:消费者被动的拉取
消息分发策略对比
四、消息的高可用和高可靠
所谓高可用:是指产品在规定的条件和规定的时刻或时间内处于可执行规定功能状态的能力。通俗来说是指系统可以无故障低持续运行,比如一个系统突然崩溃,报错,异常等等并不影响线上业务的正常运行,出错的几率极低,就称之为:高可靠。在高并发的业务场景中,如果不能保证系统的高可靠,那造成的隐患和损失是非常严重的。 如何保证中间件消息的可靠性呢?可以从两个方面考虑: 1:消息的传输:通过协议来保证系统间数据解析的正确性。 2:消息的存储可靠:通过持久化来保证消息的可靠性。
消息队列得集群模式
https://www.kuangstudy.com/zl/rabbitmq#1366048193061646338
总结:
要么消息共享
要么消息同步
要么元数据共享