消息中间件
一、 常用的消息中间件
ActiveMQ、RabbitMQ、Kafka、RocketMQ
二、 消息中间件的本质
它是一种接受数据、接受请求、存储数据、发送数据等功能的技术服务。
三、 消息中间件的核心组成部分
1、 消息的协议
2、 消息的持久化机制
3、 消息的分发策略
4、 消息的高可用、高可靠
5、 消息的容错机制
四、 消息中间件的功能
负责数据的传递、存储和分发消费三个部分,一般采用底层的TCP/IP、UDP协议。
五、 协议
在TCP/IP、UDP协议基础上,按自己约定而制定的规范。
六、 网络协议的三要素
1、 语法
http规定了请求报文和响应报文的格式。
2、 语义
客户端主动发起请求称之为请求。(post/get请求)
3、 时序
一个请求对应一个响应。(一定先有请求再有响应,这是时序)
七、 消息中间件协议
采用的并不是http协议,而常见的消息中间件协议有:OpenWire、AMQP、MQTT、Kafka、OpenMessage协议。
八、 为什么消息中间件不直接使用http协议
1、 因为http请求报文头和响应报文头是比较复杂的,处理时间比较慢,而消息中间件主要追求的是高性能,尽量简洁,快速。
2、 大部分情况下http大部分是短链接,可能会造成数据丢失,不能持久化,而消息中间件能对数据进行持久化,保证消息和数据的高可靠和稳健的运行。
九、 AMQP协议
1、AMQP(全称Advanced Message Queuing Protocol)是高级消息队列协议。
2、使用Erlang语言开发的。
3、特性:分布式事务支持,消息的持久性支持,高性能和高可靠的消息处理优势。
4、支持者:RabbitMQ、ActiveMQ。
十、 MQTT协议
1、MQTT协议(Message Queueing Telemetry Transport)消息队列是IBM开放的一个即时通讯协议,物联网系统架构中的重要组成部分。
2、特点:轻量、结构简单、传输快、不支持事务、没有持久化设计。
3、应用场景:适用于计算能力有限、低宽带、网络不稳定的场景。
4、支持者:RabbitMQ、ActiveMQ。
十一、OpenMessage协议
1、概念:阿里、雅虎、滴滴出行、Stremalia等公司共同参与创立的分布式消息中间件流处理等领域的应用开发标准。
2、 特点:结构简单、解析速度快、支持事务和持久化设计
3、支持者:RocketMQ。
十二、Kafka协议
1、它是基于TCP/IP的二进制协议。
2、特点:结构简单、解析速度快、无事务支持、有持久化设计。
3、支持者:Kafka。
十三、消息队列持久化
1、 持久化:将数据存入磁盘,而不是存在内存中随服务器重启断开而消失,使数据能够永久保存。
2、 常见的持久化方式:
文件存储:ActiveMQ、RabbitMQ、Kafka、RocketMQ支持。
数据库:ActiveMQ支持、RabbitMQ、Kafka、RocketMQ不支持
十四、消息的分发策略
1、 MQ消息队列有如下几个角色:生产者、存储消息、消息者
2、 消息分发策略的机制和对比:
发布订阅:ActiveMQ、RabbitMQ、Kafka、RocketMQ支持。
轮询分发:ActiveMQ、RabbitMQ、Kafka支持,RocketMQ不支持。
公平分发:RabbitMQ、Kafka支持,ActiveMQ、RocketMQ不支持。
重发:ActiveMQ、RabbitMQ、RocketMQ支持,Kafka不支持。
消息拉取:RabbitMQ、Kafka、RocketMQ支持,ActiveMQ不支持。
十五、消息队列高可用和高可靠
1、 高可用:消息中间件必须支持集群部署,来达到高可用的目的。
2、 集群模式:
(1)、Master-slave主从共享数据的部署方式:
Master节点负责写入数据,一旦Master挂掉,就无法写入数据。
(2)、Master-slave主从同步部署方式:
写入消息同样在Master主节点上,但主节点会同步数据到Slave节点形成副本。
消息的拷贝和同步会占用很大的宽带和网络资源,所以将服务器部署在同一个机房较好。
(3)、多主集群同步部署模式:
Master和Slave都可以读、写。
(4)、多主集群转发部署模式(节约空间)
3、 高可靠机制
十六、RabbitMQ的角色分类
1、 none:不能访问management plugin
2、 management:查看自己相关节点信息
3、 policymaker
4、 Monitoring
5、 Administrator
十七、RabbitMQ的核心组成部分
1、 Server:又称Broker,接受客户端的连接,实现AMQP实体服务,安装rabbitmq-server。
2、 Connection:连接,应用程序与Broker的网络连接TCP/IP三次握手和四次挥手。
3、 Channel:网络信道,几乎所有的操作都在Channel中进行,Channel是进行消息读写的通道,客户端可以建立对各Channel,每一个Channel代表一个会话任务。
4、 Message:消息:服务与应用程序之间传送的数据,由Properties和Body组成,Properties可是对消息进行修饰,比如消息的优先级、延迟等高级特性,Body则就是消息体的内容。
5、 Virtual Host:虚拟地址,用于进行逻辑隔离,最上层的消息路由,一个虚拟主机可以又若干个Exchange和Queue,同一个虚拟主机里面不能有相同名字的Exchange。
6、 Exchange:交换机,接受消息,根据路由键发送消息到绑定的队列。(不具备消息存储的能力)
7、 Bindings:Exchange和Queue之间的虚拟连接,binding中可以有多个routing key。
8、 Routing Key:是一个路由规则,虚拟机可以用它来确定如何路由一个特定消息。
9、 Queue:队列:也成为Message Queue消息队列,保存消息并将它们转发给消费者。
十八、RabbitMQ支持消息的模式
1、 简单模式:Simple
2、 工作模式:Work;特点:分发机制
3、 发布订阅模式:类型:fanout;特点:Fonout-发布与订阅模式,是一种广播机制,它是没有路由key的模式。
4、 路由模式:类型:direct;特点:有routing-key的匹配模式。
5、 主题Topic模式:类型:topic;特点:模糊的routing-key的匹配模式。
6、 参数模式:类型:headers;特点:参数匹配模式。
小结:rabbitmq发送消息一定有一个交换机。
十九、模式内容
1、 声明交换机时,持久化是指交换机会不会随着服务器重启造成丢失,如果是true代表不丢失,false重启就会丢失。
2、 工作模式的两种模式:
(1)轮询分发:一个消费者一条,按均分配。
(2)公平分发:根据消费者的消费能力进行公平分发,处理快的处理多,处理慢的处理少,按劳分配。
3、声明队列:
如果队列不存在,则会创建
RabbitMQ不允许创建两个相同的队列名称,否则会报错。
@param1:queue队列的名称
@param2:durable队列是否持久化
@param3:exclusive是否排他,即是否私有的,如果为true,会对当前队列加锁,其他的通道不能访问,并且连接自动关闭。
@param4:autoDelete是否自动删除,当最后一个消费者断开连接之后,是否自动删除消息。
@param5:arguments可以设置队列附加参数,设置队列的有效期,消息的最大长度,队列的消息生命周期等等。
语法:channel.queueDeclare(queue1,true,false,false,null);
4、发送消息给中间件rabbitmq-server
@param1:交换机exchange
@param2:队列名称|routing
@param3:属性配置
@param4:发送消息的内容
语法:channel.basicPublish(“”,”queue1”,null,message.getBytes());
5、轮询分发模式中,autoAck为true表示自动应答。
公平分发模式中,autoAck为false表示手动应答。
公平分发中,channel.basicQos(1);//同一时刻,服务器只会推送一条消息给消费者。
channel.basicAck(delivery.getEnvelope().getDeliveryTag(),false);//手动应答
二十、RabbitMQ使用场景
1、 解耦、削峰、异步
2、 高内聚、低耦合
3、 流量的削峰
4、 分布式事务的可靠消费和可靠生产
5、 索引、缓存、静态化处理的数据同步
6、 流量监控
7、 日志监控(ELK)
8、 下单、订单分发、抢票
二十一、主从复制的作用主要包括
1、 数据冗余:主从复制实现了数据的热备份,是持久化之外一种数据冗余方法。
2、 故障恢复:当主节点出现问题时,可以由从节点提供服务实现快速的故障恢复;实际上是一种服务的冗余。
3、 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载,尤其是在写少读多的场景下,通过多个节点分担读负载,可以大大提高Redis服务器的并发量。
4、 高可用(集群)基石:主从复制是哨兵和集群能够实施的基础,因此主从复制是Redis高可用的基础。
二十二、MQ优劣势及产品类型
1、 MQ的优势:
(1) 应用解耦:提高系统容错性和可维护性。
(2) 异步提速:提升用户体验和系统吞吐量。
(3) 削峰填谷:提高系统稳定性。
2、 MQ的劣势:
(1) 系统的可用性降低。
(2) 系统复杂度提高。
3、 常用的MQ产品:
(1) RabbitMQ:开发公司Rabbit,正确性最高,性能没RocketMQ、Kafka好。
(2) ActiveMQ:开发公司Apache,比较旧的产品。
(3) RocketMQ:开发公司阿里,性能比RabbitMQ好。
(4) Kafka:开发公司Apache,应用于大数据领域比较多,性能比RabbitMQ好。