ZeroMQ Sockets介紹及應用示例

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…