RabbitMQ发布/订阅模式介绍

发布/订阅模式在RabbitMQ中用于实现消息的广播,与简单队列和工作模式不同,它允许一个消息被多个消费者接收。在这种模式下,生产者发布消息到交换器,再由交换器将消息路由到多个队列,每个队列对应不同的业务逻辑,如邮箱和手机号通知。通过这种模式,可以避免将不同业务逻辑混在一起,提高系统的灵活性。RabbitMQ作为消息中间件,与其他如ActiveMQ、RocketMQ、Kafka等共同提供异步处理能力,虽然易学但精通其底层原理至关重要,这样才能提升个人竞争力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

发布/订阅模式

无选择接收消息,一个消息生产者,一个交换器,多个消息队列,多个消费者。称为发布/订阅模式

 

 

简单队列模式和工作模式只能消费同种消息

门户网站,用户在注册完后一般都会发送消息通知用户注册成功(失败)。

如果在一个系统中,用户注册信息有邮箱、手机号,那么在注册完后会向邮箱和手机号都发送注册完成信息(假设都发送)。

利用 MQ 实现业务异步处理,如果是用工作队列的话,就会声明一个注册信息队列。注册完成之后生产者会向队列提交一条注册数据,消费者取出数据同时向邮箱以及手机号发送两条消息。但是实际上邮箱和手机号信息发送实际上是不同的业务逻辑,不应该放在一块处理。

这个时候就可以利用发布/订阅模式将消息发送到转换机(EXCHANGE),声明两个不同的队列(邮箱、手机),并绑定到交换机。这样生产者只需要发布一次消息,两个队列都会接收到消息发给对应的消费者,大致如下图所示。

 

 对于MQ这个不单单的只有RatbbitMQ还有我们包括ActiveMQ(apache公司的),RocketMQ(阿里巴巴公司的,现已经转让给apache)还有我们大数据人员经常接触的kafaka都是我们市面上常见的消息中间件软件,都是大牛开发出来的但是这些软件很容易上手,我的RabbitMQ还是在狂神哪里学习的,对于学习使用一个东西很简单,但是我们市面上这样的人数不胜数,真真的是明白底层原理的人那是少之又少,这样的人才是有竞争力的人,所以为何我们不做一个有竞争力的人呢

在 Go 语言中实现 RabbitMQ发布 / 订阅模式(也称为 Pub/Sub 模式),你可以通过 `gopkg.in/amqp.v4` 这个包来进行。以下是基本的实验步骤: 1. **安装依赖**: 首先,你需要在项目中添加 amqp 包的依赖,可以使用 `go get gopkg.in/amqp.v4` 或者将 `"github.com/gotek/gomq/v4"` 添加到你的 `go.mod` 文件。 2. **创建连接**: 使用 `amqp.NewConnection()` 创建一个新的连接,传入 AMQP 服务器地址、用户名、密码等信息。例如: ```go conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/") if err != nil { // 处理错误 } defer conn.Close() ``` 3. **声明交换机和队列**: 发布者需要声明一个主题(exchange),订阅者则声明一个接收消息的队列。例如: ```go exchangeName := "topic_logs" queueName := "my_logs_queue" _, err = conn.ExchangeDeclare( exchangeName, "topic", // 类型,这里使用 topic 类型支持多关键字过滤 true, // 是否持久化 false, // 是否自动删除 false, // 是否内部只消费 false, // 是否立即绑定 nil, // 路由键 ) queue, _ := conn.QueueDeclare( queueName, // 队列名 false, // 是否持久化 false, // 是否独占 false, // 当队列满了是否丢弃 0, // 队列长度 nil, // 集群路由键 ) ``` 4. **发布消息** (发布者): 对于每条要发布的消息,创建一个 `Message` 对象并设置其内容、路由键等信息。然后使用 `conn.Publish()` 方法发布: ```go message := amqp.Message{ Body: []byte("This is a log message"), RoutingKey: "app.error", } err = conn.ExchangePublish( exchangeName, // 出发点 "", // 目的地(默认为 exchangeName) message.RoutingKey, // 路由键 amqp.Publishing{ // 消息详情 DeliveryMode: amqp.Persistent, // 是否持久化消息 Headers: map[string]interface{}{"foo": "bar"}, // 可选头部信息 }, ) ``` 5. **订阅消息** (订阅者): 创建一个消费者并监听特定队列,当有新消息到来时执行回调函数: ```go consumer, err := conn.Consume(queue.Name, "", false, false, false, false, nil) if err != nil { // 处理错误 } defer func() { _ = consumer.Cancel() }() for msg := range consumer.C Delivered { fmt.Printf("Received message %s\n", string(msg.Body)) // 处理接收到的消息 } ``` 6. **关闭连接**: 完成操作后记得关闭连接释放资源。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不凡~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值