热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

6(自)、交换机之关键字模式

上一节中的我们的日志系统将所有消息广播给所有消费者,对此我们想做一些改变,例如我们希望将日志消息写入磁盘的程序仅接收严重错误(error),而不存储那些警告(warnning)或者


  • 上一节中的我们的日志系统将所有消息广播给所有消费者,对此我们想做一些改变,例如我们希望将日志消息写入磁盘的程序仅接收严重错误(error),而不存储那些警告(warnning)或者信息(info)日志信息避免浪费磁盘空间。Fanout这种交换类型并不能给我们带来很大的灵活性,它只能进行无意识的广播,在这里我们将使用direct这种类型来进行替换,这种类型的工作方式是,消息只去到它绑定的routing_key队列中去.



  • 在上面这张图中,我们可以看到X绑定了两个队列,绑定类型是direct。队列Q1绑定键为orange,队列Q2绑定键有两个:一个绑定键为blank,另一个绑定键为green

  • 在这种绑定情况下,生产者发布消息到exchange上,绑定键为orange的消息会被发布到队列Q1。绑定键为blank和green的消息会被发布到队列Q2,其他消息类型的消息将被丢弃。


2、多重绑定



  • 当然如果exchange的绑定类型是direct,但是它绑定的多个队列的key如果都相同,在这种情况下虽然绑定类型是direct但是她表现的就和fanout有点类似了。就跟广播差不多,如上图所示。


3、实战


  • 生产者代码

import pika
credentials = pika.PlainCredentials(username='root', password='root')
cOnnection= pika.BlockingConnection(pika.ConnectionParameters(
host='47.94.132.145',
virtual_host='/',
port=5672,
credentials=credentials
))
channel = connection.channel()
# 声明一个名为logs2类型为direct的交换机
channel.exchange_declare(exchange='logs2',
exchange_type='direct') # direct:关键字模式参数
message = b"info: Hello World"
# 向logs2交换机插入数据,routing_key设置关键字,谁绑定了关键字谁就可以收到
channel.basic_publish(
exchange='logs2',
routing_key='info',
body=message
)
print("[x] send %r" %message)
connection.close()


  • 消费着代码1:

import pika
credentials = pika.PlainCredentials(username='root', password='root')
cOnnection= pika.BlockingConnection(pika.ConnectionParameters(
host='47.94.132.145',
virtual_host='/',
port=5672,
credentials=credentials
))
channel = connection.channel()
# 声明一个名为logs2类型为direct的交换机
channel.exchange_declare(
exchange='logs2',
exchange_type='direct'
)
# 创建队列
result = channel.queue_declare("", exclusive=True)
queue_name = result.method.queue
# 将队列绑定到交换机上, routing_key绑定关键字
# 绑定3个关键字;注意一个queue_bind只能绑定一个关键字
channel.queue_bind(
exchange='logs2',
queue=queue_name,
routing_key='error'
)
channel.queue_bind(
exchange='logs2',
queue=queue_name,
routing_key='info'
)
channel.queue_bind(
exchange='logs2',
queue=queue_name,
routing_key='warning'
)
# 确定回调函数
def callback(ch, method, properties, body):
print("[x] Received %r" % body)
ch.basic_ack(delivery_tag=method.delivery_tag)
# 确定监听队列参数
channel.basic_consume(
queue=queue_name, # 队列
auto_ack=False, # 手动应答
on_message_callback=callback # 回调函数
)
print("[*] waiting for message. to exit press CTRL+C")
# 正式监听
channel.start_consuming()


  • 消费者代码2:

import pika
credentials = pika.PlainCredentials(username='root', password='root')
cOnnection= pika.BlockingConnection(pika.ConnectionParameters(
host='47.94.132.145',
virtual_host='/',
port=5672,
credentials=credentials
))
channel = connection.channel()
# 声明一个名为logs2类型为direct的交换机
channel.exchange_declare(
exchange='logs2',
exchange_type='direct'
)
# 创建队列
result = channel.queue_declare("", exclusive=True)
queue_name = result.method.queue
# 将队列绑定到交换机上, routing_key绑定关键字
# 绑定3个关键字;注意一个queue_bind只能绑定一个关键字
channel.queue_bind(
exchange='logs2',
queue=queue_name,
routing_key='error'
)
# 确定回调函数
def callback(ch, method, properties, body):
print("[x] Received %r" % body)
ch.basic_ack(delivery_tag=method.delivery_tag)
# 确定监听队列参数
channel.basic_consume(
queue=queue_name, # 队列
auto_ack=False, # 手动应答
on_message_callback=callback # 回调函数
)
print("[*] waiting for message. to exit press CTRL+C")
# 正式监听
channel.start_consuming()


推荐阅读
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 006_Redis的List数据类型
    1.List类型是一个链表结构的集合,主要功能有push,pop,获取元素等。List类型是一个双端链表的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除元素,List的设 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
author-avatar
zc43pml
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有