Rabbitmq-Golang使用简单模式

最简单的队列模式,只有一个消息生产者,一个消息消费者,一个队列,也称为点对点模式、一对一模式。适合比较简单的一对一消息通信,且不需要并发消费的场景,例如: 单一的异步发短信、发邮件、异步推送。

说明:

P 代表生产者 , C 代表消费者,红色代表队列。

基于go 1.24 rabbitmq 3.6.1

我们将消息发布者(发送者)称为 send.go,将消息消费者(接收者)称为receive.go。发布者将连接到RabbitMQ,发送一条消息,然后退出。

安装依赖包
复制代码
go mod init <your-module-name>
go get github.com/rabbitmq/amqp091-go

​ 我们将消息发布者(发送者)称为 send.go,将消息消费者(接收者)称为receive.go。发布者将连接到RabbitMQ,发送一条消息,然后退出。

1. 生产发送
1.1 导入包
复制代码
package main

import (
	"context"
	"log"
	"time"

	amqp "github.com/rabbitmq/amqp091-go" //导入amqp库
)
1.2 连接rabbitmq
复制代码
//连接rabbitmq
	conn, err := amqp.Dial("amqp://app_user:app_password@10.225.7.138:5672/")
	failOnError(err, "Failed to connect to RabbitMQ")
	defer conn.Close()
1.3 创建channel会话信道
复制代码
//创建channel信道
	ch, err := conn.Channel()
	failOnError(err, "Failed to open a channel")
	defer ch.Close()
1.4 生产并发送消息
复制代码
//声明发送的队列
	q, err := ch.QueueDeclare(
		"hello", // name
		false,   // durable
		false,   // delete when unused
		false,   // exclusive
		false,   // no-wait
		nil,     // arguments
	)
	failOnError(err, "Failed to declare a queue")
	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()

	body := "Hello World!"
	err = ch.PublishWithContext(ctx,
		"",     // exchange(交换机名字),这里忽略
		q.Name, // routing key
		false,  // mandatory
		false,  // immediate
		amqp.Publishing{
			ContentType: "text/plain",
			Body:        []byte(body),
		})
	failOnError(err, "Failed to publish a message")
	
	log.Printf(" [x] Sent %s\n", body)

发送完整代码:

复制代码
package main

import (
	"context"
	"log"
	"time"

	amqp "github.com/rabbitmq/amqp091-go" //导入amqp库
)

func failOnError(err error, msg string) {
	if err != nil {
		log.Panicf("%s: %s", msg, err)
	}
}
func main() {
	//连接rabbitmq
	conn, err := amqp.Dial("amqp://app_user:app_password@10.225.7.138:5672/")
	failOnError(err, "Failed to connect to RabbitMQ")
	defer conn.Close()
	//创建channel信道
	ch, err := conn.Channel()
	failOnError(err, "Failed to open a channel")
	defer ch.Close()
	//声明发送的队列
	q, err := ch.QueueDeclare(
		"hello", // name
		false,   // durable
		false,   // delete when unused
		false,   // exclusive
		false,   // no-wait
		nil,     // arguments
	)
	failOnError(err, "Failed to declare a queue")
	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()

	body := "Hello World!"
	err = ch.PublishWithContext(ctx,
		"",     // exchange(交换机名字),这里忽略
		q.Name, // routing key
		false,  // mandatory
		false,  // immediate
		amqp.Publishing{
			ContentType: "text/plain",
			Body:        []byte(body),
		})
	failOnError(err, "Failed to publish a message")
	
	log.Printf(" [x] Sent %s\n", body)
}
2. 接受消费

消费完整代码:

复制代码
package main

import (
	"log"

	amqp "github.com/rabbitmq/amqp091-go"
)

func failOnError(err error, msg string) {
	if err != nil {
		log.Panicf("%s: %s", msg, err)
	}
}
func main() {
	conn, err := amqp.Dial("amqp://app_user:app_password@10.225.7.138:5672/")
	failOnError(err, "Failed to connect to RabbitMQ")
	defer conn.Close()

	ch, err := conn.Channel()
	failOnError(err, "Failed to open a channel")
	defer ch.Close()

	q, err := ch.QueueDeclare(
		"hello", // name
		false,   // durable
		false,   // delete when unused
		false,   // exclusive
		false,   // no-wait
		nil,     // arguments
	)
	failOnError(err, "Failed to declare a queue")
	msgs, err := ch.Consume(
		q.Name, // queue
		"",     // consumer
		true,   // auto-ack
		false,  // exclusive
		false,  // no-local
		false,  // no-wait
		nil,    // args
	)
	failOnError(err, "Failed to register a consumer")

	var forever chan struct{}

	go func() {
		for d := range msgs {
			log.Printf("Received a message: %s", d.Body)
		}
	}()

	log.Printf(" [*] Waiting for messages. To exit press CTRL+C")
	<-forever
}

参考:

https://www.rabbitmq.com/tutorials/tutorial-one-go

https://www.tizi365.com/topic/17.html

相关推荐
名字还没想好☜7 小时前
Go context.AfterFunc 实战(Go 1.21):context 一取消就自动跑清理,告别手写 goroutine 监听 Done
后端·golang·go
web守墓人7 小时前
【goed/ui】自定义组件设计思想篇
linux·windows·ui·golang
青山木17 小时前
RocketMQ 入门到原理(一):整体架构与消息的生命周期
java·分布式·后端·中间件·架构·rocketmq
szephyr21 小时前
消息队列入门:RabbitMQ 和 Kafka 到底怎么选,什么时候不该用
后端·架构·kafka·消息队列·rabbitmq
lisanmengmeng1 天前
分布式追踪与监控:Skywalking介绍(一)
分布式·skywalking
HanhahnaH1 天前
Redis单线程和Tair多线程架构设计对比
分布式·缓存
rustfs1 天前
MinIO 国产开源平替正式 GA
分布式·docker·云原生·rust
螺蛳粉 螺蛳粉1 天前
MySQL 分布式集群系列 · 第五篇——全方位对比:NDB、MGR、主从复制、分库分表怎么选?
数据库·分布式·mysql
孙启超1 天前
【AI开发之Rust】第 7 课:错误处理 —— panic、Result 与 `?`
人工智能·分布式·后端·爬虫·spring cloud·架构·rust
九皇叔叔2 天前
Seata——把分布式事务理论落到 Java 微服务实践
分布式·分布式事务·cap·base·saga