01. 基础理解
1.1 同步调用和异步调用
👉 同步调用 的时候调用者会 阻塞 等待被调用函数或方法执行完成,并且在完成后才继续执行后续代码。
👉试想一下如果是同步调用会出现什么场景?
不难总结出来同步调用的问题
- 加需求的问题(耦合性很差)
- 性能的问题,客户等待时间过长
- 一个调用的失败导致级联失败
但任何事物都有两面性,同步调用的优势就是: 立即得到响应的结果 时效性非常好,很多业务必须要一次执行完毕且需要结果才能进行,比如银行转账,需要保证双方都成功才能进行。
👉 而异步调用正好是相反,对于一些不是那么急于知道结果的业务,可以在返回给用户结果后再执行,这就引出了它的优势:首先是 解耦合,业务不需要写在一个代码上,而是可以以微服务的形式拆分开;其次,**立即返回 **给 用户结果,用户无需等待;还可以实现 故障的隔离,一个服务的问题不会导致整个业务的级联失败;最后是可以缓存消息,当消息很多的时候可以 错峰执行,达到削峰填谷的作用。
但缺点就是不能立刻得到处理的结果,时效性比较差,同时实现依赖于 Broker(代理),如果 Broker 出现问题会导致严重的后果。
👉 异步调用中会出现三个角色,分别是消息发送者、消息代理、和消息接收者;消息发送者发送消息到消息代理然后就可以继续执行,消息代理负责将消息转发给消息接收者,剩余的部分在消息接收者那里执行。
1.2 什么是 MQ?
👉 MQ
(Message Queue),消息队列,字面来看就是存放消息的队列;也就是异步调用中的 Broker
;这个命名也就解释了它的实现机制:MQ
提供了一种 异步通信 的方式,允许将消息发送到队列中,并由接收者从队列中获取和处理这些消息。MQ
通常被用于解耦和增强系统的可伸缩性、可靠性和灵活性。
👉 下面来看一下常见的 MQ Broker:
RabbitMQ | ActiveMQ | RocketMQ | Kafka | |
---|---|---|---|---|
公司 / 社区 | Rabbit | Apache | 阿里 | Apache |
开发语言 | Erlang | Java | Java | Scala & Java |
协议支持 | AMQP , XMPP , SMTP , STOMP | OpenWire , STOMP , REST , REST , SMPP , AMQP | 自定义协议 | 自定义协议 |
可用性 | 高 | 一般 | 高 | 高 |
单机吞吐量 | 一般 | 差 | 高 | 非常高 |
消息延迟 | 微秒级 | 毫秒级 | 毫秒级 | 毫秒以内 |
消息可靠性 | 高 | 一般 | 高 | 一般 |
选择 RabbitMQ 的原因是因为它的社区生态好,且各方面性能都很优异,很多公司也都在使用。
02. RabbitMQ介绍即安装方式
2.1 RabbitMQ 安装
这里采用 Docker 的安装方式:
👉 接下来是使用 Docker 安装 RabbitMQ
$ docker pull rabbitmq
$ docker images # 检测是否安装成功
👉 启动容器
$ docker run -d \
--name mq \
-e RABBITMQ_DEFAULT_USER=root \
-e RABBITMQ_DEFAULT_PASS=123456 \
-v mq-plugins:/plugins \
-p 15672:15672 \
-p 5672:5672 \
rabbitmq
2.2 整体架构
除去上面提到的 publisher
和 consumer
这里来具体看一下其内部的部分
发送者发送信息给 交换机(exchange
),交换机转发路由消息给 queue
,consumer
监听队列变化并从队列中取出和处理消息。
2.3 快速入门
👉 在这里输入上面配置中设置的账号和密码(镜像启动的配置)
👉 基本界面
👉 首先去 Queues
中创造两个队列
👉 关联交换机与队列:交换机肯定不会服务到所有的队列,需要设置交换机与队列之间的 binding
👉 发送信息
👉 在队列中查看信息
2.4 Virtual Host 体验
👉 找到 Admin
界面下的 Virtual Hosts
可以配置新的 Virtual Host
同时在 Users
界面下可以新增用户,用户如果有创建 Virtual Host 的权利的话,他创建的主机就默认有权限访问,反之则需要 Admin 去手动配置权限