MQ(message queue)字面意思上来说消息队列,FIFO先入先出,队列中存入的内容是message,是一种跨进程的通信机制,用于上下游传递消息。MQ 是一种非常常见的上下游“逻辑解耦+物理解耦”的消息通信服务。使用了 MQ 之后,消息发送上游只需要依赖 MQ,不
用依赖其他服务。
比如说订单系统最多一次可以处理一万次订单,这个处理能力在正常时段下单时绰绰有余,但是在高峰期时如果有两万次下单操作系统是处理不了的只能限制订单超过一万次后不允许用户下单,但是如果使用消息队列做缓冲,我们可以取消这个限制,把一米内的订单分散成一段时间来处理,这个时候有些用户可能在下单十几秒后才能收到下单成功消息 但是这样总比不能让用户下单体验好
1.1.2应用解耦以电商应用为例,应用中有订单系统、库存系统、物流系统、支付系统。用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统出了故障,都会造成下单操作异常。当转变成基于消息队列的方式后,系统间调用的问题会减少很多,比如物流系统因为发生故障,需要几分钟来修复。在这几分钟的时间里,物流系统要处理的内存被缓存在消息队列中,用户的下单操作可以正常完成。当物流系统恢复后,继续处理订单信息即可,中单用户感受不到物流系统的故障,提升系统的可用性
有些服务间调用是异步的,例如 A 调用 B,B 需要花费很长时间执行,但是 A 需要知道 B 什么时候可以执行完,一般有两种方式,A 过一段时间去调用 B 的查询 api 查询。或者 A 提供一个 callbackB 执行完之后调用 api 通知 A 服务。这两种方式都不是很优雅,使用消息总线,可以很方便解决这个问题,A 调用 B 服务后,只需要监听 B 处理完成的消息,当 B 处理完成后,会发送一条消息给 MQ,MQ 会将此消息转发给 A 服务。这样 A 服务既不用循环调用 B 的查询 api,也不用提供 callback同样 B 服务也不用做这些操作。A 服务还能及时的得到异步处理成功的消息。
2.安装RabbitMq接下来使用docker进行RabbitMQ的安装
2.1首先拉取镜像直接拉取镜像的话默认拉取最新的版本
docker pull rabbitmq:management
2.2启动镜像
注意修改用户名和密码
docker run -d -p 15672:15672 -p 5672:5672 \
-e RABBITMQ_DEFAULT_VHOST=my_vhost \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=admin \
--hostname myRabbit \
--name rabbitmq \
rabbitmq
参数说明:
- -d:表示在后台运行容器;
- -p:将容器的端口 5672(应用访问端口)和 15672 (控制台Web端口号)映射到主机中;
- -e:指定环境变量:
- RABBITMQ_DEFAULT_VHOST:默认虚拟机名;
- RABBITMQ_DEFAULT_USER:默认的用户名;
- RABBITMQ_DEFAULT_PASS:默认的用户密码;
- --hostname:指定主机名(RabbitMQ 的一个重要注意事项是它根据所谓的 节点名称 存储数据,默认为主机名);
- --name rabbitmq:设置容器名称;
- rabbitmq:容器使用的镜像名称;
启动完成后可以通过 docker ps 命令来查看容器是否启动
还可以设置docker启动时自动启动
docker update rabbitmq --restart=always
2.3启动 rabbitmq_management (RabbitMQ后台管理)
//进入容器内部 我这里使用容器名字进入 也可以使用容器id
docker exec -it rabbitmq /bin/bash
----------------------------------
//开启web后台管理界面
rabbitmq-plugins enable rabbitmq_management
2.3.1打开RabbitMQweb界面
- 浏览器输入地址 hhtp://ip:15672 即可访问后台管理界面 这里的ip为运行RabbitMQ的服务器ip
- 默认的用户名和密码都是guest
- 但由于我们启动的时候设置了默认的用户名和密码,所以我们可以使用设置的用户名和密码登录。
如果无法访问 可以尝试打开防火墙 如果是在阿里或者腾讯之类的服务器 要打开安全组的端口!!
到这里 我们docker安装RabbitMQ就完成了 接下来进行延迟插件的安装
下载地址 https://www.rabbitmq.com/community-plugins.html
进入web端后左上角有显示当前安装的RabbitMQ版本
我这里安装的是3.10版本所以我直接下载最新版的插件就可以
安装完成后用工具将插件文件上传到服务器上将刚刚上传的插件拷贝到容器内plugins目录下
docker cp /root/rabbitmq_delayed_message_exchange-3.10.2.ez rabbitmq:/plugins
上传之后进入容器内部
//进入容器 我这里使用容器名字 也可以用容器id进入
docker exec -it rabbitmq /bin/bash
-------------------------------------
//移动到plugins目录下
cd plugins
-------------------------------------
//查看是否上传成功
ls
然后我们启动插件
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
安装成功后 退出容器
exit
然后重启容器
//我这里还是使用容器名称 也可以使用容器id
docker restart rabbitmq
容器启动成功之后,登录RabbitMQ的管理界面(ip:15672 访问web界面),找到ExchangesTab页。点击Add a new exchange,在Type里面查看是否有x-delayed-message选项,如果存在就代表插件安装成功。
到这里我们的docker 安装RabbitMQ及延迟插件的安装就已经结束了!!