golang rabbitmq消费者设计_RabbitMQ系列笔记主题订阅模式

9ffcb8cd429f70fcee2c941ca502d383.png

导语

昨天的内容主要讲了RabbitMQ的发布订阅模式和路由模式,都很好的满足了我们的日志打印,但是如果说,我对日志的打印,希望可以过滤掉一些内容呢,比如说,在打印错误日志的时候,只打印login时的错误?这个时候,就需要我们使用主题订阅的模式,可以说,主题订阅模式可以完全代替路由模式,因为在主题订阅模式中,如果没有响应的关键词,便和路由模式完全一样。

主题交换器介绍

在使用主题交换器时需要注意以下几点

在使用routing_key,必须是有点分隔符进行分隔 * 可以代表代替一个单词 # 可以代替0个或多个单词

案例

我们对我们之前的例子做修改,这次修改希望生产者可以在运行的时候指定路由需要增加下面这个函数

 1func severityFrom(args []string) string {
 2    var s string
 3    if (len(args) < 2) || os.Args[1] == "" {
 4        s = "#"
 5    } else {
 6        s = os.Args[1]
 7    }
 8    fmt.Println(s)
 9    return s
10}
11func bodyFrom(args []string) string {
12    var s string
13    if (len(args) < 3) || os.Args[2] == "" {
14        s = "hello"
15    } else {
16        s = strings.Join(args[2:], " ")
17    }
18    return s
19}

现在来看我们的生产者
首先需要申请一个主题模式的交换器

1err = ch.ExchangeDeclare(
2    "logs_topic", //交换器的名字
3    "topic",      //交换器的类型、这里为广播类型
4    true,         //是否持久
5    false,        //无用的时候是否自动删除
6    false,        //true表示是。客户端无法直接发送msg到内部交换器,只有交换器可以发送msg到内部交换器。
7    false,        //no-wait
8    nil,          //arguments
9    )

然后发送消息到交换器

 1err = ch.Publish(
 2    "logs_topic",          //发送到交换机的名字
 3    severityFrom(os.Args), // routing key    // 路由,即队列的名字
 4    false,                 //mandatory
 5    false,                 //immediate
 6    amqp.Publishing{
 7        DeliveryMode: amqp.Persistent, //消息的持久化
 8        ContentType:  "text/plain",
 9        Body:         []byte(body),
10    },
11)

现在我们写两个消费者,消费者的路由不一样,消费者生产交换器和生产者完全一样,接着我们需要看第一个消费者绑定路由

1err = ch.QueueBind(
2    q.Name,       //队列的名字
3    "#.info.*",   //routing key
4    "logs_topic", //所绑定的交换器
5    false,
6    nil,
7)

第二个消费者绑定路由

1err = ch.QueueBind(
2    q.Name,       //队列的名字
3    "info.#",     //routing key
4    "logs_topic", //所绑定的交换器
5    false,
6    nil,
7)

运行

d031b8bad19b9b22a8f5c9c1c27791dd.png

只有绑定了info.#收到了消息

909be04970b6b49a9413c42ef840d57e.png

9b8b3e3cb5e46748890be0ccf7b439cf.png
现在尝试一下看看运行以上是否info.#和info.*都收到了消息?

推荐阅读

  • 开发环境搭建(持续更新中)
  • RabbitMQ系列笔记介绍篇
  • Golang中Modle包的使用
  • goriila context深入学习笔记
  • Go Context深入学习笔记
  • 基于Nginx和Consul构建高可用及自动发现的Docker服务架构
  • 关于log日志的深入学习笔记

本文欢迎转载,转载请联系作者,谢谢!

  • 公众号【常更新】:无崖子天下无敌
  • GitHub:https://github.com/yuwe1
  • CSDN【看心情更新】: https://blog.csdn.net/weixin_40051278
  • 博客地址【定期更新】:https://mowuya.cn/

eef070b29c44954e27ada0b2209add2b.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值