up:: 多线程与分布式概述
说明:
(1) 本篇博客内容是,消息中间件和RabbitMQ一些概念性的介绍;
零:RabbitMQ入门部分,内容概述;
(1)RabbitMQ简介;
● 什么是消息队列;消息队列的好处;
● RabbitMQ的特点和核心组件和概念;
(2)RabbitMQ(在CentOS 7上的)的安装、启动;
● RabbitMQ不推荐在Windows下安装;
● 之所以要介绍RabbitMQ的启动,这是因为RabbitMQ有个管理后台,我们在启动完RabbitMQ之后,要启动管理后台;
(3)RabbitMQ管理后台;
● 在管理后台中,我们可以进行很多操作,比如查看整体的消息流量、查看交换机、查看队列、对用户添加删除和配置权限等;
(4)RabbitMQ代码实操;
● 由难到易,通过案例来演示RabbitMQ的使用;
(5)交换机工作模式;
● RabbitMQ的一个特色,就是和交换机相关的内容;
● RabbitMQ支持多种交换机,不同的交换机有不同的工作模式;我们会介绍主流的交换机;
(6)Spring Boot整合RabbitMQ;
● 在Spring Boot项目中,我们会引入相关依赖,进行相应的配置;引入生产者和消费者,演示使用;
一:RabbitMQ简介;
1.可以访问RabbitMQ的官网【Messaging that just works — RabbitMQ】;
2.消息队列简介:消息队列是什么,producer,consumer,queue;
(1)消息队列: 消息队列核心就是接受并转发消息;其类似于快递公司;快递公司本身并不生产快递,其只是把快递从一个地方运到另一个地方;那么,这就涉及到了producer和consumer;
(2)producer: 消息的发送者、生产者;其会生产消息,然后把消息送给消息队列(比如RabbitMQ);然后消息队列就会把消息转发到对应的consumer消费者那儿去;
(3)consumer: 消息的消费者;从队列获取消息,并且使用;
(4)queue: 队列是一个先进先出的数据结构;一个队列可以对应多个消费者;即,比如我们有一个队列,然后可以有很多消费者来取消息;
3.为什么需要消息队列(即,使用消息队列的好处);
(1)使用消息队列,可以实现代码解耦,提高系统稳定性: 比如,【订单系统】其会不停的产生新的订单;同时,有很多其他系统想要订单数据,比如【数据统计团队】、【运营团队】等;如果我们不使用消息队列,那么我们在编写【订单系统】代码的时候,就需要我们在产生订单数据的时候,调一下【数据统计团队】、【运营团队】的接口,把订单数据传给他们;但是,后面需要订单数据的模块会越来越多,这就意味着每增加一个需要订单数据的模块,我们就需要修改下【订单系统】的代码;所以,在这种情况下,就很适合使用消息队列;我们只需要把订单数据发给消息队列,需要订单数据的模块直接去找消息队列就可以了;这样一来,不同模块之间没有形成强依赖,耦合性低;
(2)应对流量高峰,降低流量冲击: 比如,在秒杀的时候,为了防止海量用户把服务器冲垮,可以使用消息队列;请求过来时,可以先到消息队列中排队,如果服务器能够处理过来,那么就把消息队列中的消息消费的快一些,如果处理不过来,消费的速度就慢一些;这样,就可以保证服务器整体系统相对稳定;
(3)实现异步执行,提高系统响应速度: 比如,我们去网红餐馆吃饭,然后有两种排队方式;第一种就是在取号机上取个号,然后自己可以去商场的其他地方逛一逛,等快排到自己的时候,其会给我发一个消息;我们在系统中,使用消息队列的思想,就与此类似;即,我们想去某餐馆吃饭,取号就意味着往消息队列中发送了一个消息,但是餐厅处理消息的速度是有限的,当餐厅处理到我们这个消息的时候,其会通知我们;自然,第二种方式就对应着不使用消息队列的情形,我们想去某餐馆吃饭时,就需要人肉排队,我们啥事都不能干,只能在这儿排队;(PS:这儿的同步异步,可以借鉴ajax中的同步异步来理解,思想都是相通的)
4.消息队列的特性;
(1)消息队列的性能,一般是比较好的: 消息队列有很多中,RabbitMQ只是其中的一种;主流的消息队列对消息的处理能力,都远大于数据库或者业务系统的处理能力;一般我们不太需要考虑,由于消息队列处理能力不够,而带来的瓶颈;
(2)消息队列是一种基础组件: 消息队列就像MySQL一样,是一个通用的系统,不管是什么业务都可以使用消息队列;其实,当系统规模比较大时,其内部都会使用到消息队列,以使系统架构更加合理;
(3)消息队列支持消息确认: 意思是,如果我们不使用消息队列,假设系统运行到一半突然断电,那么一些正在传输的数据就会丢失;而,对于一些重要的业务(比如转账)是不允许数据丢失的;那么,鉴于消息队列支持消息确认,对于这种业务要求,我们就可以使用消息队列;如果我们使用了消息队列,那么在数据没有处理完、没有确认之前,消息是不会丢掉的,当断电的系统重启后,可以对消息进行重新处理,而这保证了数据的一致性;PS:一般的消息队列都支持消息确认;
5.RabbitMQ的特点;
RabbitMQ是消息队列的一种(还有其他消息队列,比如kafka,RoketMQ等),其有以下5个特点;
(1)路由能力灵活强大: 路由能力指的是,消息经过生产者发送出去后,要经过什么路径发送给消费者(自然,一个消息可能只发送给一个消费者,也可能发送给多个消费者);我们在使用RabbitMQ的时候,可以根据业务的需要,去灵活配置路由的方式;
(2)开源免费;
(3)支持的编程语言多: Python,Java,PHP,Go,Ruby,C#,JavaScript,Object C,Swift等等;
(4)应用广泛,社区活跃: 遇到问题时,很容易找到对应的讨论和解答;
(5)有开箱即用的监控和管理后台: 通过监控和管理后台,我们可以方便的对于其性能和消息进行全盘的掌握;后面我们会演示;
RabbitMQ:是基于AMQP 协议的 具有跨语言的特性,支持多种开发语言
RabbitMQ :结合erlang语言本身的并发优势,性能较好,社区活跃度也比较高,但是不利于做二次开发和维护。
RoketMQ:是基于JMS的 是阿里巴巴旗下开发的mq,只能用java语言
RoketMQ:在稳定性上可能更值得信赖
6.RabbitMQ的核心概念(核心组件);
(1)Producer生产者:
● 自然,在实际项目中,生产者的数量是不受限制的,一个也可以,多个也可以;
● 生产者会生产Message消息;
(2)Message消息:
● 消息会经过Exchange交换机,到达Queue队列;
(3)Exchange交换机:
● Exchange交换机和 Queue队列 的关系,是非常自由的;自然,其会遵循我们指定的规则;但是,Exchange交换机和Queue队列并不一定是一对一或者一对多的关系;
● 即Exchange交换机可以 Binding绑定 一个队列,也可以Binding绑定多个队列;
● 在Exchange交换机和Queue队列绑定的时候,就会用到 Routing Key路由键 ;Routing Key路由键就是专用于决定交换机和队列是如何进行绑定的;
消息经过交换机,并且发送到Queue队列后,进一步其希望发送给Consumer消费者;然后,中间需要经过 Connection连接 ;在连接中,会有多个 Channel信道 ;这些哦消息数据,都是在Channel中进行读写的;然后,消费者会从中提取到自己想要的消息并且后续进行处理;
(4)Broker(或称Server)服务器:
● Broker可以认为是RabbitMQ的服务端,或者是RabbitMQ这种服务的一个服务实例;
● 然后,在Broker中有一个Virtual Host虚拟主机;
(5)Virtual Host虚拟主机:
● 同一个RabbitMQ服务端,可能同时被多个服务使用,如果服务与服务之间想隔离开、不想相互干扰的话,我们就可以在一个RabbitMQ中使用不同的虚拟主机,对他们进行隔离;