ZeroMQ - 傳輸協議



ZeroMQ 中的傳輸協議稱為 ZeroMQ 訊息傳輸協議 (ZMTP)。它是一個傳輸層協議,用於在兩個主機之間透過已連線的傳輸層(如傳輸控制協議 (TCP))交換訊息。

TCP 是網際網路協議套件中的主要協議,通常稱為 TCP/IP。TCP 允許我們使用兩個主機或裝置進行連線和交換資料流。
transport protocol

以下是 ZMTP 的一些關鍵特性

  • 安全性:ZMTP 支援可擴充套件的安全機制。對等體透過交換資料並保持或關閉連線來協商安全機制和版本。
  • 向後相容性:ZMTP 定義了向後相容性的規則。
  • 命令和訊息幀:ZMTP 定義了命令和訊息幀的規則。
  • 連線元資料:ZMTP 定義了連線元資料的規則。

ZeroMQ 支援多種傳輸協議來管理端點之間的訊息交換。以下是 ZeroMQ 中使用的主要傳輸協議

TCP(傳輸控制協議)

它是最可靠的面向連線的協議,可確保所有訊息按正確的順序傳遞,不會重複。當程序透過網路進行通訊時,通常使用此協議,無論是在同一臺機器上還是在不同的機器上。

繫結示例(伺服器)

// Bind to all available network interfaces on port 5555
socket.bind("tcp://*:5555")

連線示例(客戶端)

// Connect to a remote server on the specified IP and port
socket.connect("tcp://192.168.0.1:5555")

優勢

以下是 ZeroMQ 中使用 TCP 的優勢:

  • 它在所有平臺和裝置上得到廣泛支援。
  • 它具有可靠的訊息傳遞功能。
  • 它確保訊息按順序接收。

劣勢

以下是 ZeroMQ 中使用 TCP 的劣勢:

  • 與其他協議(如程序間通訊 (IPC))相比,它的延遲更高。
  • 它還會因錯誤檢查、流量控制和確認資料包而產生更多開銷。

IPC(程序間通訊)

IPC 允許同一臺機器上的不同程序之間進行通訊。它優於 TCP,因為它透過在作業系統級別直接執行來避免網路堆疊開銷。

繫結示例(伺服器)

// Bind to a local file-based endpoint
socket.bind("ipc:///tmp/zeromq-ipc")

連線示例(客戶端)

// Connect to a local endpoint on the same machine
socket.connect("ipc:///tmp/zeromq-ipc")

優勢

以下是 ZeroMQ 中使用 IPC 的優勢:

  • 它比基於網路的協議(如 TCP)快得多。
  • 由於它在同一臺機器上工作,因此沒有網路延遲。
  • 它非常適合同一應用程式中不同程序之間的通訊,或同一伺服器上的微服務之間的通訊。

劣勢

以下是 ZeroMQ 中使用 IPC 的劣勢:

  • 它僅限於同一臺機器上的程序之間的通訊。
  • 它不能用於不同機器之間的通訊

Inproc(程序內)

Inproc 用於同一程序內的執行緒之間的通訊。它是速度最快的 ZeroMQ 傳輸,因為它避免了程序間通訊,僅依賴於同一應用程式內的記憶體傳輸。

繫結示例(執行緒 1)

// Bind to an in-process endpoint
socket.bind("inproc://some-endpoint")

連線示例(執行緒 2)

// Connect to the in-process endpoint from another thread
socket.connect("inproc://some-endpoint")

優勢

以下是 ZeroMQ 中使用 Inproc 的優勢:

  • 它是速度最快的傳輸,因為它不涉及任何網路或程序限制。
  • 它支援同一應用程式內執行緒之間的通訊。

劣勢

以下是 ZeroMQ 中使用 Inproc 的劣勢:

  • 它不適用於不同程序之間的通訊或跨網路的通訊。
  • 它僅限於單個程序內的執行緒間通訊。

PGM/EPGM

PGM/EPGM(實用通用多播/封裝實用通用多播)用於需要可靠多播傳遞的應用程式,例如即時資料傳遞或即時流媒體。這些協議支援多播通訊,其中傳送方同時向多個接收方傳送訊息。

  • PGM:這是本機多播,需要網路層支援。並非所有網路基礎設施都提供它。

  • EPGM:ZeroMQ 將 PGM 封裝在 UDP 上(封裝),允許多播在不直接支援 PGM 的網路上工作。

繫結示例(伺服器)

// Bind to a multicast address and port
socket.bind("epgm://eth0;239.192.1.1:5555")

連線示例(客戶端)

// Connect to the multi-cast group
socket.connect("epgm://239.192.1.1:5555")

優勢

以下是 ZeroMQ 中使用 PGM/EPGM 的優勢:

  • 對於一條訊息需要到達多個客戶端(例如,股票行情更新、即時體育比分)的場景,它非常有效。
  • 它透過向多個訂閱者傳送一條訊息來最大限度地減少網路頻寬。

劣勢

以下是 ZeroMQ 中使用 PGM/EPGM 的劣勢:

  • 它比基於單播的協議(如 TCP)更復雜。
  • PGM 的支援範圍不廣,可能需要特殊的網路配置。

UDP(使用者資料報協議)

UDP 是一種無連線且不可靠的協議,它可能比 TCP 快,但不能保證訊息傳遞或排序。雖然 ZeroMQ 不直接支援原始 UDP 作為傳輸(不像 TCP),但可以透過 PGM 或其他協議間接使用它。

TIPC(透明程序間通訊)

TIPC 是一種傳輸協議,旨在在叢集中的節點之間進行高效通訊。它存在於 Linux 作業系統中,並且針對機器叢集內的高速程序間通訊進行了最佳化。

繫結示例(伺服器)

// Bind to a TIPC service and instance
socket.bind("tipc://{service,instance}")

連線示例(客戶端)

// Connect to a TIPC service on the cluster
socket.connect("tipc://{service,instance}")

優勢

UDP 適用於叢集環境中的通訊和高速傳輸設計,尤其適用於 Linux 叢集。

劣勢

以下是 ZeroMQ 中使用 UDP 的劣勢:

  • 它僅限於支援 TIPC 的 Linux 環境。
  • 它可能需要額外的網路設定才能有效使用。

總之,每種協議都有其優缺點,您的選擇將取決於系統的架構、效能要求以及應用程式處理的環境。

廣告