Go学习笔记(day14) | 青训营笔记

44 阅读2分钟

这是我参与「第五届青训营」伴学笔记创作活动的第14天

笨人纯小白,笔记包括一些上课学到的知识和课外总结的内容,如有错误请指正!

十七、Golang消息队列(原理)

17.1 消息队列的作用

  1. 异步,将同步的消息变为异步,例如我们可以使用rpc调用另一个服务,但是我们必须等待返回(同步),用mq可以变异步

  2. 解耦,将单体服务拆分多个微服务,实现了分布式部署,单个服务的修改、增加或删除,不影响其他服务,不需要全部服务关闭重启

  3. 抗压,由于是异步,解耦的,高并发请求到来时,我们不直接发送给服务,而是发给MQ,让服务决定什么时候接收消息,提供服务,这样就缓解了服务的压力 图示: 用户注册后发邮件和虚拟币:

    异步解耦图: image.png 抗压图: image.png

17.2 收发流程

  • 生产者发送消息的流程
  1. 生产者连接RabbitMQ,建立TCP连接( Connection),开启信道(Channel)
  2. 生产者声明一个Exchange(交换器),并设置相关属性,比如交换器类型、是否持久化等
  3. 生产者声明一个队列井设置相关属性,比如是否排他、是否持久化、是否自动删除等
  4. 生产者通过 routingKey (路由Key)将交换器和队列绑定( binding )起来
  5. 生产者发送消息至RabbitMQ Broker,其中包含 routingKey (路由键)、交换器等信息
  6. 相应的交换器根据接收到的 routingKey 查找相匹配的队列。
  7. 如果找到,则将从生产者发送过来的消息存入相应的队列中。
  8. 如果没有找到,则根据生产者配置的属性选择丢弃还是回退给生产者
  9. 关闭信道。
  10. 关闭连接
  • 消费者接收消息的过程
  1. 消费者连接到RabbitMQ Broker ,建立一个连接(Connection ) ,开启一个信道(Channel)
  2. 消费者向RabbitMQ Broker 请求消费相应队列中的消息,可能会设置相应的回调函数, 以及 做一些准备工作。
  3. 等待RabbitMQ Broker 回应并投递相应队列中的消息, 消费者接收消息。
  4. 消费者确认( ack) 接收到的消息。
  5. RabbitMQ 从队列中删除相应已经被确认的消息。
  6. 关闭信道。
  7. 关闭连接。 image.png

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