1. 概念解释

ZeroMQ Sockets提供了一种类标准套接字(socket-like)的 API,是消息导向的通信机制,基于 TCP/UDP 等传输层协议,但封装了底层细节(如连接管理、消息路由、缓冲区等),提供高级抽象。其核心是 消息队列 模型,支持多种通信模式(如请求-响应、发布-订阅等)。

1.1 不同模式:

  • 消息导向 :与 TCP 的字节流不同,ZeroMQ sockets 传输的是离散的消息(message),类似 UDP,但可靠性更高。每条消息包含长度和二进制数据 。
  • 异步抽象 :底层实现为异步消息队列,自动处理连接、重试、缓冲等复杂逻辑,用户无需手动管理 。
  • 模式支持 :通过不同的 socket 类型定义通信模式(如请求-响应、发布-订阅等)和消息路由规则 。

提供了多种 socket 类型以支持不同通信模式,

1.2 不同 Socket 类型:

  • REQ/REP :请求-响应模式,客户端(REQ)发送请求,服务端(REP)响应,严格同步,用于高可靠性通信 。
  • PUB/SUB :发布-订阅模式,PUB 发送消息,SUB 过滤并接收特定主题的消息,用于实时数据流 。
  • PUSH/PULL :用于任务分发(PUSH)和结果收集(PULL),常用于流水线架构 ,分布式系统及微服务间通信。
  • ROUTER/DEALER :更灵活的异步模式,ROUTER 根据消息地址路由,DEALER 无状态转发,适合自定义协议 。
  • 其他类型还包括 PAIR(点对点)、XPUB/XSUB(扩展发布/订阅)等,总计 16 种以上 。

1.3 与传统 Socket 对比

  • 简化网络细节 :ZeroMQ 抽象了底层连接管理(如自动重连、多播)、序列化、线程安全等,用户仅需关注消息内容 。
  • 内置模式 :传统 socket 需手动实现通信模式(如 RPC),而 ZeroMQ 直接通过 socket 类型支持常见模式 。
  • 跨语言兼容 :ZeroMQ 支持多种语言绑定(C++, Python, Java 等),便于构建异构系统 。

1.4 与web Socket对比

  • ZeroMQ :适用于 快速构建分布式系统,适合需要高性能、复杂通信模式(如发布-订阅)的分布式系统,隐藏底层细节,提升开发效率 。
  • WebSocket :适用于面向 Web 实时应用,专为 Web 实时通信设计,基于 HTTP 握手,适合浏览器与服务器的双向交互,仅提供全双工通信通道,需上层协议(如自定义消息格式)定义交互规则。

2. 请求-响应模式【REQ/REP】示例

严格同步,一问一答,用于客户端发送请求,服务端同步响应,适用于远程过程调用(RPC)

2.1 服务端

import zmqcontext = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:5555")print("服务器已启动,等待客户端请求...")while True:message = socket.recv_string()print(f"收到客户端请求: {message}")response = f"服务器已收到请求: {message}"socket.send_string(response)print(f"发送响应: {response}")

2.2 客户端

import zmqcontext = zmq.Context()
socket = context.socket(zmq.REQ)
socket.connect("tcp://localhost:5555")msg = "你好";
socket.send_string(msg)
print(f"发送消息: {msg}")response = socket.recv_string()
print(f"收到服务器消息: {response}")

2.3 执行效果

在这里插入图片描述

3. 发布-订阅模式(PUB/SUB)示例

一对多广播,客户端可过滤主题,用于服务端广播消息,客户端订阅特定主题,适用于实时数据推送(如股票行情)

3.1 服务端

import zmq
import timecontext = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://*:5555")print("发布者已启动,开始广播...")while True:topic = "测试主题"data = f"你好,欢迎收听!"    socket.send_string(f"{topic} {data}")time.sleep(1)

3.2 客户端

import zmqcontext = zmq.Context()
socket = context.socket(zmq.SUB)
socket.connect("tcp://localhost:5555")
socket.setsockopt_string(zmq.SUBSCRIBE, "测试主题")print("订阅者已启动,等待消息...")
while True:msg = socket.recv_string()print(f"收到消息: {msg}")

