第五届青训营后端第八天学习笔记| 青训营笔记

73 阅读2分钟

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

一、本堂课重点内容:

  • rabiitmq

二、rabiitmq

rabbitmq是当前比较常用的消息队列工具,下面将对此进行一个初步的讲解。

消息队列可以用在哪里呢?

  • 异步处理,例如a+b+c事件,如果同步的话需要Ta+Tb+Tc,如果是异步的话那就max(a,b,c),因此为了更快响应,采用rabbitmq是必要的。
  • 应用解耦:不需要更新接口,类似gateway的作用,只需要关注业务逻辑本身。
  • 流量控制:可以控制流量,削峰。防止激增流量把服务器打挂

消息队列包括什么?

  • 消息代理(message broker)和目的的(destination)
  • 两种方式达到:队列(点对点)以及主题(发布订阅)
    • 点对点:消息只有唯一的发送者和接收者
    • 发布订阅:多个接收者,类似订阅报纸

rabbitmq:

  • publisher:message+router-key
  • broker:exchange交互机、exchange负责接收消息、queue的binding(储存信息)
  • consumer:connection,一个客户端只会建立一条连接
  • channel:connection里的通道,信道

首先是安装,采用docker的形式进行安装。

// docker pull rabbitmq
docker run -d --name rabbitmq -p 5671:5671 -p 5672:5672 -p 4369:4369 -p 25672:25672 -p 15671:15671 -p 15672:15672 rabbitmq:management

1.1 consumer

package main

import (
   "fmt"
   "github.com/rabbitmq/amqp091-go"
   "log"
)

func main() {
   conn, err := amqp091.Dial("amqp://root:123456@localhost:5672")
   if err != nil {
      log.Fatal(err)
   }

   defer conn.Close()

   ch, err := conn.Channel()
   if err != nil {
      log.Fatal(err)
   }

   q, err := ch.QueueDeclare(
      "name",
      false,
      false,
      false,
      false,
      nil,
   )
   if err != nil {
      log.Fatal(err)
   }

   err = ch.Qos(
      1,
      0,
      false,
   )
   if err != nil {
      log.Fatal(err)
   }

   msgs, err := ch.Consume(q.Name, "", true, false, false, false, nil)
   if err != nil {
      log.Fatal(err)
   }

   for v := range msgs {
      fmt.Printf("bodt = %s\n", v.Body)
   }
}

1.2 producter

package main

import (
   "github.com/rabbitmq/amqp091-go"
   "log"
)

func main() {
   conn, err := amqp091.Dial("amqp://root:123456@localhost:5672")
   if err != nil {
      log.Fatal(err)
   }
   defer conn.Close()
   ch, err := conn.Channel()
   if err != nil {
      log.Fatal(err)
   }
   q, err := ch.QueueDeclare(
      "name",
      false,
      false,
      false,
      false,
      nil,
   )

   if err != nil {
      log.Fatal(err)
   }
   err = ch.Publish(
      "",
      q.Name,
      false,
      false,
      amqp091.Publishing{
         ContentEncoding: "text/plain",
         Body:            []byte("shuaige cong"),
      },
   )
   if err != nil {
      log.Fatal(err)
   }
}

二、引用参考:

1.blog.csdn.net/QianLiStude…