python使用rabbitMQ介绍五(话题模式)
一、模式介绍
话题模式(Topic)基本思想和路由模式是一样的,只不过路由键支持模糊匹配,符号“#”匹配一个或多个词,符号“*”匹配不多不少一个词
话题模式相当于消息的模糊匹配,或者按照正则匹配。其中
# 是通配符,匹配一个或者多个单词
* 代表匹配一个单词
模式提醒:
当使用#来收消息时,会接收到所有的消息,这样和fanout模式一样了。
当routing key中不含*或者#时,则topic的模式退化为direct的一对一模式。
队列模型:
二、代码示例
发布者:
1 #!/usr/bin/env python 2 import pika 3 import sys 4 5 connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost')) 6 channel = connection.channel() 7 8 channel.exchange_declare(exchange='topic_logs', 9 exchange_type='topic') 10 11 routing_key = ['#', "kern.critical", "A critical kernel error"] 12 for i in range(10): 13 message = '{} msg at : routing key {}'.format(i, routing_key[i % 3]) 14 channel.basic_publish(exchange='topic_logs', 15 routing_key=routing_key[i % 3], 16 body=message) 17 print(" [x] Sent :%r" % (message)) 18 connection.close()
消费者:
1 import pika 2 import sys 3 4 connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost')) 5 channel = connection.channel() 6 7 channel.exchange_declare(exchange='topic_logs', 8 exchange_type='topic') 9 10 result = channel.queue_declare(exclusive=True) 11 queue_name = result.method.queue 12 13 binding_key = "#" 14 15 channel.queue_bind(exchange='topic_logs', 16 queue=queue_name, 17 routing_key=binding_key) 18 19 print(' [*] Waiting for logs. To exit press CTRL+C') 20 21 def callback(ch, method, properties, body): 22 print(" [x] %r:%r" % (method.routing_key, body)) 23 24 channel.basic_consume(callback, 25 queue=queue_name, 26 no_ack=True) 27 28 channel.start_consuming()
发布者输出:
[x] Sent :'0 msg at : routing key #' [x] Sent :'1 msg at : routing key kern.critical' [x] Sent :'2 msg at : routing key error.critical' [x] Sent :'3 msg at : routing key #' [x] Sent :'4 msg at : routing key kern.critical' [x] Sent :'5 msg at : routing key error.critical' [x] Sent :'6 msg at : routing key #' [x] Sent :'7 msg at : routing key kern.critical' [x] Sent :'8 msg at : routing key error.critical' [x] Sent :'9 msg at : routing key #'
消费者输出:
all:可以看到接收到所有的消息
[*] Waiting for logs. To exit press CTRL+C [x] '#':b'0 msg at : routing key #' [x] 'kern.critical':b'1 msg at : routing key kern.critical' [x] 'error.critical':b'2 msg at : routing key error.critical' [x] '#':b'3 msg at : routing key #' [x] 'kern.critical':b'4 msg at : routing key kern.critical' [x] 'error.critical':b'5 msg at : routing key error.critical' [x] '#':b'6 msg at : routing key #' [x] 'kern.critical':b'7 msg at : routing key kern.critical' [x] 'error.critical':b'8 msg at : routing key error.critical' [x] '#':b'9 msg at : routing key #'
消费者“critical”,只接收含critical的消息
[*] Waiting for logs. To exit press CTRL+C [x] 'kern.critical':b'1 msg at : routing key kern.critical' [x] 'error.critical':b'2 msg at : routing key error.critical' [x] 'kern.critical':b'4 msg at : routing key kern.critical' [x] 'error.critical':b'5 msg at : routing key error.critical' [x] 'kern.critical':b'7 msg at : routing key kern.critical' [x] 'error.critical':b'8 msg at : routing key error.critical'
消费者“kern”,只接收含kern的消息
[*] Waiting for logs. To exit press CTRL+C [x] 'kern.critical':b'1 msg at : routing key kern.critical' [x] 'kern.critical':b'4 msg at : routing key kern.critical' [x] 'kern.critical':b'7 msg at : routing key kern.critical'
三、队列信息
在管理页面上可以看到三个队列信息,routing key对应着三个队列的配置
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
2015-01-19 使用Python把Gtest XML测试结果转换为HTML格式