3.3 执行效果

在这里插入图片描述

4. 管道模式(PUSH/PULL)示例

单向任务分发,支持负载均衡,用于服务端分发任务,客户端并行处理,适用于分布式任务队列

4.1 服务端

import zmqcontext = zmq.Context()
socket = context.socket(zmq.PUSH)
socket.bind("tcp://*:5555")print("任务分发器已启动,开始推送任务...")for i in range(10):task = f"任务{i}命令编码"  socket.send_string(task)

4.2 客户端

import zmqcontext = zmq.Context()
socket = context.socket(zmq.PULL)
socket.connect("tcp://localhost:5555")print("客户端已启动,等待指令...")
while True:msg = socket.recv_string()print(f"收到任务: {msg}")

4.3 执行效果

在这里插入图片描述

4.4 服务器(客户端绑定端口)

客户端和服务器对端口的使用可以呼唤,不过,防止服务器未连接到就结束程序,需要增加个延时等待连接成功。

import zmq
import timecontext = zmq.Context()
socket = context.socket(zmq.PUSH)
socket.connect("tcp://localhost:5555")time.sleep(1)  # 等待连接建立
print("任务分发器已启动,开始推送任务...")for i in range(10):task = f"任务{i}命令编码"  socket.send_string(task)

4.5 客户端(客户端绑定端口)

import zmqcontext = zmq.Context()
socket = context.socket(zmq.PULL)
socket.bind("tcp://*:5555")print("客户端已启动,等待指令...")
while True:msg = socket.recv_string()print(f"收到任务: {msg}")

4.6 执行效果(客户端绑定端口)

在这里插入图片描述

4.7 服务器(非阻塞模式监听)

使用 flags=zmq.NOBLOCK 时,若当前无消息可接收,recv_string() 会立即抛出 zmq.Again 异常,而非阻塞等待。
启用 zmq.CONFLATE 后,队列仅保留最新消息。若服务端发送频率过高或客户端处理延迟,可能导致消息被覆盖。

import zmq
import timecontext = zmq.Context()
socket = context.socket(zmq.PUSH)
socket.connect("tcp://localhost:5555")time.sleep(1)  # 等待连接建立
print("任务分发器已启动,开始推送任务...")for i in range(10):task = f"任务{i}命令编码"  socket.send_string(task)

4.8 客户端(非阻塞模式监听)

import zmqcontext = zmq.Context()
socket = context.socket(zmq.PULL)
socket.setsockopt(zmq.CONFLATE, 1)
socket.bind("tcp://*:5555")print("客户端已启动,等待指令...")
while True:try:msg = socket.recv_string(flags=zmq.NOBLOCK)print(f"收到任务: {msg}")except zmq.Again:pass

4.9 执行效果(非阻塞模式监听)

在这里插入图片描述

5. ZeroMQ 常见 setsockopt 选项

