云建站公司,网站顶部设计,手机微信管理系统,网站建设接私活平台应该是新年前最后一篇博客了#xff0c;明天浅浅休息一下#xff0c;提前祝大家新年快乐捏#xff01;#x1f60a;#x1f60a;#x1f60a; 01. 基础理解
1.1 同步调用和异步调用
#x1f449; 同步调用 的时候调用者会 阻塞 等待被调用函数或方法执行完成#xff… 应该是新年前最后一篇博客了明天浅浅休息一下提前祝大家新年快乐捏 01. 基础理解
1.1 同步调用和异步调用 同步调用 的时候调用者会 阻塞 等待被调用函数或方法执行完成并且在完成后才继续执行后续代码。 那这样会出现什么问题呢 回想一下平时充话费的场景当我们点击支付了之后当余额被扣减完之后就可以直接退出了其实是没有等待服务状态更新和后面进行的很多业务的比如短信通知服务也是在充值以后一段时间才会通知的这其实就是一种异步的方式。 试想一下如果是同步调用会出现什么场景 答案是界面会卡住等到一切短信发送完成才能得到 结果这就导致了等待时间的延长将视角再放的深一点如果将这些业务都做成同步的话其中一个业务的失败会导致所有业务的 级联失败也就是如果短信通知业务失效了钱甚至会被退回来这就导致了用户体验的问题再将视角放到程序员身上如果设计一个同步业务有新的业务加入进来要去该原来的代码这就导致了 耦合性很高 的问题。 不难总结出来同步调用的问题
加需求的问题耦合性很差性能的问题客户等待时间过长一个调用的失败导致级联失败
但任何事物都有两面性同步调用的优势就是 立即得到响应的结果 时效性非常好很多业务必须要一次执行完毕且需要结果才能进行比如银行转账需要保证双方都成功才能进行。 而异步调用正好是相反对于一些不是那么急于知道结果的业务可以在返回给用户结果后再执行这就引出了它的优势首先是 解耦合业务不需要写在一个代码上而是可以以微服务的形式拆分开其次**立即返回 **给 用户结果用户无需等待还可以实现 故障的隔离一个服务的问题不会导致整个业务的级联失败最后是可以缓存消息当消息很多的时候可以 错峰执行达到削峰填谷的作用。
但缺点就是不能立刻得到处理的结果时效性比较差同时实现依赖于 Broker代理如果 Broker 出现问题会导致严重的后果。 异步调用中会出现三个角色分别是消息发送者、消息代理、和消息接收者消息发送者发送消息到消息代理然后就可以继续执行消息代理负责将消息转发给消息接收者剩余的部分在消息接收者那里执行。 1.2 什么是 MQ MQMessage Queue消息队列字面来看就是存放消息的队列也就是异步调用中的 Broker这个命名也就解释了它的实现机制MQ 提供了一种 异步通信 的方式允许将消息发送到队列中并由接收者从队列中获取和处理这些消息。MQ 通常被用于解耦和增强系统的可伸缩性、可靠性和灵活性。 下面来看一下常见的 MQ Broker
RabbitMQActiveMQRocketMQKafka公司 / 社区RabbitApache阿里Apache开发语言ErlangJavaJavaScala Java协议支持AMQP, XMPP, SMTP, STOMPOpenWire, STOMP, REST, REST, SMPP, AMQP自定义协议自定义协议可用性高一般高高单机吞吐量一般差高非常高消息延迟微秒级毫秒级毫秒级毫秒以内消息可靠性高一般高一般 协议是在通信系统中用于规定数据传输格式、通信规则和通信过程的一组规范。 单机吞吐量单个计算机或服务器上处理的消息数量或请求数量的度量。 选择 RabbitMQ 的原因是因为它的社区生态好且各方面性能都很优异很多公司也都在使用。
02. RabbitMQ介绍即安装方式
2.1 RabbitMQ 安装
这里采用 Docker 的安装方式 虚拟机的安装与配置参考我的博客 从零开始 Linux一基础介绍与常用指令总结 如果没有安装 Docker 的朋友可以看这一部分安装一下 卸载旧版本的 Docker sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine安装 yum 工具 $ sudo yum install -y yum-utils配置 Docker 的 yum 源 $ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo安装 Docker $ sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin检验是否安装成功 $ docker -v启动 Docker $ sudo systemctl start docker检测是否启动成功 $ docker images接下来是使用 Docker 安装 RabbitMQ
$ docker pull rabbitmq$ docker images # 检测是否安装成功启动容器
$ docker run -d \
--name mq \
-e RABBITMQ_DEFAULT_USERroot \
-e RABBITMQ_DEFAULT_PASS123456 \
-v mq-plugins:/plugins \
-p 15672:15672 \
-p 5672:5672 \
rabbitmq这里来简单讲解一下这部分的指令 \ 是换行符用于多行输入-eenvironment配置环境变量上面是配置了管理员的用户名和密码可以自行配置-pport配置端口rabbitmq 有两个提供服务的端口一个是图形化界面 15672 和实际的业务端口 5672可以通过 主机名:15672 的方式在浏览器访问界面。--name配置容器名rabbitmq是使用的镜像就是上面拉取下来的镜像如果不写版本号的话默认是 latest ❗ 如果图形化界面无法打开的话很有可能是没开启图形化服务 $ docker exec -it fb7a78201d31 /bin/bash # 进入镜像内部
$ rabbitmq-plugins enable rabbitmq_management # 开启图形化服务2.2 整体架构
除去上面提到的 publisher 和 consumer 这里来具体看一下其内部的部分 发送者发送信息给 交换机exchange交换机转发路由消息给 queueconsumer 监听队列变化并从队列中取出和处理消息。 为什么需要 exchange通过后续的学习是可以将消息直接放到队列中的但如果要向所有的队列n 个中发送消息就要写 n 次调用代码如果向固定的队列发送消息又要去定义新的方法所以交换机就可以通过配置实现路由的效果将消息按照规定的方式转发到队列。 其中的 Virtual Host 是一种数据隔离手段很多的消息都可以在同一台 RabbitMQ 服务器上执行但为了不同模块的区分需要一个类似命名空间的隔离效果。 2.3 快速入门 任务通过图形化界面来初步体会消息队列 在这里输入上面配置中设置的账号和密码镜像启动的配置 基本界面 首先去 Queues 中创造两个队列 先按照我的配置来创造 hello.queue1 和 hello.queue2 关联交换机与队列交换机肯定不会服务到所有的队列需要设置交换机与队列之间的 binding 使用系统默认的交换机配置关联 发送信息 在队列中查看信息 2.4 Virtual Host 体验 找到 Admin 界面下的 Virtual Hosts 可以配置新的 Virtual Host 同时在 Users 界面下可以新增用户用户如果有创建 Virtual Host 的权利的话他创建的主机就默认有权限访问反之则需要 Admin 去手动配置权限