这是我参与「第五届青训营」伴学笔记创作活动的第14天
笨人纯小白,笔记包括一些上课学到的知识和课外总结的内容,如有错误请指正!
十七、Golang消息队列(原理)
17.1 消息队列的作用
-
异步,将同步的消息变为异步,例如我们可以使用
rpc调用另一个服务,但是我们必须等待返回(同步),用mq可以变异步 -
解耦,将单体服务拆分多个微服务,实现了分布式部署,单个服务的修改、增加或删除,不影响其他服务,不需要全部服务关闭重启
-
抗压,由于是异步,解耦的,高并发请求到来时,我们不直接发送给服务,而是发给MQ,让服务决定什么时候接收消息,提供服务,这样就缓解了服务的压力 图示: 用户注册后发邮件和虚拟币:
异步解耦图:
抗压图:
17.2 收发流程
- 生产者发送消息的流程
- 生产者连接RabbitMQ,建立
TCP连接( Connection),开启信道(Channel) - 生产者声明一个
Exchange(交换器),并设置相关属性,比如交换器类型、是否持久化等 - 生产者声明一个队列井设置相关属性,比如是否排他、是否持久化、是否自动删除等
- 生产者通过
routingKey(路由Key)将交换器和队列绑定( binding )起来 - 生产者发送消息至
RabbitMQ Broker,其中包含 routingKey (路由键)、交换器等信息 - 相应的交换器根据接收到的 routingKey 查找相匹配的队列。
- 如果找到,则将从生产者发送过来的消息存入相应的队列中。
- 如果没有找到,则根据生产者配置的属性选择丢弃还是回退给生产者
- 关闭信道。
- 关闭连接
- 消费者接收消息的过程
- 消费者连接到
RabbitMQ Broker,建立一个连接(Connection ) ,开启一个信道(Channel)。 - 消费者向RabbitMQ Broker 请求消费相应队列中的消息,可能会设置相应的回调函数, 以及 做一些准备工作。
- 等待RabbitMQ Broker 回应并投递相应队列中的消息, 消费者接收消息。
- 消费者
确认( ack)接收到的消息。 - RabbitMQ 从队列中删除相应已经被确认的消息。
- 关闭信道。
- 关闭连接。
17.3 docker安装
拉取image:
docker pull rabbitmq:3.8-management-alpine
启动容器:
5672进行通信,15672 ,web管理工具
docker run -d --name rmq \
-e RABBITMQ_DEFAULT_USER=用户名 \
-e RABBITMQ_DEFAULT_PASS=密码 \
-p 15672:15672 \
-p 5672:5672 \
rabbitmq:3.8-management-alpine