第六届字节跳动青训营第一课(消息队列) | 青训营

83 阅读3分钟

简单模式

引言

最近在学习消息队列,但是视频大多数是以java为主的进行简绍。关于go的很少且类似的文章也很少。因此想记录自己的慢慢摸索的。让其它go开发者少走点坑。

正文

这里只讲述进行操作rabbitmq,并不会讲更多的原理什么着更偏向于实战,但是在面试的时候大多数都是进行造火箭。

go连接rabbitmq

首先安装依赖包

bash
复制代码
go get github.com/streadway/amqp
go
复制代码
func main(){

  conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/") 
  if err!=nil{
      log.Fatalf("%s: %s", "创建连接失败", err)
  }
  defer conn.Close() 
  // 创建一个通道 
  ch, err := conn.Channel() 
   if err!=nil{
      log.Fatalf("%s: %s", "创建信道失败", err)
  }
  defer ch.Close()
}

RabbitMQ服务器的URL格式参数说明 amqp://guest:guest@localhost:5672/ 是一个用于连接到RabbitMQ服务器的URL格式。在这个URL中,有几个部分需要理解:

  • amqp:这是AMQP协议的标识,用于指定使用AMQP协议进行通信。
  • guest:guest:这部分是用户名和密码,格式为<用户名>:<密码>。在RabbitMQ中,默认情况下,用户名和密码都是guest,但是在生产环境中,你应该使用更安全的凭据。
  • localhost:这是RabbitMQ服务器的主机名或IP地址。在示例中,RabbitMQ服务器被假设在本地运行,因此使用localhost
  • 5672:这是RabbitMQ服务器的端口号。默认情况下,RabbitMQ使用5672端口。
  • /:这是连接URL的路径部分vhost(个人认为mysql的数据库的概念),通常留空。

创建队列

go
复制代码
func main(){

    conn, err := amqp.Dial("amqp://guest:guest@192.168.10.131:5672/")  
    if err != nil {  
        log.Fatalf("Failed to connect to RabbitMQ: %v", err)  
    }  
    defer conn.Close()  
    // 创建一个通道  
    ch, err := conn.Channel()  
    if err != nil {  
        log.Fatalf("Failed to open a channel: %v", err)  
    }  
    defer ch.Close()
    q, err := ch.QueueDeclare( 
        "hello", // 队列名称 
        false, // 持久化 
        false, // 删除时不等待队列中的消息 
        false, // 非独占队列 
        false, // 不等待服务器重启后自动删除队列 
        nil, // 额外属性 
        )
}

创建交换机

go
复制代码
package main

import (
	"log"

	"github.com/streadway/amqp"
)

func failOnError(err error, msg string) {
	if err != nil {
		log.Fatalf("%s: %s", msg, err)
	}
}

func main() {
	conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
	failOnError(err, "创建连接失败")
	defer conn.Close()

	ch, err := conn.Channel()
	failOnError(err, "创建信道失败")
	defer ch.Close()

	exchangeName := "logs"


	// 创建交换机
	err = ch.ExchangeDeclare(
		exchangeName, // 交换机名称
		"", // 交换机类型默认direct类型(路由模式)更多的类型在amqp包里 
		true,         // 持久化
		false,        // 不自动删除
		false,        // 内部使用,一般为false
		false,        // 无需等待服务器重启时重新声明
		nil,          // 额外属性
	)
	failOnError(err, "创建交换机失败")

	log.Printf("创建交换机失败", exchangeName)
}

交换机几大模式

  1. Direct(直连): 这是最简单的交换机模式。它将消息根据消息的路由键(routing key)发送到与之完全匹配的队列。适用于一对一的消息传递,例如日志系统,不同级别的日志会被路由到不同的队列。

  2. Fanout(广播): Fanout交换机将消息发送到绑定到它的所有队列,无视消息的路由键。这用于广播消息给所有订阅者。适用于需要广播消息给多个消费者的场景,例如发布/订阅模式。

  3. Topic(主题): Topic交换机使用消息的路由键与通配符模式来路由消息到一个或多个队列。通配符 * 可以匹配一个单词,# 可以匹配零个或多个单词。适用于复杂的消息过滤和路由需求,如按照多个标识来路由消息。

  4. Headers(头部): Headers交换机根据消息的属性(header)来路由消息。在绑定时,可以指定一组键值对,消息中的属性需要与绑定的键值对匹配。适用于非常复杂的匹配需求,但不常被使用。

作者:斑斑砖
链接:juejin.cn/post/726820…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。