消息队列协议
什么是协议?
协议:是在tcp/lip协议基础之上构建的一种约定成俗的规范和机制、它的主要目的可以让客户端(应用程序java,go)进行沟通和通讯。并且这种协议下规范必须具有持久性,高可用,高可靠的性能。
- 计算机底层操作系统和应用程序通讯时共同遵守的一组约定,只有遵循共同的约定和规范,系统和底层操作系统之间才能相互交流
- 和一般的网络应用程序的不同它主要负责数据的接受和传递,所以性能比较的高
- 协议对数据格式和计算机之间交换数据都必须严格遵守规范
网络协议三要素
一、语法
语法是用户数据与控制信息的结构与格式,以及数据出现的顺序
二、语义
语义是解释控制信息每个部分的意义。它规定了需要发出何种控制信息,以及完成的动作与做出什么样的响应
三、时序
时序是对事件发生顺序的详细说明
HTTP协议
AMQP协议
AMQP:(全称: Advanced Message Queuing Protocol)是高级消息队列协议。由摩根大通集团联合其他公司共同设计。是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。Erlang中的实现有RabbitMQ等。
AMQP协议特性
- 分布式事务支持
- 消息的持久化支持
- 高性能和高可靠的消息处理优势
AMQP协议支持者
- rebbitMQ
- activeMQ
MQTT协议(了解)
MQTT协议:(Message Queueing Telemetry Transport)消息队列是IBM开放的一个即时通讯协议,物联网系统架构中的重要组成部分
MQTT协议特点
- 轻量
- 结构简单
- 传输快
- 不支持事务
- 没有持久化设计
MQTT协议应用场景
- 适用于计算能力有限
- 低带宽
- 网络不稳定的场景
MQTT协议支持者
- rebbitMQ
- activeMQ
OpenMessage协议 即Apache RocketMQ(了解)
是近几年由阿里、雅虎和滴滴出行、Stremalio等公司共同参与创立的分布式消息中间件、流处理等领域的应用开发标准
OpenMessage协议特点
- 结构简单
- 解析速度快
- 支持事务和持久化设计
Kafka协议(了解)
Kafka协议是基于TCP/IP的二进制协议。消息内部是通过长度来分割,由一些基本数据类型组成
Kafka协议特点
- 结构简单
- 解析速度快
- 支持事务
- 不支持持久化
消息队列持久化
简单来说就是将数据存入磁盘,而不是存在内存中随服务器重启断开而消失,使数据能够永久保存
常见的持久化方式
消息队列的分发策略
分发策略
消息队列有以下几个角色:
- 生产者
- 存储消息
- 消费者
那么生产者生成消息以后,MQ进行存储,消费者是如何获取消息的呢?一般获取数据的方式无外乎推(push)或者拉(pull))两种方式,典型的git就有推拉机制,我们发送的http请求就是一种典型的拉取数据库数据返回的过程。而消息队列MQ是一种推送的过程,而这些推机制会适用到很多的业务场景也有很多对应推机制策略。
场景一
比如我在APP上下了一个订单,我们的系统和服务很多,我们如何得知这个消息被那个系统或者那些服务或者系统进行消费,那这个时候就需要一个分发的策略。这就需要消费策略。或者称之为消费的方法论
场景二
在发送消息的过程中可能会出现异常,或者网络的抖动,故障等等因为造成消息的无法消费,比如用户在下订单,消费MQ接受,订单系统出现故障,导致用户支付失败,那么这个时候就需要消息中间件就必须支持消息重试机制策略。也就是支持:出现问题和故障的情况下,消息不丢失还可以进行重发
消息分发策略的机制和对比
消息队列高可用和高可靠
什么是高可用机制?
高可用:是指产品在规定的条件和规定的时刻或时间内处于可执行规定功能状态的能力
当业务量增加时,请求也过大,一台消息中间件服务器的会触及硬件(CPU,内存,磁盘)的极限,一台消息服务器你已经无法满足业务的需求,所以消息中间件必须支持集群部署。来达到高可用的目的
什么是高可靠机制?
高可靠:是指系统可以无故障低持续运行,比如一个系统突然崩溃,报错,异常等等并不影响线上业务的正常运行,出错的几率极低,就称之为:高可靠
如何保证中间件消息的可靠性呢?
- 消息的传输:通过协议来保证系统间数据解析的正确性
- 消息的存储可靠:通过持久化来保证消息的可靠性。
集群模式1 Master-slave主从共享数据的部署方式
生产者讲消费发送到Master节点,所有的都连接这个消息队列共享这块数据区域,Master节点负责写入,一旦Master挂掉,slave节点继续服务。从而形成高可用
集群模式2 Master- slave主从同步部署方式
这种模式写入消息同样在Master主节点上,但是主节点会同步数据到slave节点形成副本,和zookeeper或者redis主从机制很类同。这样可以达到负载均衡的效果,如果消费者有多个这样就可以去不同的节点就行消费,以为消息的拷贝和同步会暂用很大的带宽和网络资源。在rabbtmq中会有使用
集群模式3 多主集群同步部署模式
和上面的区别不是特别的大,但是它的写入可以往任意节点去写入
集群模式4 多主集群转发部署模式
如果你插入的数据是broker-1中,元数据信息会存储数据的相关描述和记录存放的位置(队列)
它会对描述信息也就是元数据信息就行同步,如果消费者在broker-2中进行消费,发现自己几点没有对应的消息,可以从对应的元数据信息中去查询,然后返回对应的消息信息,场景:比如买火车票或者黄牛买演唱会门票,比如第一个黄牛有顾客说要买的演唱会门票,但是没有但是他会去联系其他的黄牛询问,如果有就返回
集群模式5 Master-slave与Breoker-cluster组合的方案
实现多主多从的热备机制来完成消息的高可用以及数据的热备机制,在生产规模达到一定的阶段的时候,这种使用的频率比较高
最终目的都是为保证:消息服务器不会挂掉,出现了故障依然可以抱着消息服务继续使用