当前位置: 首页 > news >正文

RabbitMQ-topic exchange使用方法

RabbitMQ-默认读、写方式介绍

RabbitMQ-发布/订阅模式

RabbitMQ-直连交换机(direct)使用方法

目录

1、概述

2、topic交换机使用方法

2.1 适用场景

2.2 解决方案

3、代码实现

3.1 源代码实现

3.2 运行记录

4、小结


1、概述

topic 交换机是比直连交换机功能更加强大的交换方式,通过不同的路由规则,可以实现fanout、direct两种交换机的功能。

2、topic交换机使用方法

2.1 适用场景

假设我们要对动物做一个描述,根据速度、颜色、种类等特征对其进行分别入到不同的mq队列中,routing key的格式为:"<speed>.<colour>.<species>",比如说,所有黄色动物入队列1,跑的速度慢的,还有小兔子入队列2,哪该如何实现该需求呢?

2.2 解决方案

结合2.1描述的需求,我们可以画出如下框图:

知识点解释:

* (star) :和正则的功能类似,可以代表一整个单词。

# (hash) :代表0个或者多个单词。

如果一条消息的routing key为「quick.orange.rabbit」,将会被同时路由到Q1和Q2,「lazy.orange.elephant」的routing key同样也将会被同时路由到Q1和Q2,「quick.orange.fox」的消息只会被路由Q1,【lazy.brown.fox】只会被路由到Q2,【lazy.pink.rabbit】只会被路由到Q2一次,虽然匹配了两个binding,【quick.brown.fox】没有匹配到任何的绑定,那么消息将会被丢弃。

如果一个队列绑定的是【#】,那么他将会接收到所有的消息,会忽略调binding key,实现类似扇形交换机的功能。

如果一个routing key中没有设计【#】和【*】,那么他会实现类似直连交换机的功能。

3、代码实现

3.1 源代码实现

生产者:

package mainimport ("fmt"amqp "github.com/rabbitmq/amqp091-go"
)func main() {conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")if err != nil {fmt.Println("Failed to connect to RabbitMQ")return}defer conn.Close()ch, err := conn.Channel()if err != nil {fmt.Println("Failed to open a channel")return}err = ch.ExchangeDeclare("logs_topic", // name"topic",      // typetrue,         // durablefalse,        // auto-deletedfalse,        // internalfalse,        // no-waitnil,          // arguments)if err != nil {fmt.Println("Failed to declare an exchange,err:", err)return}body := "Hello World by topic exchange"err = ch.Publish("logs_topic",       // exchange"quick.orange.fox", // routing keyfalse,false,amqp.Publishing{ContentType: "text/plain",Body:        []byte(body),})if err != nil {fmt.Println("Failed to publish a message")return}
}

代码示例中routing key为【quick.orange.fox】,这条消息将会被路由到2.2中的Q1队列中。

消费侧代码:

package mainimport ("fmt"amqp "github.com/rabbitmq/amqp091-go"
)func main() {conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")if err != nil {fmt.Println("Failed to connect to RabbitMQ")return}defer conn.Close()ch, err := conn.Channel()if err != nil {fmt.Println("Failed to open a channel")return}err = ch.ExchangeDeclare("logs", "direct", true, false, false, false, nil)if err != nil {fmt.Println("Failed to declare an exchange")return}q, err := ch.QueueDeclare("logs_topic", // nametrue,         // durablefalse,        // delete when unusedfalse,        // exclusivefalse,        // no-waitnil,          // arguments)err = ch.QueueBind(q.Name,       // queue name"*.orange.*", // routing key(binding key)"logs_topic", // exchangefalse,nil,)msgs, err := ch.Consume(q.Name, // queue"",     // consumertrue,   // auto-acktrue,   // exclusivefalse,  // no-localfalse,  // no-waitnil,    // args)var forever chan struct{}go func() {for d := range msgs {fmt.Printf(" [x] %s\n", d.Body)}}()fmt.Printf(" [*] Waiting for logs. To exit press CTRL+C")<-forever
}

3.2 运行记录

发送消息:

接收消息:

4、小结

学到这里发现,topic交换机完全具备fanout、direct两种交换机的全部功能,日常开发完全可以使用topic交换机,根据不同routing key即可以实现扇形和直连交换机的功能。

比如第3章节中消费者,routing key设置为【#】,则这个队列可以接收所有消息,类似扇形交换机功能。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • NLP——电影评论情感分析
  • nginx配置https协议(测试环境)
  • PDF格式分析(八十五)——水印注释(Watermark)
  • 如何开发一个直播APP:功能介绍与开发步骤详解
  • 实时通信websocket和sse
  • 关于自学编程的9点忠告
  • 【BeX5】知识中心
  • Android启动流程
  • 在 Windows 操作系统中,可以通过命令行工具来杀死进程
  • Matlab|基于主从博弈的智能小区代理商定价策略及电动汽车充电管理
  • Google Chrome谷歌浏览器怎么立刻更新书签
  • MySQL与PostgreSQL关键对比三(索引类型)
  • 高效处理海量慢SQL日志文件:Java与JSQLParser去重方案详解
  • Linux:多线程的操作
  • 边缘计算(Edge Computing)_关键概念/优势/应用场景
  • [case10]使用RSQL实现端到端的动态查询
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 【React系列】如何构建React应用程序
  • 30秒的PHP代码片段(1)数组 - Array
  • Apache Pulsar 2.1 重磅发布
  • Git 使用集
  • JavaScript的使用你知道几种?(上)
  • JavaScript中的对象个人分享
  • Puppeteer:浏览器控制器
  • Webpack 4x 之路 ( 四 )
  • 开源地图数据可视化库——mapnik
  • 前端设计模式
  • 深度学习在携程攻略社区的应用
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • Android开发者必备:推荐一款助力开发的开源APP
  • MyCAT水平分库
  • ​经​纬​恒​润​二​面​​三​七​互​娱​一​面​​元​象​二​面​
  • ​浅谈 Linux 中的 core dump 分析方法
  • (02)Unity使用在线AI大模型(调用Python)
  • (09)Hive——CTE 公共表达式
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (1)(1.9) MSP (version 4.2)
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (Ruby)Ubuntu12.04安装Rails环境
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (一)基于IDEA的JAVA基础10
  • (转)EOS中账户、钱包和密钥的关系
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .NET MVC 验证码
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .NET6 命令行启动及发布单个Exe文件
  • .net打印*三角形
  • .sdf和.msp文件读取
  • //TODO 注释的作用
  • [ Linux Audio 篇 ] 音频开发入门基础知识