导语

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

主题交换器介绍

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

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

案例

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

func severityFrom(args []string) string {var s stringif (len(args) < 2) || os.Args[1] == "" {s = "#"} else {s = os.Args[1]}fmt.Println(s)return s
}
func bodyFrom(args []string) string {var s stringif (len(args) < 3) || os.Args[2] == "" {s = "hello"} else {s = strings.Join(args[2:], " ")}return s
}

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

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

然后发送消息到交换器

err = ch.Publish("logs_topic",          //发送到交换机的名字severityFrom(os.Args), // routing key    // 路由,即队列的名字false,                 //mandatoryfalse,                 //immediateamqp.Publishing{DeliveryMode: amqp.Persistent, //消息的持久化ContentType:  "text/plain",Body:         []byte(body),},
)

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

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

第二个消费者绑定路由

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

运行


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

现在尝试一下看看运行以上是否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/

RabbitMQ系列笔记主题订阅模式相关推荐

  1. RabbitMQ系列笔记广播模式和路由模式

    导语 上一节介绍了简单的工作模式,即一个队列可以被多个消费者进行消费,只有一条消息被送到消费者,采用公平调度的方式,在以往的例子中似乎我们还没用到交换器进行发送消息,我们都知道,往队列里发送消息,是需 ...

  2. RabbitMQ系列笔记介绍篇

    导语 rabbitMQ是市面上应用很广的一种应用间传送数据的通信方式,是由erlang语言开发,主要特点就是异步通信,实现服务与服务之间的解耦. 特点 可靠性:提供了持久化.传输时确认.发布时确认.跟 ...

  3. RabbitMQ系列笔记封装篇

    导语 在阅读本篇笔记时,如果你还不熟悉RabbitMQ,请查看公众号中关于RabbitMQ系列笔记相关文章,如果你已经熟悉了,还请在本篇文章多多指教.本文使用go mod进行获取相关包,使用Go1.1 ...

  4. RabbitMQ系列笔记入门篇

    导语 在了解本篇文章之前,先复习以下知识点,如果你对RabbitMQ还不了解,请先查看RabbitMQ系列笔记介绍篇这篇文章. 生产者:发送消息的程序 队列:消息的中转站 消费者:接收消息的程序 在以 ...

  5. RabbitMQ入门学习系列(四) 发布订阅模式

    什么时发布订阅模式 把消息发送给多个订阅者.也就是有多个消费端都完整的接收生产者的消息 换句话说 把消息广播给多个消费者 消息模型的核心 RabbitMQ不发送消息给队列,生产者也不知道消息发送到队列 ...

  6. RabbitMQ系列笔记work模式

    Work模式 生产者 具体讲修改代码之前,我们先想象一个场景,在真正的程序中,我们的生产者可能会产生很多消息,并且每个消息的复杂度会不同,这将会导致我们的消费者在进行应答消息的时候,在队列的消息会需要 ...

  7. 微服务系列笔记之API事件订阅模式和元数据模式

    导语 今天继续总结关于micro api的其它用法.因为每个知识点基本类似,在这篇笔记中了event和meta做对比.本系列的笔记全部参考Go Micro官方源码及博客,比较多,有兴趣的可以去研究. ...

  8. RabbitMQ六种队列模式-发布订阅模式

    前言 RabbitMQ六种队列模式-简单队列 RabbitMQ六种队列模式-工作队列 RabbitMQ六种队列模式-发布订阅 [本文] RabbitMQ六种队列模式-路由模式 RabbitMQ六种队列 ...

  9. 【转】RabbitMQ六种队列模式-3.发布订阅模式

    前言 RabbitMQ六种队列模式-简单队列 RabbitMQ六种队列模式-工作队列 RabbitMQ六种队列模式-发布订阅 [本文] RabbitMQ六种队列模式-路由模式 RabbitMQ六种队列 ...

最新文章

  1. linux shell 读取文件指定单行 多行 连续行 倒数几行
  2. 关于IE7 兼容问题
  3. 对微软的敌视何时休? 从一篇语言评论文章对C#的评价说起
  4. django 模板继承与重写
  5. matlab与STK互联(不使用connect软件的互联)
  6. 安徽省第二次计算机水平考试,2006第二次安徽省计算机水平考试试卷(ACCESS).doc...
  7. 工具推荐--正则表达式
  8. 计算机算法设计与分析 递归实现归并排序和非递归实现归并排序
  9. 【第40题】2019年OCP认证12C题库062考试最新考试原题
  10. 转换成CSV文件、Word、Excel、PDF等的方法--读取CSV文件的方法
  11. word导出手机端乱码或者打不开解决办法
  12. QQ再次被大规模盗号
  13. 把整个网页下载下来的方法
  14. 物联卡中心:企业物联网卡,共享套餐和独立套餐哪一种实惠
  15. 编译make px4_fmu-v2_default upload时,报错ERROR Board can accept larger flash images (2080768 bytes)
  16. 图文解读——为何采购申请PR总是频繁出错
  17. csv 文件读写乱码问题的一个简单解决方法
  18. 有主力资金活跃迹象的三大板块
  19. IOS 开发工具准备 gcc,gdb
  20. 12种高效的管理方法

热门文章

  1. MYsql 性能监控工具
  2. 镇魂街qlv格式怎么转换成mp4格式
  3. for循环:水仙花案例
  4. html5折叠面板的代码,微信小程序实现折叠面板
  5. 常用MySQL图形化管理工具
  6. PMAC的PVT功能实现解析笔记
  7. OCAD应用:利用OCAD进行一般光学系统的设计
  8. iOS In-App Purchase 内购之 什么是恢复购买记录
  9. U盘为Linux加速,用u盘启动linux的步骤
  10. nodejs 跑 vue项目