Spring Cloud 之 RabbitMQ(一)

2,176 阅读6分钟

RabitMQ入门

初识MQ

同步通讯和异步通讯

打个比方,同步通讯其实就是你在和别人打电话,异步通讯就是你在和别人微信聊天。打电话的时候,别人无法打进来,微信却可以接收很多人信息。打电话是实时的,而微信别人回复你却需要一些时间。

我们在springcloud中学过的feign远程调用也是同步方式

同步调用的问题

想象一个场景,当我们支付的时候,是不是后台先调用支付服务,然后支付服务的里面调用订单服务,存储服务,短信服务等等,而这些调用都是同步的。

image-20221011122307535.png

也就是说支付服务得等调用的这些服务都执行完才能结束,一个支付请求0.5s,那么当遇到几十万并发的时候,那这个服务抗的住吗??支付服务就坐着个板凳看着别的服务在吭哧吭哧的执行,凭什么它这么悠闲?它占着资源,却啥都不干!

总结一下

同步调用的问题

1.耦合度高,每次添加需求,都要修改原来的代码

2.性能下降,调用者需要等待服务提供者的响应,如果调用链过长,则导致响应时间都等于每次调用时间之和

3.资源浪费,调用链的每个服务在等待响应的过程中,不能释放请求占用的资源,高并发场景下和容易浪费系统资源

4.级联失败,如果服务提供者出现问题,所有的调用方都会跟着出问题,像多米诺骨牌一样,迅速导致整个微服务群故障

当然,同步调用也有他自己的优点:时效性强,可以立即得到结果

异步调用方案

事件驱动架构:

image-20221011132833765.png

这就是异步调用的流程:用户发起支付请求----->支付服务告诉broker发布支付事件啦----->broker告诉那几个服务,你们给我开始同时工作!

这样做有什么好处呢?

很显然,在之前的同步调用的过程中,支付服务是不是要等待其他服务呀?没加一个模块,支付服务是不是还要再改代码呀?

现在呢?支付服务是不是只用告诉broker,我发起了这样一个行为,然后就结束了。这样既不用消耗资源,也不用等待,更不用修改代码!完美!

并且,broker告诉其它模块这个行为的同时,是不是其它模块都在同时的工作?那么,毫无疑问,效率是提升的,而不是下一个服务等上一个服务做完执行。

如果说,我们不需要短信服务了呢?

也很简单,只要让broker不去通知短信服务去完成任务即可。

我们最后来总结一下异步通讯的优势

1.耦合度低 (不用在支付模块里面写调用服务的语句)

2.吞吐量提升(支付服务只需要起一个通知作用)

3.故障隔离(如果说短信服务挂了,其他服务不会因为它挂了,就不去执行)

4.流量削峰(如果说支付服务发了2000个请求,broker会帮助你抗住,按照下流微服务的能力,慢慢地分发给下流微服务,以此保护微服务)

异步通讯的缺点:

1.依赖于broker的可靠性,安全性,吞吐能力

2.架构复杂,没有明显的流程线,不好追踪管理

3.无法返回结果,只是一个通知,它干完自己的事情,不会告诉你结果

什么是MQ?

MQ(MessageQueue),中文是消息队列,字面上看就是存放消息的队列。也就是事件驱动架构中的Broker

常见的MQ:

image-20221011140306875.png

国内用的多的也就是RabbitMQ和Kafka

kalfka由于它吞吐量高,支持百万数据的吞吐量,但是消息可靠性一般,所以适合那种消息多但是不需要那么高可靠性的场景,比如说日志

而RabbitMQ虽然他单体吞吐量一般,但是它可靠性高,适用于业务,对于中小型的项目来说,RbbitMQ足以

RabbitMQ快速入门

RabbitMQ的概述和安装

RbbitMQ是一个基于Erlang语言开发的开源消息通信中间件:官网地址:www.rabbitmq.com/

以下操作你可以在自己服务器或者本地虚拟机上进行

1.下载镜像

docker pull rabbitmq:3-management

2.查看images

docker images

image-20221011141525403.png

有了,拉取完成

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一下,跑!

image-20221011142641413.png 成功了!

来,我们访问15642试试看

image-20221011142807787.png

502了,说明安全组没开,我们去腾讯云开个端口

image-20221011143121967.png

进入这个界面了,账户密码都是之前跑镜像设置好的

image-20221011144607729.png

我们先看看上面的功能

1.channel:是操作MQ的工具,消息的发送接收都要用到channel

2.exchange: 路由消息到队列中

3.queue:就是缓存消息的啦

4.virtualhost:是对queue,exchange这些资源的逻辑分组

下面我画的这个图很好的解释了这边的逻辑,ranbbitmq图标丑的来,就换了个图

image-20221011144557913.png

那么我们怎么进行虚拟主机(virtual host)的分组呢?

1.创建用户

image-20221011145022847.png

2.点击virtualhost

image-20221011145037242.png

3.添加虚拟主机

image-20221011145104492.png

4.点击你的Name

image-20221011145133390.png

5.选择你刚刚创建好的虚拟主机,点击setPermission即可

image-20221011145211149.png

常见消息模型

MQ官方文档中给出了5个MQ的Demo示例,对应了几种不同的用法

去rabbitmq官网,点击docs,然后点击getStarted

image-20221011145558210.png

官网给出了不少demo,这对应了几种不同的用法,可以分成两大块

  1. 基本消息队列(BasicQueue)对应demo1

  2. 工作消息队列(WorkQueue)对应demo2

  3. 发布订阅(Publish)其实就是我们最上面讲的模型

    • Fanout Exchange:广播 对应demo3
    • Direct Exchange:路由 对应demo4
    • Topic Exchange:主题 对应demo5

下一篇文章我们会给大家讲述各个模型和他们的实现