RabitMQ入门
初识MQ
同步通讯和异步通讯
打个比方,同步通讯其实就是你在和别人打电话,异步通讯就是你在和别人微信聊天。打电话的时候,别人无法打进来,微信却可以接收很多人信息。打电话是实时的,而微信别人回复你却需要一些时间。
我们在springcloud中学过的feign远程调用也是同步方式
同步调用的问题
想象一个场景,当我们支付的时候,是不是后台先调用支付服务,然后支付服务的里面调用订单服务,存储服务,短信服务等等,而这些调用都是同步的。
也就是说支付服务得等调用的这些服务都执行完才能结束,一个支付请求0.5s,那么当遇到几十万并发的时候,那这个服务抗的住吗??支付服务就坐着个板凳看着别的服务在吭哧吭哧的执行,凭什么它这么悠闲?它占着资源,却啥都不干!
总结一下
同步调用的问题
1.耦合度高,每次添加需求,都要修改原来的代码
2.性能下降,调用者需要等待服务提供者的响应,如果调用链过长,则导致响应时间都等于每次调用时间之和
3.资源浪费,调用链的每个服务在等待响应的过程中,不能释放请求占用的资源,高并发场景下和容易浪费系统资源
4.级联失败,如果服务提供者出现问题,所有的调用方都会跟着出问题,像多米诺骨牌一样,迅速导致整个微服务群故障
当然,同步调用也有他自己的优点:时效性强,可以立即得到结果
异步调用方案
事件驱动架构:
这就是异步调用的流程:用户发起支付请求----->支付服务告诉broker发布支付事件啦----->broker告诉那几个服务,你们给我开始同时工作!
这样做有什么好处呢?
很显然,在之前的同步调用的过程中,支付服务是不是要等待其他服务呀?没加一个模块,支付服务是不是还要再改代码呀?
现在呢?支付服务是不是只用告诉broker,我发起了这样一个行为,然后就结束了。这样既不用消耗资源,也不用等待,更不用修改代码!完美!
并且,broker告诉其它模块这个行为的同时,是不是其它模块都在同时的工作?那么,毫无疑问,效率是提升的,而不是下一个服务等上一个服务做完执行。
如果说,我们不需要短信服务了呢?
也很简单,只要让broker不去通知短信服务去完成任务即可。
我们最后来总结一下异步通讯的优势
1.耦合度低 (不用在支付模块里面写调用服务的语句)
2.吞吐量提升(支付服务只需要起一个通知作用)
3.故障隔离(如果说短信服务挂了,其他服务不会因为它挂了,就不去执行)
4.流量削峰(如果说支付服务发了2000个请求,broker会帮助你抗住,按照下流微服务的能力,慢慢地分发给下流微服务,以此保护微服务)
异步通讯的缺点:
1.依赖于broker的可靠性,安全性,吞吐能力
2.架构复杂,没有明显的流程线,不好追踪管理
3.无法返回结果,只是一个通知,它干完自己的事情,不会告诉你结果
什么是MQ?
MQ(MessageQueue),中文是消息队列,字面上看就是存放消息的队列。也就是事件驱动架构中的Broker
常见的MQ:
国内用的多的也就是RabbitMQ和Kafka
kalfka由于它吞吐量高,支持百万数据的吞吐量,但是消息可靠性一般,所以适合那种消息多但是不需要那么高可靠性的场景,比如说日志
而RabbitMQ虽然他单体吞吐量一般,但是它可靠性高,适用于业务,对于中小型的项目来说,RbbitMQ足以
RabbitMQ快速入门
RabbitMQ的概述和安装
RbbitMQ是一个基于Erlang语言开发的开源消息通信中间件:官网地址:www.rabbitmq.com/
以下操作你可以在自己服务器或者本地虚拟机上进行
1.下载镜像
docker pull rabbitmq:3-management
2.查看images
docker images
有了,拉取完成
3.跑镜像(安装MQ)
docker run \
-e RABBITMQ_DEFAULT_USER=nika \
-e RABBITMQ_DEFAULT_PASS=Whthaoshuai12138_ \
--name mq \
--hostname mq1 \
-p 15672:15672 \
-p 5672:5672 \
-d \
rabbitmq:3-management
这里讲解一下,第四行主机名,用来集群用,先不管。第一个-p端口映射用来管理rabbit管理平台(ui界面),第二个-p就是消息通信的端口,-d是后台运行,最后是镜像名称
来,我们cv一下,跑!
成功了!
来,我们访问15642试试看
502了,说明安全组没开,我们去腾讯云开个端口
进入这个界面了,账户密码都是之前跑镜像设置好的
我们先看看上面的功能
1.channel:是操作MQ的工具,消息的发送接收都要用到channel
2.exchange: 路由消息到队列中
3.queue:就是缓存消息的啦
4.virtualhost:是对queue,exchange这些资源的逻辑分组
下面我画的这个图很好的解释了这边的逻辑,ranbbitmq图标丑的来,就换了个图
那么我们怎么进行虚拟主机(virtual host)的分组呢?
1.创建用户
2.点击virtualhost
3.添加虚拟主机
4.点击你的Name
5.选择你刚刚创建好的虚拟主机,点击setPermission即可
常见消息模型
MQ官方文档中给出了5个MQ的Demo示例,对应了几种不同的用法
去rabbitmq官网,点击docs,然后点击getStarted
官网给出了不少demo,这对应了几种不同的用法,可以分成两大块
-
基本消息队列(BasicQueue)对应demo1
-
工作消息队列(WorkQueue)对应demo2
-
发布订阅(Publish)其实就是我们最上面讲的模型
- Fanout Exchange:广播 对应demo3
- Direct Exchange:路由 对应demo4
- Topic Exchange:主题 对应demo5
下一篇文章我们会给大家讲述各个模型和他们的实现