选项名称作用层级
ZMQ_CONFLATE当队列满时,仅保留最新消息(覆盖旧消息)。适用于实时数据更新场景(如传感器数据、股票行情)ZeroMQ 自定义层选项
ZMQ_SNDHWM设置发送队列的高水位线(High Water Mark),控制最大未发送消息数。超出后丢弃或阻塞同上
ZMQ_RCVHWM设置接收队列的高水位线,控制最大未处理消息数同上
ZMQ_LINGER控制关闭连接时是否等待未发送/接收的消息。值为 0 表示立即关闭,忽略未处理数据同上
ZMQ_MAXMSGSIZE设置消息的最大大小(字节)。超出此限制的消息会被丢弃同上
ZMQ_IMMEDIATE仅在绑定了地址时才允许连接(REQ/REP 等模式)。避免连接未就绪的服务端同上
ZMQ_ROUTER_RAW启用原始模式,直接读写裸数据(如 HTTP 协议),不使用 ZeroMQ 的帧格式同上
ZMQ_TCP_KEEPALIVE启用 TCP 保活机制,检测连接是否存活同上
ZMQ_IDENTITY设置套接字的唯一标识符(字符串),用于 ROUTER/DEALER 模式下的路由同上
SO_REUSEADDR允许绑定到同一地址和端口,即使该地址/端口处于 TIME_WAIT 状态或被其他套接字占用,避免服务器重启时因端口占用而失败套接字层选项
SO_BROADCAST启用广播功能,允许套接字发送广播消息(UDP 场景),局域网内向所有设备发送数据同上
SO_KEEPALIVE启用 TCP 保活机制,定期检测连接是否存活,自动断开无响应的空闲连接,防止资源泄漏。同上
SO_LINGER控制调用 close() 时的行为,决定是否等待未发送的数据。同上
SO_RCVBUF / SO_SNDBUF设置接收(SO_RCVBUF)和发送(SO_SNDBUF)缓冲区的大小,优化吞吐量或延迟,大缓冲区适合高带宽场景,小缓冲区适合低延迟场景。同上
SO_TIMEOUT设置接收(SO_RCVTIMEO)或发送(SO_SNDTIMEO)操作的超时时间。防止阻塞操作无限期等待,适用于非阻塞模式。同上
TCP_NODELAY禁用 Nagle 算法,强制立即发送小数据包。减少延迟,适用于实时通信(如游戏、聊天)。传输层选项
IP_MULTICAST_TTL设置多播数据包的生存时间(TTL),控制多播范围(如局域网或跨网络)。IP 层选项

6. 环境安装

pip install zmq

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/81947.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/81947.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/81947.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

语音合成之十五 语音合成(TTS)分句生成拼接时的响度一致性问题:现状、成因与对策

语音合成(TTS)分句生成拼接时的响度一致性问题:现状、成因与对策 引言:分段式文本转语音中的响度一致性挑战业界对响度差异问题的认知拼接语音片段中响度变化的根本原因分段拼接的固有挑战各片段预测韵律特征的差异文本特征和模型…

Android中Binder驱动作用?

Binder驱动的作用与核心功能 Binder驱动是Android系统中实现进程间通信(IPC)的核心底层组件,它工作于Linux内核层,负责管理跨进程通信的建立、数据传输、资源同步等关键任务。以下是其核心作用及实现细节: 1. ​​进程…

网络学习-TCP协议(七)

一、TCP协议 TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。 1、三次握手 客户端: 1、先发起连接,发送SYN置1,seqnum12345(随机值)----半连接…

【Python 基础与实战】从基础语法到项目应用的全流程解析

(1)列表和元组的区别是什么?如何从列表创建元组?如何从元组创建列表? 列表和元组的区别: 可变性:列表是可变的,即可以对列表进行元素的增、删、改操作。例如,可以使用append()方法添加元素,r…

Docker部署Zookeeper集群

简介 ZooKeeper 是一个开源的分布式协调服务,由 Apache 软件基金会开发和维护。它主要用于管理和协调分布式系统中的多个节点,以解决分布式环境下的常见问题,如配置管理、服务发现、分布式锁等。ZooKeeper 提供了一种可靠的机制,…

【学习笔记】Sophus (Python) 使用文档

以下是一份针对 Sophus 库的 Python 使用文档,涵盖基础概念、安装方法、核心功能及代码示例。内容围绕 SO3(3D旋转群)和 SE3(3D刚体变换群)展开,适合机器人学、SLAM、三维几何等领域。 Sophus (Python) 使用…

计算机图形学:(三)MVP变换扩展

Three.js WebGL允许把JavaScript和OpenGL 结合在一起运用,但使用WebGL原生的API来写3D程序非常的复杂,同时需要相对较多的数学知识,对于前端开发者来说学习成本非常高。 Three.js是基于webGL的封装的一个易于使用且轻量级的3D库,T…

MySQL数据库操作合集

一、SQL通用语法 ①SQL语句可以单行或多行书写,以分号结尾。 ②SQL语句可以使用空格/缩进来增强语句可读性。 ③MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。 ④注释: 单行注释: -- 注释内容 或 # 注释内容&#…

传统工程项目管理与业财一体化管理的区别?

