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

相关推荐
前端不太难1 小时前
从本地到多端:HarmonyOS 分布式数据管理实战详解
分布式·状态模式·harmonyos
Yeats_Liao1 小时前
MindSpore开发之路(二十五):融入开源:如何为MindSpore社区贡献力量
人工智能·分布式·深度学习·机器学习·华为·开源
我爱娃哈哈3 小时前
SpringBoot + Seata + Nacos:分布式事务落地实战,订单-库存一致性全解析
spring boot·分布式·后端
掘金-我是哪吒4 小时前
Kafka配套的Zookeeper启动脚本
分布式·zookeeper·云原生·kafka
超级种码5 小时前
Kafka四部曲之一:Kafka的核心概念
分布式·kafka
源代码•宸6 小时前
Leetcode—1123. 最深叶节点的最近公共祖先【中等】
经验分享·算法·leetcode·职场和发展·golang·dfs
Java 码农6 小时前
RabbitMQ集群部署方案及配置指南09
分布式·rabbitmq
u0104058366 小时前
基于 Kafka Exactly-Once 语义保障微信群发消息不重复不丢失
分布式·kafka·linq
超级种码6 小时前
Kafka四部曲之二:核心架构与设计深度解析
分布式·架构·kafka
源代码•宸6 小时前
Golang基础语法(go语言error、go语言defer、go语言异常捕获、依赖管理、Go Modules命令)
开发语言·数据库·后端·算法·golang·defer·recover