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

【socket] 发布与订阅

上面代码应该怎么执行呢?
zmq.XPUB是 ZeroMQ 中用于发布-订阅模式的一种套接字类型,它是标准PUB套接字的扩展。与PUB只能单向发送数据不同,XPUB可以接收来自订阅者的订阅和取消订阅消息,从而让发布者了解当前有哪些主题被订阅。这使得我们可以构建更智能的发布者或实现消息代理(broker)。

主要用途

  • 构建代理(Proxy):与XSUB套接字配合,形成代理节点,实现消息转发和过滤。
  • 动态感知订阅:发布者可以知道哪些主题正在被订阅,从而按需发送数据(例如只发送有订阅者的主题)。
  • 监控与统计:可以统计订阅者数量、主题热度等。

基本用法

XPUB套接字的使用与PUB类似,但增加了一个接收订阅事件的能力。订阅事件以消息的形式到达,消息的第一个字节表示操作类型:

  • 1:订阅(subscription)
  • 0:取消订阅(unsubscription)

后续字节为主题内容。

关键选项

  • ZMQ_XPUB_VERBOSE:默认情况下,XPUB只会报告新的订阅(第一次订阅某个主题),而不会报告重复订阅。设置此选项后,每次收到订阅消息都会报告(包括重复订阅)。
  • ZMQ_XPUB_MANUAL:启用手动确认模式,发布者需要自己维护订阅关系,适用于高级场景。

代码示例(Python)

下面是一个简单的 Python 示例,展示XPUB如何接收订阅事件,并发送数据。

importzmqimporttime# 创建上下文context=zmq.Context()# 创建 XPUB 套接字(发布端)xpub=context.socket(zmq.XPUB)xpub.bind("tcp://*:5555")# 设置选项:接收所有订阅事件(包括重复订阅)xpub.setsockopt(zmq.XPUB_VERBOSE,True)# 创建一个轮询器,同时监控 XPUB 的可读事件(订阅事件)和标准输入(可选)poller=zmq.Poller()poller.register(xpub,zmq.POLLIN)print("XPUB 发布者已启动,等待订阅事件...")# 主循环whileTrue:socks=dict(poller.poll(100))# 100ms 超时ifxpubinsocksandsocks[xpub]==zmq.POLLIN:# 收到订阅事件event=xpub.recv()# 第一个字节:b'\x01' 表示订阅,b'\x00' 表示取消订阅ifevent[0]==1:topic=event[1:].decode('utf-8')print(f"新订阅主题:{topic}")elifevent[0]==0:topic=event[1:].decode('utf-8')print(f"取消订阅主题:{topic}")# 定期发送消息(例如每秒一次)# 在实际应用中,可以根据订阅情况决定发送哪些主题time.sleep(1)xpub.send_multipart([b"news",b"Hello, subscribers!"])

对应的订阅端(SUB)

订阅端可以使用普通的SUB套接字连接到XPUB,并发送订阅请求:

importzmq context=zmq.Context()sub=context.socket(zmq.SUB)sub.connect("tcp://localhost:5555")sub.setsockopt_string(zmq.SUBSCRIBE,"news")# 订阅 "news" 主题whileTrue:topic,msg=sub.recv_multipart()print(f"收到 [{topic.decode()}]:{msg.decode()}")

当订阅端启动时,XPUB会收到一个订阅事件(第一个字节为b'\x01',主题为"news")。如果订阅端关闭或修改订阅,也会收到相应事件。

常见问题

  1. XPUB 能否直接与 SUB 通信?
    可以。SUB套接字发送的订阅消息会被XPUB接收,而PUB则不会接收任何消息。

  2. 如何知道当前所有订阅?
    XPUB本身不维护订阅列表,需要用户自己根据收到的事件动态记录。可以使用ZMQ_XPUB_MANUAL选项手动管理。

  3. 性能影响
    接收订阅事件会增加一些开销,但对于大多数应用来说可以忽略。如果订阅者数量巨大,可以考虑使用代理模式。

总结

zmq.XPUB是一个功能强大的套接字类型,它让发布者“看见”订阅者,从而可以实现更灵活的消息分发逻辑。通过结合XSUBzmq.proxy函数,可以轻松构建高性能的消息代理。希望以上内容能帮助你理解和使用XPUB

http://www.jsqmd.com/news/433210/

相关文章:

  • KISSABC官方购买与服务指南 - 品牌企业推荐师(官方)
  • Linux 6.19 内核发布:开发者活跃度创纪录,谁在驱动这台全球最大的开源引擎?
  • 豆包多行业广告推广方案,豆包AI服务商联系方式 - 品牌2026
  • word公式编辑
  • Linux 内核 7.0 撤回重磅补丁:一场关于 Rust 模式、C 语言限制与“瞬态设备”的社区大论战
  • N340迪可橡皮布定制评测:2026年服务与性价比考察,蓝色溶剂墨盒/半寸墨盒/427迪可橡皮布,迪可橡皮布厂商口碑排行 - 品牌推荐师
  • mysql核心知识清单
  • AI Agent在智能浴缸中的水疗养生定制系统
  • 2026城固装修公司排名权威测评|城固哪家装修公司靠谱?高性价比透明装修首选金匠装饰 - 一个呆呆
  • FAST-LIVO2 快速总结
  • 9oz线路板评测 哪家厚铜板不发热
  • pcb盲埋孔厂家排名 树脂塞孔工艺评测
  • 2026年耐候胶五大厂家排名及解析 - 十大品牌榜
  • 数据挖掘在大数据领域的风险管理应用
  • 透明PCB打样评测 哪家工艺最值得选
  • PCB金手指工艺揭秘 为何插拔万次仍接触良好
  • 高频混压HDI排行榜,2026最新评测
  • LoRA微调:用0.1%参数成本,让大模型秒变领域专家!中小企业必备AI降本秘籍!
  • 大模型保姆级学习路线+避坑指南,非常详细!小白转行大模型,年薪70W+!
  • 实战还原 V8 bytenode 保护 JS(V8 字节码分析记录)
  • APQP 数字化新标杆,研发项目管理软件系统重构研发质量管控——全星研发项目管理 APQP 软件系统
  • 11-ORM-建表
  • 2026算法备案|新手必看!零驳回实操指南,小白也能轻松过✨
  • DeepSeek V4震撼曝光!绕过英伟达,国产芯片厂商优先适配,AI新生态即将诞生!
  • 驱动高端智造:全星QMS——汽车电子与半导体行业的质量数字化引擎
  • 普通人如何抓住风口!转行AI大模型,收入暴涨10倍+,2026年你要悄悄努力然后惊艳所有人
  • 10-依赖注入
  • LangChain vs LangGraph vs LlamaIndex:Agent开发框架选型真相,深度解析与实战策略!
  • 定制N340迪可橡皮布,2026年这些厂家值得选,UV黑墨盒/FUNAI墨盒/998凤凰橡皮布,迪可橡皮布批发口碑排行 - 品牌推荐师
  • MySQL学习日记——DAY02