在工程项目管理领域,传统管理模式与新兴的业财一体化管理模式正在形成鲜明对比。随着数字化转型的加速,工程行业对高效、透明、协同的管理需求日益迫切。传统工程项目管理依赖人工操作、分散系统和分模块管理,难以应对复杂项目的全生命周期需…

敦煌网测评从环境搭建到风控应对,精细化运营打造安全测评体系

自养号测评,抢占流量为快速提升产品权重和销量,很多卖家常采用自己养号补单测评的方式,技术搭建需要很多要素 一、硬件参数的关联性 在我们使用设备进行注册或操作账号的过程中,系统会记录下大量的系统与网络参数,其中…

redis Pub/Sub 简介 -16 (PUBLISH、SUBSCRIBE、PSUBSCRIBE)

Redis Pub/Sub 简介:PUBLISH、SUBSCRIBE、PSUBSCRIBE Redis Pub/Sub 是一种强大的消息传递范例,可在应用程序的不同部分之间实现实时通信。它是构建可扩展和响应式系统的基石,允许组件在没有直接依赖的情况下进行交互。本章将全面介绍 Redis…

JavaSE核心知识点03高级特性03-01(集合框架)

🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 JavaSE核心知识点03高级特性03-01&#xff0…

日志分析-IIS日志分析

环境准备 https://xj.edisec.net/challenges/115 题目要求 windows系统中才有的IIS服务 既然是windows平台,当然需要rdp登录,在ssh登录失败 解题过程 phpstudy--2018站点日志.(.log文件)所在路径,提供绝对路径 Windows服务的日志一般有固定…

一、web安全基础入门

1、Windows命令 文件和目录操作 dir:列出当前目录下的文件和子目录。cd:切换目录,例如 cd C:\Users 切换到C盘的Users目录。md 或 mkdir:创建新目录,如 md testdir。rd 或 rmdir:删除空目录,例…

动态规划应用场景 + 代表题目清单(模板加上套路加上题单)

1. 序列型DP(Sequence DP) ✅ 应用场景 单个或多个序列(数组/字符串),求最优子结构。 常见问题:最长递增子序列、最长公共子序列、回文子序列。 🧠 套路总结 单序列:dp[i] max(…

Linux iSCSI存储共享实验指南

实验介绍 1、在Linux平台上通过iSCSI协议实现IP-SAN存储共享 2、掌握存储导出(export)和存储导入(import)的配置方法 3、学习iSCSI存储的发现、连接、断开和管理操作 1、实验环境 两台同网段的Linux虚拟机(无需物理交换机) 操作系统:Lin…

从 Docker 到 runC

从 Docker 到 runC:容器底层原理详解 目录 1. Docker 与 runC 的关系 2. Docker 的核心组件 3. runC 的核心功能 4. 实战示例:从 Docker 到 runC 4.1 示例场景:运行一个简单容器 4.2 Docker 底层调用 runC 的流程 4.3 查看 runC 的调用 4.4 直接调用 runC 创建容器 …

使用Python在PowerPoint中插入形状(Shape)

在进行演示文稿设计时,形状(Shape)不仅可以增强视觉效果,还可以用于展示流程图、标注、数据图示等。借助Python,我们可以通过代码快速批量地在PPT中添加各种形状,提升设计效率。本文将介绍如何使用Python向…

Windows系统下MySQL 8.4.5压缩包安装详细教程

一、MySQL 8.4.5新特性概览 相较于旧版本,MySQL 8.4.5在性能与功能上实现了显著提升: 性能优化:官方测试显示,在高并发场景下,其读写性能较5.7版本提升近2倍,尤其在处理热点数据竞争问题时表现更为出色。…

深度解析Vue项目Webpack打包分包策略 从基础配置到高级优化,全面掌握性能优化核心技巧

深度解析Vue项目Webpack打包分包策略 从基础配置到高级优化,全面掌握性能优化核心技巧 一、分包核心价值与基本原理 1.1 为什么需要分包 首屏加载优化:减少主包体积,提升TTI(Time to Interactive)缓存利用率提升&am…