You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现ZMQ接收端从多连接中获取各服务器最新消息?

ZMQ接收多服务器最新消息实现方案

你的需求完全可以用ZMQ实现,无需更换技术,下面分两种场景给出具体实现方法:

场景1:只保留所有服务器发来的最新一条消息

不管哪个服务器发消息,接收端只留存最后到达的那一条,旧消息直接丢弃,适合不需要区分服务器的场景。

实现步骤

  • 选择套接字类型:接收端用SUB(需订阅过滤时)或PULL(无需过滤时),这两种类型都支持同时连接多个发送端。
  • 启用ZMQ_CONFLATE选项:这个选项会让套接字自动丢弃旧消息,只保留最新的一条。注意如果用SUB套接字,必须先设置订阅规则,再开启该选项。

代码示例(Python pyzmq)

import zmq

# 创建上下文和套接字
context = zmq.Context()
receiver = context.socket(zmq.SUB)  # 换成zmq.PULL即可适配无过滤场景

# SUB模式下先设置订阅(空字符串表示接收所有消息)
receiver.setsockopt(zmq.SUBSCRIBE, b"")
# 开启CONFLATE选项,仅保留最新消息
receiver.setsockopt(zmq.CONFLATE, 1)

# 连接多个服务器
receiver.connect("tcp://server1:5555")
receiver.connect("tcp://server2:5556")
receiver.connect("tcp://server3:5557")

# 持续接收最新消息
while True:
    msg = receiver.recv()
    print(f"收到最新消息: {msg.decode()}")

场景2:为每个服务器单独保留最新消息

需要区分不同服务器,每个服务器的消息都留存最新的一条,适合要分别追踪各服务器状态的场景。

实现步骤

  • 不启用ZMQ_CONFLATE,接收所有消息;
  • 让每个服务器发送的消息带上唯一标识(比如服务器ID);
  • 接收端维护一个字典,用服务器ID作为键,每次收到消息就更新对应键的最新值。

代码示例(Python pyzmq)

import zmq

context = zmq.Context()
receiver = context.socket(zmq.SUB)
receiver.setsockopt(zmq.SUBSCRIBE, b"")

# 连接多个服务器
receiver.connect("tcp://server1:5555")
receiver.connect("tcp://server2:5556")

# 存储每个服务器的最新消息
server_latest = {}

while True:
    # 假设消息格式为「服务器ID:内容」
    msg = receiver.recv().decode()
    server_id, content = msg.split(":", 1)
    # 更新对应服务器的最新消息
    server_latest[server_id] = content

    # 按需输出所有服务器的最新状态
    print("=== 各服务器最新消息 ===")
    for sid, cnt in server_latest.items():
        print(f"{sid}: {cnt}")

注意事项

  • 不同编程语言的ZMQ绑定语法略有差异,但ZMQ_CONFLATE选项的功能是统一的,可参考对应语言的官方文档调用;
  • 如果用PUSH/PULL模式,发送端用PUSH套接字即可,无需额外配置。

内容的提问来源于stack exchange,提问作者Adam Polak Moetsi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 09:40:42