01-课程介绍
核心部分
1、Hello World 简单模式
2、Work queues 工作模式
3、Publish/Subscribe 发布、订阅模式
4、Routing 路由模式
5、Topics 主题模式
6、Publisher Confirms 发布确认模式
高级部分
1、死信队列
2、延迟队列
3、发布确认高级
3.1 发布确认
3.2 回退消息
3.3 备份交换机
4、幂等性
5、优先级队列
6、惰性队列
集群部分
1、Clustering
2、镜像队列(为了数据不丢失)
3、Haproxy + Keepalive实现高可用负载均衡
4、Federation Exchange(两大同步数据的组件)
5、Federation Queue
6、Shovel (同步数据的插件)
课程特点
1、新 rabbitmq-server-3.8.8-1.el7
2、细 从安装开始配置 详情使用 代码级
3、真 文档内部全来自企业真实案例
4、全 全套资料
技术基础要求
要求
1、Javase
2、Javaee
3、Maven
4、Springboot
建议
1、Java基础
2、Linux系统命令基础
3、分布式集群思想
02-什么是MQ
MQ(message queue)消息队列,从字面意思上看,本质是个队列,FIFO先入先出(遵循原则--就像一个水桶,水要想装满这个桶,先进的水在水桶的底部,后进的水在水桶的上部,最终水桶被装满),只不过队列中存放的内容是message而已,还是一种跨进程的通信机制,用于上下游传递消息(什么是上下游传递信息呢?就好比QQ号,A同学想发消息给B同学,那么A同学就称为上游,B同学就称为下游,A同学与B同学之间传递消息,就称之为上下游传递消息)。在互联网架构中,MQ是一种非常常见的上下游“逻辑解耦+物理解耦”的消息通信服务。使用了MQ之后,消息发送上游只需要依赖MQ,不用依赖其他服务。
03-MQ的流量消峰
举个例子,如果订单系统最多能处理一万次订单,这个处理能力应付正常时段的下单时绰绰有余,正常时段我们下单一秒后就能返回结果。但是在高峰期,如果有两万次下单操作系统是处理不了的,只能限制超过一万后不允许用户下单。使用消息队列做缓冲,我们可以取消这个限制,把一秒内下的订单分散成一段时间来处理,这时有些用户可能在下单十几秒才能收到下单成功的操作,但是比不能下单的体验要好。(防止订单系统宕机)
MQ可以对访问的人员进行排队
04-MQ的应用解耦
以电商应用为例,应用中有订单系统、库存系统、物流系统、支付系统。用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统出了故障,都会造成下单操作异常。当转变成基于消息队列的方式后,系统间调用的问题会减少很多,比如物流系统因为发生故障,需要几分钟来修复。在这几分钟的时间里,物流系统要处理的内存被缓存在消息队列中,用户的下单操作可以正常完成。当物流系统恢复后,继续处理订单信息即可,下单用户感受不到物流系统的故障,提升系统的可用性。
订单系统一旦执行完成,它才会发消息给队列,后续任务就由队列来完成了,此时的订单系统其实已经早早的结束了,队列会分配消息给支付系统、库存系统、物流系统,直到三大系统执行完成,在执行的过程中,这三个有一个完成不了,队列会监督它,继续完成,直至完成结束,所以不会出现任何一个故障之后,影响整个所有系统的运转,这就是队列。
05-MQ的异步处理
有些服务间调用是异步的,例如 A 调用 B,B需要花费很长时间执行,但是 A 需要知道 B 什么时候可以执行完。以前一般有两种方式, A过一段时间去调用 B 的查询 api 查询。或者 A 提供一个 callback api, B执行完之后调用 api 通知 A 服务。
这两种方式都不是很优雅,使用消息队列,可以很方便解决这个问题, A 调用 B 服务后(A可以做自己的事情),只需要监听 B 处理完成的消息,当 B 处理完成后,会发送一条消息给 MQ,MQ会将此消息转发给 A 服务。这样 A 服务既不用循环调用 B 的查询 api, 也不用提供 callback api。同样 B 服务也不用做这些操作。A服务还能及时的得到异步处理成功的消息。
06-MQ的分类
1、ActiveMQ
优点:
缺点
2、Kafka:
优点:
缺点:
3、RocketMQ
优点:
缺点:
4、RabbitMQ
2007 年发布,是一个在AMQP(高级消息队列协议)基础上完成的,可复用的企业消息系统,是当前最主流的消息中间件之一。
优点:由于erlang 语言的高并发特性,性能较好;吞吐量到万级,MQ功能比较完备,健壮、稳定、易用、跨平台、支持多种语言 如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持 AJAX 文档齐全;开源提供的管理界面非常棒,用起来很好用,社区活跃度高;更新频率相当高
https://www.rabbitmq.com/news.html
缺点:商业版需要收费,学习成本较高
07-MQ的选择
1、Kafka
2、RocketMQ
3、RabbitMQ
结合erlang 语言本身的并发优势,性能好时效性微秒级,社区活跃度也比较高,管理界面用起来十分方便,如果你的数据量没有那么大,中小型公司优先选择功能比较完备的 RabbitMQ
08-四大核心概念
1、RabbitMQ的概念
RabbitMQ是一个消息中间件:它接收并转发消息。你可以把它当做一个快递站点,当你要发送一个包裹时,你把你的包裹放到快递站,快递员最终会把你的快递送到收件人那里,按照这种逻辑 RabbitMQ 是一个快递站,一个快递员帮你传递快递。RabbitMQ 与快递站的主要区别在于,它不处理快件而是接收,存储和转发消息数据。
2、四大核心概念
生产者
产生数据发送消息的程序是生产者
交换机
交换机是 RabbitMQ非常重要的一个部件,一方面它接收来自生产者的消息,另一方面它将消息推送到队列中。交换机必须确切知道如何处理它接收到的消息,是将这些消息推送到特定队列还是推送到多个队列,亦或者是把消息丢弃,这个得有交换机类型决定
队列
队列是RabbitMQ 内部使用的一种数据结构,尽管消息流经 RabbitMQ 和应用程序,但它们只能存储在队列中。队列仅受主机的内存和磁盘限制的约束,本质上是一个大的消息缓冲区。许多生产者可以将消息发送到一个队列,许多消费者可以尝试从一个队列接收数据。这就是我们使用队列的方式
消费者
消费与接收具有相似的含义。消费者大多时候是一个等待接收消息的程序。请注意生产者,消费者和消息中间件很多时候并不在同一机器上。同一个应用程序既可以是生产者又是可以是消费者。
09-原理名词解释
1、RabbitMQ核心部分(六大模式)
2、各个名词介绍
Broker:接收和分发消息的应用,RabbitMQ Server就是 Message Broker(消息实体)
Virtual host:出于多租户和安全因素设计的,把AMQP的基本组件划分到一个虚拟的分组中,类似与网络中的 namespace 概念。当多个不同的用户使用同一个 RabbitMQ server 提供的服务时,可以划分出多个vhost,每个用户在自己的 vhost 创建 exchange / queue 等。多租户就是表示Broker里面可以有多个Virtual host,而每个Virtual host又包含多个交换机和信道,它们是包含关系,相当于是消息实体里面有多个Virtual host,而每一个Virtual host又有多个交换机。
Connection:publisher / consumer 和 broker之间的 TCP连接(每个连接里面有多个信道)
Channel:如果每一次访问 RabbitMQ 都建立一个 Connection,在消息量大的时候建立 TCP Connection的开销将是巨大的,效率也较低。Channel 是在 connection 内部建立的逻辑连接,如果应用程序支持多线程,通常每个 thread 创建单独的 channel 进行通讯,AMQP method包含了 channel id帮助客户端和 message broker识别 channel,所以channel之间是完全隔离的。Channel 作为轻量级的Connection极大减少了操作系统建立TCP connection 的开销(发消息的通道,简称信道)
Exchange:message到达 broker的第一站,根据分发规则,匹配查询表中的 routing key,分发消息到queue中去。常用的类型有:direct(point-to-point),topic(publish-subscribe)and fanout(multicast)-----一个交换机可以对应多个队列
Queue:消息最终被送到这里等待 consumer取走
Binging:exchange和queue之间的虚拟连接,binging中可以包含routing key,Binding信息被保存到exchange中的查询表中,用于message的分发依据
总结:
channel信道,每一个生产者与MQ之间会有建立一个连接 Connection,而每个连接里面有多个信道。每一个信道相当于一个逻辑连接,每次发消息只占用一个信道,不会占用整个连接,而每个连接里有多个信道就可以发多次的消息。这就是信道与连接之间的关系。
10、安装
linux系统( secondCentOS8 )
11、安装Web界面插件
12、添加用户并设置权限
每一个Virtual Hosts代表MQ的一个库,不同的Virtual Hosts它的交换机和队列是不一样的
13-创建Java开发环境
由生产者发送消息,发给MQ,再由MQ将消息转发到消费者,完成一次消息的通信。
RabbitMQ工作原理:
告诉我们,当你生产者与MQ之间建立了连接之后,连接并不是发消息的,一个连接里面可以产生多个信道,而每一个信道是专门发消息的,所以我们应该通过连接获取里面的信道,才是我们的目的。通过信道就可以连接我们的交换机和队列
/**
* 生产者:发消息
*/
public class Producer {
//队列名称
public static final String QUEUE_NAME = "hello";
//发消息
public static void main(String[] args) throws Exception {
//创建一个连接工厂
ConnectionFactory factory = new ConnectionFactory();
//工厂IP 连接RabbitMQ的队列
factory.setHost("192.168.142.131");
//用户名
factory.setUsername("admin");
//密码
factory.setPassword("123");
//创建连接
Connection connection = factory.newConnection();
//获取信道
Channel channel =connection.createChannel();
/**
* 生成一个队列
* 1、队列名称
* 2、队列里面的消息是否持久化 默认情况消息存储在内存中
* 3、该队列是否只供一个消费者进行消费 是否进行消息共享,true可以多个消费者消费 false:只能一个消费者消费
* 4、是否自动删除 最后一个消费者端开连接以后 该队列是否自动删除 true自动删除 false不自动删除
* 5、其它参数
*/
channel.queueDeclare(QUEUE_NAME,false,false,false,null);
//发消息
String message = "hello world";//初次使用
/**
* 发送一个消息
* 1、发送到哪个交换机
* 2、路由的Key值是哪个 本次是队列的名称
* 3、其它参数信息
* 4、发送消息的消息体
*/
channel.basicPublish("",QUEUE_NAME,null,message.getBytes());
System.out.println("消息发送完毕");
}
}
16-工作队列原理
注意事项:一个消息只能被处理一次,不可以处理多次
消费在手动应答时是不丢失、放回队列中重新消费
29-消息持久化
队列是MQ当中的一个组件,消息是生产者发过来的消息。队列如果持久化了,但是消息不持久化,依然是不能保证消息是不丢失的。因为消息一旦不能持久化,工作线程一旦执行失败,消息也会丢失,只是队列不会丢失,但是队列里面的消息丢失了。所以我们在发消息的时候,一定要记住生产者就应该通知队列这个消息是需要持久化的,不能随便的丢失,所以生产者的代码是需要改的。