一、消息队列协议
1.什么是协议?
- 计算机底层操作系统和应用程序通讯时共同遵守的一组约定,只有遵循共同的约定和规范,系统和底层操作系统之间才能相互交流。
- 和一般的网络应用程序的不同它主要负责数据的接受和传递,所以性能比较的高
- 协议对数据格式和计算机之间交换数据都必须严格遵守规范
2.网络协议的三要素
- 语法,语法是用户数据与控制信息的结构与格式以及数据出现的顺序。
- 语义,语义是解释控制信息每个部分的意义。它规定了需要发出何种控制信息,以及完成的动作与做出什么样的响应。
- 时序,时序是对事件发生顺序的详细说明。
比如我MQ发送一个信息,是以什么数据格式发送到队列中,然后每个部分的含义是什么,发送完毕以后的执行的动作,以及消费者消费消息的动作,消费完毕的响应结果和反馈是什么,然后按照对应的执行顺序进行处理。
举例-http请求协议:
- 语法: http规定了请求报文和响应报文的格式。
- 语义:客户端主动发起请求称之为请求。(这是一种定义,同时你发起的是post/get请求)
- 时序:一个请求对应一个响应。(一定先有请求再有响应,这个是时序)
而消息中间件采用的并不是http协议,而常见的消息中协有: OpenWire, AMQP, MQTT, Kafka,
OpenMessage协议.
面试题:为什么消息中间件不直接使用http协议呢?
- 因为http请求报文头和响应报文头是比较复杂的,包含了cookie,数据的加密解密,状态码,响应码等附加的功能,但是对于一个消息而言,我们并不需要这么复杂,也没有这个必要性,它其实就是负责数据传递,存储,分发就行,一定要追求的是高性能。尽量简洁,快速。
- 大部分情况下http大部分都是短链接,在实际的交互过程中,一个请求到响应很有可能会中断,中断以后就不会就行持久化,就会造成请求的丢失。这样就不利于消息中间件的业务场景,因为消息中间件可能是一个长期的获取消息的过程,出现问题和故障要对数据或消息就行持久化等,目的是为了保证消息和数据的高可靠和稳健的运行。
二、消息队列持久化
1.什么是持久化?
简单来说就是将数据存入磁盘,而不是存在内存中随服务器重启断开而消失,使数据能够永久保存。
2.为什么要持久化?
如果我们希望即使在RabbitMQ服务重启的情况下,也不会丢失消息,我们可以将Queue与Message都设置为可持久化的(durable),这样可以保证绝大部分情况下我们的RabbitMQ消息不会丢失。当然还是会有一些小概率事件会导致消息丢失。
3.常见的持久化方式
消息持久化
- 消息持久化需要在消息生成时,添加参数 properties=pika.BasicProperties(delivery_mode=2)。
队列持久化
- 查看存在的队列和消息数量;
- 队列持久化需要在声明队列时添加参数 durable=True,这样在rabbitmq崩溃时也能保存队列;
- 仅仅使用durable=True ,只能持久化队列,不能持久化消息。
交换机持久化
- 当交换机没有绑定队列时会自动删除交换机。
4.消息确认机制
在保证了消息队列持久化的基础上来做消息确认机制,在生产者、消费者两个地方确认。
三、消息队列分发策略
1.什么是分发策略
MQ消息队列有如下几个角色
1:生产者
2:存储消息
3:消费者
那么生产者生成消息以后, MQ进行存储,消费者是如何获取消息的呢?一般获取数据的方式无外乎推(push)或者主(pull)两种方式,典型的git就有推拉机制,我们发送的http请求就是一种典型的拉取数据库数据返回的过程。而消息队列MQ是一种推送的过程,而这些推机制会适用到很多的业务场景也有很多对应推机制策略。
2.消息分发策略的机制和对比
四、消息队列高可用、高可靠
1.什么是高可用机制
所谓高可用:是指产品在规定的条件和规定的时刻或时间内处于可执行规定功能状态的能力。
当业务量增加时,请求也过大,一台消息中间件服务器的会触及硬件(CPU,内存,磁盘)的极限,一台消息服务器你已经无法满足业务的需求,所以消息中间件必须支持集群部署来达到高可用的目的。
2.集群模式
1.Master-slave主从 共享 部署模式
解说:生产者讲消费发送到Master节点,所有的都连接这个消息队列共享这块数据区域,Master节点负责写入,一旦Master-slave节点继续服务,从而形成高可用。
2.Master-slave主从 同步 部署模式
解释:这种模式写入消息同样在Master主节点上,但是主节点会同步数据到slave节点形成副本,和zookeeper或者redis主从机制很类同。这样可以达到负载均衡的效果,如果消费者有多个这样就可以去不同的节点就行消费,以为消息的拷贝和同步会暂用很大的带宽和网络资源。在后续的rabbtmq中会有使用.
3.多主集群同步部署模式
解释:和上面的区别不是特别的大,但是它的写入可以往任意节点去写入。
4.多主集群转发部署模式
解释:如果你插入的数据是broker-1中,元数据信息会存储数据的相关描述和记录存放的位置(队列)
它会对描述信息也就是元数据信息就行同步,如果消费者在broker-2中进行消费,发现自己几点没有对应的消息,可以从对应的元数据信息中去查询,然后返回对应的消息信息,场景:比如买火车票或者黄牛买演唱会门票,比如第一个黄牛有顾客说要买的演唱会门票,但是没有但是他会去联系其他的黄询问,如果有就返回。
5.Master-slave和Broker-cluster组合的方案
解释:实现多主多从的热备机制来完成消息的高可用以及数据的热备机制,在生产规模达到一定的阶段的时候,这种使用的频率比较高。
集群模式的最终目的都是为保证:消息服务器不会挂掉,出现了故障依然可以抱着消息服务继续使用。
反正终归三句话:
1:要么消息共享
2:要么消息同步
3:要么元数据共享
3.什么是高可靠机制
- 所谓高可用是指:是指系统可以无故障低持续运行,比如一个系统突然崩溃,报错,异常等等并不影响线上业务的正运行,出错的几率极低,就称之为:高可靠。
- 在高并发的业务场景中,如果不能保证系统的高可靠,那造成的隐患和损失是非常严重的。
如何保证中间件消息的可靠性呢?可以从两个方面考虑:
- 消息的传输:通过协议来保证系统间数据解析的正确性。
- 消息的存储可靠:通过持久化来保证消息的可靠性。