文档

  语言:   库:

Socket API

Socket 是网络编程事实上的标准 API。这就是 ZeroMQ 提供熟悉的基于 socket 的 API 的原因。让 ZeroMQ 对开发者特别有用的一点是,它使用不同的 socket 类型来实现任何任意的消息模式。此外,ZeroMQ socket 在底层网络协议之上提供了一个清晰的抽象,它隐藏了这些协议的复杂性,并且使得它们之间的切换变得非常容易。

与传统 Socket 的主要区别

一般来说,传统 socket 为面向连接的可靠字节流(SOCK_STREAM)或无连接的不可靠数据报(SOCK_DGRAM)提供了同步接口。相比之下,ZeroMQ socket 提供了一个异步消息队列的抽象,其确切的排队语义取决于使用的 socket 类型。传统 socket 传输字节流或离散数据报,而 ZeroMQ socket 传输离散消息。

ZeroMQ socket 是异步的,这意味着物理连接的建立和拆除、重连以及有效投递的时序对用户是透明的,并由 ZeroMQ 本身负责组织。此外,如果对等方无法接收消息,消息可能会被排队。

传统 socket 只允许严格的一对一(两个对等方)、多对一(多个客户端,一个服务器),或在某些情况下的一对多(组播)关系。除了 PAIR socket 外,ZeroMQ socket 可以连接到多个端点,同时接受绑定到该 socket 的多个端点的入站连接,从而允许多对多关系。

Socket 生命周期

ZeroMQ socket 的生命周期分为四个部分,就像 BSD socket 一样

  • 创建和销毁 socket,它们共同构成了 socket 生命的轮回

  • 通过设置选项来配置 socket,并在必要时检查它们

  • 通过创建进出 ZeroMQ 连接,将 socket 插入网络拓扑

  • 通过在 socket 上写入和接收消息来使用它们传输数据

Bind 与 Connect 的区别

对于 ZeroMQ socket,谁 bind 谁 connect 并不重要。在上面你可能注意到服务器使用了 Bind,而客户端使用了 Connect。为什么会这样,它们有什么区别?

ZeroMQ 为每个底层连接创建队列。如果你的 socket 连接到三个对等 socket,那么后台就有三个消息队列。

使用 Bind,你允许对等方连接到你,因此你不知道将来会有多少对等方,也无法预先创建队列。相反,队列是在各个对等方连接到绑定 socket 时创建的。

使用 Connect,ZeroMQ 知道至少会有一个对等方,因此它可以立即创建一个队列。这适用于所有 socket 类型,除了 ROUTER,后者只有在我们连接的对等方确认我们的连接后才创建队列。

因此,当向没有对等方的绑定 socket 或没有活动连接的 ROUTER 发送消息时,没有队列可以存储该消息。

何时使用 bind,何时使用 connect?

一般规则是,在你架构中最稳定的点上使用 bind,在具有易变端点的动态组件上使用 connect。对于请求/应答模式,服务提供者可能是你 bind 的地方,而客户端则使用 connect。就像传统的 TCP 一样。

如果你无法确定哪些部分更稳定(例如点对点),可以考虑一个中间的稳定设备,所有方都可以连接到它。

你可以在 ZeroMQ FAQ 的“Why do I see different behavior when I bind a socket versus connect a socket?”部分阅读更多相关信息。

高水位标记

高水位标记是 ZeroMQ 为指定 socket 通信的任何单个对等方在内存中排队的消息数量上限硬限制。

如果达到此限制,socket 将进入异常状态,并且 ZeroMQ 将根据 socket 类型采取适当的操作,例如阻塞或丢弃发送的消息。有关每种 socket 类型采取的确切操作的详细信息,请参阅下面的各个 socket 说明。

消息模式

ZeroMQ socket API 朴实包装之下是消息模式的世界。ZeroMQ 模式由匹配类型的 socket 对实现。

内置的核心 ZeroMQ 模式有

  • 请求-应答,它将一组客户端连接到一组服务。这是一种远程过程调用和任务分发模式。

  • 发布-订阅,它将一组发布者连接到一组订阅者。这是一种数据分发模式。

  • 流水线,它将节点连接成一个可以有多个步骤和循环的扇出/扇入模式。这是一种并行任务分发和收集模式。

  • 独占对,它独占地连接两个 socket。这是一种用于在进程内连接两个线程的模式,不要与“普通”的 socket 对混淆。

还有更多仍处于草稿状态的 ZeroMQ 模式

  • 客户端-服务器,它允许一个 ZeroMQ server 与一个或多个 ZeroMQ client 通信。客户端总是启动对话,之后任一对等方都可以异步地向对方发送消息。

  • Radio-dish,用于将数据从单个发布者以扇出方式一对多分发给多个订阅者。

请求-应答模式

请求-应答模式适用于各种服务导向架构。它有两种基本形式:同步(REQREP socket 类型)和异步 socket 类型(DEALERROUTER socket 类型),可以以各种方式混合使用。

请求-应答模式由 RFC 28/REQREP 正式定义。

REQ socket

客户端使用 REQ socket 向服务发送请求并接收应答。此 socket 类型只允许交替顺序的发送和随后的接收调用。一个 REQ socket 可以连接到任意数量的 REPROUTER socket。发送的每个请求在所有连接的服务中进行轮询,接收到的每个应答与最后发出的请求匹配。它设计用于简单的请求-应答模型,其中对故障对等方的可靠性不是问题。

如果没有可用的服务,那么 socket 上的任何发送操作将阻塞,直到至少有一个服务可用。REQ socket 不会丢弃任何消息。

特点总结

兼容对等 Socket REP, ROUTER
方向 双向
发送/接收模式 发送, 接收, 发送, 接收, …
出站路由策略 轮询
入站路由策略 最后连接的对等方
静默状态下的行为 阻塞

REP socket

服务使用 REP socket 接收来自客户端的请求并发送应答。此 socket 类型只允许交替顺序的接收和随后的发送调用。接收到的每个请求都从所有客户端中公平地排队,发送的每个应答都被路由到发出最后请求的客户端。如果原始请求者不再存在,应答会被静默丢弃。

特点总结

兼容对等 Socket REQ, DEALER
方向 双向
发送/接收模式 接收, 发送, 接收, 发送 …
出站路由策略 公平轮询
入站路由策略 最后连接的对等方

DEALER socket

DEALER socket 类型与一组匿名对等方通信,使用轮询算法发送和接收消息。它是可靠的,因为它不丢弃消息。DEALER 作为 REQ 的异步替代,用于与 REPROUTER 服务器通信的客户端。DEALER 接收到的消息是从所有连接的对等方中公平排队的。

当一个 DEALER socket 由于达到所有对等方的高水位标记而进入静默状态,或者根本没有对等方时,socket 上的任何发送操作将阻塞,直到静默状态结束或至少有一个对等方变得可用于发送;消息不会被丢弃。

当一个 DEALER socket 连接到 REP socket 时,发送的消息必须包含一个空帧作为消息的第一部分(分隔符),后面跟着一个或多个主体部分。

特点总结

兼容对等 Socket ROUTER, REP, DEALER
方向 双向
发送/接收模式 无限制
出站路由策略 轮询
入站路由策略 公平队列
静默状态下的行为 阻塞

ROUTER socket

ROUTER socket 类型与一组对等方通信,使用显式寻址,使得每条出站消息发送到特定的对等连接。ROUTER 作为 REP 的异步替代,并且经常用作与 DEALER 客户端通信的服务器的基础。

当接收消息时,ROUTER socket 会在将消息传递给应用程序之前,在消息前面附加一个包含原始对等方路由 ID 的消息部分。接收到的消息从所有连接的对等方中公平排队。当发送消息时,ROUTER socket 会移除消息的第一部分,并使用它来确定消息将路由到的对等方的路由 ID。如果对等方不再存在,或者从未存在,消息将被静默丢弃。

当一个 ROUTER socket 由于达到所有对等方的高水位标记而进入静默状态时,任何发送到该 socket 的消息都将被丢弃,直到静默状态结束。同样,任何路由到达到其单独高水位标记的对等方的消息也将被丢弃。

当一个 REQ socket 连接到 ROUTER socket 时,除了原始对等方的路由 ID 外,接收到的每条消息都应包含一个空分隔符消息部分。因此,应用程序看到的每个接收到的消息的完整结构变为:一个或多个路由 ID 部分、分隔符部分、一个或多个主体部分。当向 REQ socket 发送应答时,应用程序必须包含分隔符部分。

特点总结

兼容对等 Socket DEALER, REQ, ROUTER
方向 双向
发送/接收模式 无限制
出站路由策略 见正文
入站路由策略 公平队列
静默状态下的行为 丢弃 (见正文)

发布-订阅模式

发布-订阅模式用于将数据从单个发布者以扇出方式一对多分发给多个订阅者。

发布-订阅模式由 RFC 29/PUBSUB 正式定义。

ZeroMQ 通过四种 socket 类型支持发布/订阅

  • PUB Socket 类型
  • XPUB Socket 类型
  • SUB Socket 类型
  • XSUB Socket 类型

主题

ZeroMQ 使用多部分消息来传递主题信息。主题表示为字节数组,但你可以使用字符串和合适的文本编码。

发布者必须在消息的第一帧(在消息载荷之前)包含主题。例如,向 status 主题的订阅者发布状态消息

//  Send a message on the 'status' topic
zmq_send (pub, "status", 6, ZMQ_SNDMORE);
zmq_send (pub, "All is well", 11, 0);
//  Send a message on the 'status' topic
zstr_sendx (pub, "status", "All is well", NULL);
zmqpp 的示例 pubsub_topics_pub 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/cpp/zmqpp
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/pubsub_topics_pub.md
    $example_dir/pubsub_topics_pub.md
//  Send a message on the 'status' topic
#include <string>
#include <iostream>

#include <zmq.hpp>

int main()
{
    // initialize the zmq context with a single IO thread
    zmq::context_t context{1};

    // construct a PUB (publisher) socket and connect to interface
    zmq::socket_t publisher{context, zmq::socket_type::pub};
    publisher.bind("tcp://*:5555");

    // Send a multipart messages forever
    while(true){
        // Each consists of a topic envelope and content
        publisher.send(zmq::str_buffer("status"), zmq::send_flags::sndmore);
        publisher.send(zmq::str_buffer("Message in status"));
    }

    return 0;
}
azmq 的示例 pubsub_topics_pub 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/cpp/azmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/pubsub_topics_pub.md
    $example_dir/pubsub_topics_pub.md
czmqpp 的示例 pubsub_topics_pub 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/cpp/czmqpp
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/pubsub_topics_pub.md
    $example_dir/pubsub_topics_pub.md
fbzmq 的示例 pubsub_topics_pub 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/cpp/fbzmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/pubsub_topics_pub.md
    $example_dir/pubsub_topics_pub.md
//  Send a message on the 'status' topic
pub.SendMoreFrame("status").SendFrame("All is well");
clrzmq4 的示例 pubsub_topics_pub 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/csharp/clrzmq4
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/pubsub_topics_pub.md
    $example_dir/pubsub_topics_pub.md
dartzmq 的示例 pubsub_topics_pub 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/dart/dartzmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/pubsub_topics_pub.md
    $example_dir/pubsub_topics_pub.md
Chumak 的示例 pubsub_topics_pub 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/erlang/chumak
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/pubsub_topics_pub.md
    $example_dir/pubsub_topics_pub.md
ezmq 的示例 pubsub_topics_pub 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/erlang/ezmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/pubsub_topics_pub.md
    $example_dir/pubsub_topics_pub.md
erlang-czmq 的示例 pubsub_topics_pub 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/erlang/erlang-czmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/pubsub_topics_pub.md
    $example_dir/pubsub_topics_pub.md
FsNetMQ 的示例 pubsub_topics_pub 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/fsharp/fsnetmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/pubsub_topics_pub.md
    $example_dir/pubsub_topics_pub.md
fszmq 的示例 pubsub_topics_pub 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/fsharp/fszmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/pubsub_topics_pub.md
    $example_dir/pubsub_topics_pub.md
zmq4 的示例 pubsub_topics_pub 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/go/zmq4
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/pubsub_topics_pub.md
    $example_dir/pubsub_topics_pub.md
goczmq 的示例 pubsub_topics_pub 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/go/goczmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/pubsub_topics_pub.md
    $example_dir/pubsub_topics_pub.md
zeromq4-haskell 的示例 pubsub_topics_pub 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/haskell/zeromq4-haskell
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/pubsub_topics_pub.md
    $example_dir/pubsub_topics_pub.md
//  Send a message on the 'status' topic
pub.sendMore("Status");
pub.send("All is well");
JZMQ 的示例 pubsub_topics_pub 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/java/jzmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/pubsub_topics_pub.md
    $example_dir/pubsub_topics_pub.md
jczmq 的示例 pubsub_topics_pub 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/java/jczmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/pubsub_topics_pub.md
    $example_dir/pubsub_topics_pub.md
//  Send a message on the 'status' topic
pub.send(['status', 'All is well']);
perlzmq 的示例 pubsub_topics_pub 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/perl/perlzmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/pubsub_topics_pub.md
    $example_dir/pubsub_topics_pub.md
import signal
import time
import zmq


signal.signal(signal.SIGINT, signal.SIG_DFL)

context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind('tcp://*:5555')

for i in range(5):
    socket.send(b'status 5')
    socket.send(b'All is well')
    time.sleep(1)
rbzmq 的示例 pubsub_topics_pub 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/ruby/rbzmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/pubsub_topics_pub.md
    $example_dir/pubsub_topics_pub.md
rust-zmq 的示例 pubsub_topics_pub 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/rust/rust-zmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/pubsub_topics_pub.md
    $example_dir/pubsub_topics_pub.md
zzmq 的示例 pubsub_topics_pub 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/zig/zzmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/pubsub_topics_pub.md
    $example_dir/pubsub_topics_pub.md

订阅者通过在订阅者 socket 上设置 ZMQ_SUBSCRIBE 选项来指定他们感兴趣的主题

//  Subscribe to the 'status' topic
zmq_setsockopt (sub, ZMQ_SUBSCRIBE, "status", strlen ("status"));

订阅者通过使用订阅者 socket 调用 zsock_set_subscribe 方法来指定他们感兴趣的主题

//  Subscribe to the 'status'
zsock_set_subscribe(sub, "status");
zmqpp 的示例 pubsub_topics_sub 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/cpp/zmqpp
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/pubsub_topics_sub.md
    $example_dir/pubsub_topics_sub.md

订阅者指定他们感兴趣的主题…

//  Subscribe to the 'status'
#include <string>
#include <iostream>
#include <vector>

#include <zmq.hpp>
#include <zmq_addon.hpp>

int main()
{
    // initialize the zmq context with a single IO thread
    zmq::context_t context{1};

    // construct a SUB (subscriber) socket and connect to interface
    zmq::socket_t subscriber{context, zmq::socket_type::sub};
    subscriber.connect("tcp://localhost:5555");
    
    // set topics you want to sub
    subscriber.set(zmq::sockopt::subscribe, "status");

    while(true){
        // Receive all parts of the message
        std::vector<zmq::message_t> recv_msgs;
        zmq::recv_result_t result =
            zmq::recv_multipart(subscriber, std::back_inserter(recv_msgs));
        assert(result && "recv failed");
        assert(*result == 2);

        std::cout << "Subscriber: [" << recv_msgs[0].to_string() << "] "
                  << recv_msgs[1].to_string() << std::endl;
    }

    return 0;
}
azmq 的示例 pubsub_topics_sub 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/cpp/azmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/pubsub_topics_sub.md
    $example_dir/pubsub_topics_sub.md
czmqpp 的示例 pubsub_topics_sub 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/cpp/czmqpp
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/pubsub_topics_sub.md
    $example_dir/pubsub_topics_sub.md
fbzmq 的示例 pubsub_topics_sub 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/cpp/fbzmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/pubsub_topics_sub.md
    $example_dir/pubsub_topics_sub.md

订阅者通过 SubscriberSocket 的 Subscribe 方法指定他们感兴趣的主题

//  Subscribe to the 'status'
sub.Subscribe("status");
clrzmq4 的示例 pubsub_topics_sub 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/csharp/clrzmq4
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/pubsub_topics_sub.md
    $example_dir/pubsub_topics_sub.md
dartzmq 的示例 pubsub_topics_sub 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/dart/dartzmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/pubsub_topics_sub.md
    $example_dir/pubsub_topics_sub.md
Chumak 的示例 pubsub_topics_sub 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/erlang/chumak
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/pubsub_topics_sub.md
    $example_dir/pubsub_topics_sub.md
ezmq 的示例 pubsub_topics_sub 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/erlang/ezmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/pubsub_topics_sub.md
    $example_dir/pubsub_topics_sub.md
erlang-czmq 的示例 pubsub_topics_sub 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/erlang/erlang-czmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/pubsub_topics_sub.md
    $example_dir/pubsub_topics_sub.md
FsNetMQ 的示例 pubsub_topics_sub 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/fsharp/fsnetmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/pubsub_topics_sub.md
    $example_dir/pubsub_topics_sub.md
fszmq 的示例 pubsub_topics_sub 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/fsharp/fszmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/pubsub_topics_sub.md
    $example_dir/pubsub_topics_sub.md
zmq4 的示例 pubsub_topics_sub 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/go/zmq4
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/pubsub_topics_sub.md
    $example_dir/pubsub_topics_sub.md
goczmq 的示例 pubsub_topics_sub 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/go/goczmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/pubsub_topics_sub.md
    $example_dir/pubsub_topics_sub.md
zeromq4-haskell 的示例 pubsub_topics_sub 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/haskell/zeromq4-haskell
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/pubsub_topics_sub.md
    $example_dir/pubsub_topics_sub.md

订阅者通过 Socket 类的 subscribe 方法指定他们感兴趣的主题

//  Subscribe to the 'status'
sub.subscribe("status");
JZMQ 的示例 pubsub_topics_sub 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/java/jzmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/pubsub_topics_sub.md
    $example_dir/pubsub_topics_sub.md
jczmq 的示例 pubsub_topics_sub 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/java/jczmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/pubsub_topics_sub.md
    $example_dir/pubsub_topics_sub.md

订阅者指定他们感兴趣的主题…

//  Subscribe to the 'status'
sub.subscribe('status');
perlzmq 的示例 pubsub_topics_sub 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/perl/perlzmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/pubsub_topics_sub.md
    $example_dir/pubsub_topics_sub.md

订阅者通过在订阅者 socket 上设置 ZMQ_SUBSCRIBE 选项来指定他们感兴趣的主题

import signal
import zmq


signal.signal(signal.SIGINT, signal.SIG_DFL)

context = zmq.Context()

socket = context.socket(zmq.SUB)
socket.connect('tcp://localhost:5555')
socket.setsockopt(zmq.SUBSCRIBE, b'status')

while True:
    message = socket.recv_multipart()
    print(f'Received: {message}')
rbzmq 的示例 pubsub_topics_sub 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/ruby/rbzmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/pubsub_topics_sub.md
    $example_dir/pubsub_topics_sub.md
rust-zmq 的示例 pubsub_topics_sub 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/rust/rust-zmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/pubsub_topics_sub.md
    $example_dir/pubsub_topics_sub.md
zzmq 的示例 pubsub_topics_sub 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/zig/zzmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/pubsub_topics_sub.md
    $example_dir/pubsub_topics_sub.md

一个订阅者 socket 可以有多个订阅过滤器。

消息的主题与订阅者的订阅主题使用前缀匹配进行比较。

也就是说,订阅了 topic 的订阅者会收到以下主题的消息

  • topic
  • topic/subtopic
  • topical

但是,它不会收到以下主题的消息

  • topi
  • TOPIC(请记住,这是字节级别的比较)

这种前缀匹配行为的一个结果是,你可以通过订阅一个空主题字符串来接收所有已发布的消息。

PUB socket

发布者使用 PUB socket 分发数据。发送的消息以扇出方式分发给所有连接的对等方。此 socket 类型无法接收任何消息。

当一个 PUB socket 由于达到某个订阅者的高水位标记而进入静默状态时,任何本应发送给该订阅者的消息都将被丢弃,直到静默状态结束。此 socket 类型的发送函数永远不会阻塞。

特点总结

兼容对等 Socket SUB, XSUB
方向 单向
发送/接收模式 仅发送
入站路由策略 不适用
出站路由策略 扇出
静默状态下的行为 丢弃

SUB socket

订阅者使用 SUB socket 订阅发布者分发的数据。最初,一个 SUB socket 没有订阅任何消息。此 socket 类型未实现 send 函数。

特点总结

兼容对等 Socket PUB, XPUB
方向 单向
发送/接收模式 仅接收
入站路由策略 公平队列
出站路由策略 不适用

XPUB socket

PUB 相同,不同之处在于你可以以入站消息的形式接收来自对等方的订阅信息。订阅消息是一个字节 1(表示订阅)或字节 0(表示取消订阅),后跟订阅主体。没有订阅/取消订阅前缀的消息也会被接收,但对订阅状态没有影响。

特点总结

兼容对等 Socket ZMQ_SUB, ZMQ_XSUB
方向 单向
发送/接收模式 发送消息,接收订阅
入站路由策略 不适用
出站路由策略 扇出
静默状态下的行为 丢弃

XSUB socket

SUB 相同,不同之处在于你通过向 socket 发送订阅消息来订阅。订阅消息是一个字节 1(表示订阅)或字节 0(表示取消订阅),后跟订阅主体。没有订阅/取消订阅前缀的消息也可以发送,但对订阅状态没有影响。

特点总结

兼容对等 Socket ZMQ_PUB, ZMQ_XPUB
方向 单向
发送/接收模式 接收消息,发送订阅
入站路由策略 公平队列
出站路由策略 不适用
静默状态下的行为 丢弃

流水线模式

流水线模式旨在用于任务分发,通常用于多阶段流水线,其中一个或少数节点将工作推送到许多工人,而这些工人又将结果推送到一个或少数收集器。该模式大部分是可靠的,除非节点意外断开连接,否则不会丢弃消息。它是可扩展的,节点可以在任何时候加入。

流水线模式由 RFC 30/PIPELINE 正式定义。

ZeroMQ 通过两种 socket 类型支持流水线

  • PUSH Socket 类型
  • PULL Socket 类型

PUSH socket

PUSH socket 类型与一组匿名的 PULL 对等方通信,使用轮询算法发送消息。此 socket 类型未实现接收操作。

当一个 PUSH socket 由于达到所有下游节点的高水位标记而进入静默状态,或者根本没有下游节点时,socket 上的任何发送操作将阻塞,直到静默状态结束或至少有一个下游节点变得可用于发送;消息不会被丢弃。

特点总结

兼容对等 Socket PULL
方向 单向
发送/接收模式 仅发送
入站路由策略 不适用
出站路由策略 轮询
静默状态下的行为 阻塞

PULL socket

PULL socket 类型与一组匿名的 PUSH 对等方通信,使用公平队列算法接收消息。

此 socket 类型未实现发送操作。

特点总结

兼容对等 Socket PUSH
方向 单向
发送/接收模式 仅接收
入站路由策略 公平队列
出站路由策略 不适用
静默状态下的行为 阻塞

独占对模式

PAIR 不是通用 socket,而是旨在用于架构稳定的两个对等方的特定用例。这通常将 PAIR 限制在单个进程内使用,用于线程间通信。

独占对模式由 31/EXPAIR 正式定义。

PAIR socket

PAIR 类型的 socket 在任何时候只能连接到一个对等方。发送到 PAIR socket 的消息不会进行消息路由或过滤。

当一个 PAIR socket 由于达到连接对等方的高水位标记而进入静默状态,或者没有对等方连接时,socket 上的任何发送操作将阻塞,直到对等方变得可用于发送;消息不会被丢弃。

虽然 PAIR socket 可以用于 inproc 以外的传输,但它们无法自动重连,加上在任何先前的连接(包括处于关闭状态的连接)存在时,新的入站连接将被终止的事实,使得它们在大多数情况下不适用于 TCP。

客户端-服务器模式

注意:此模式仍处于草稿状态,因此你使用的 ZeroMQ 库可能不支持!

客户端-服务器模式用于允许一个 SERVER 服务器与一个或多个 CLIENT 客户端通信。客户端总是启动对话,之后任一对等方都可以异步地向对方发送消息。

客户端-服务器模式由 RFC 41/CLISRV 正式定义。

CLIENT socket

CLIENT socket 类型与一个或多个 SERVER 对等方通信。如果连接到多个对等方,它会以轮询方式将发送的消息分散到这些对等方。读取时,它会公平地从每个对等方依次读取。它是可靠的,在正常情况下不丢弃消息。

如果 CLIENT socket 已建立连接,发送操作将接受消息,将其排队,并以网络允许的最快速度发送它们。出站缓冲区限制由 socket 的高水位标记定义。如果出站缓冲区已满,或者没有连接的对等方,发送操作将默认阻塞。CLIENT socket 不会丢弃消息。

特点总结

兼容对等 Socket SERVER
方向 双向
发送/接收模式 无限制
出站路由策略 轮询
入站路由策略 公平队列
静默状态下的行为 阻塞

SERVER socket

SERVER socket 类型与零个或多个 CLIENT 对等方通信。每条出站消息都发送到特定的对等 CLIENT。SERVER socket 只能回复入站消息:CLIENT 对等方必须总是启动对话。

每条接收到的消息都有一个 routing_id,它是一个 32 位无符号整数。要向给定的 CLIENT 对等方发送消息,应用程序必须在消息上设置对等方的 routing_id

libzmq 的示例 clisrv 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/c/libzmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/clisrv.md
    $example_dir/clisrv.md
czmq 的示例 clisrv 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/c/czmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/clisrv.md
    $example_dir/clisrv.md
zmqpp 的示例 clisrv 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/cpp/zmqpp
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/clisrv.md
    $example_dir/clisrv.md
cppzmq 的示例 clisrv 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/cpp/cppzmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/clisrv.md
    $example_dir/clisrv.md
azmq 的示例 clisrv 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/cpp/azmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/clisrv.md
    $example_dir/clisrv.md
czmqpp 的示例 clisrv 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/cpp/czmqpp
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/clisrv.md
    $example_dir/clisrv.md
fbzmq 的示例 clisrv 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/cpp/fbzmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/clisrv.md
    $example_dir/clisrv.md
NetMQ 的示例 clisrv 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/csharp/netmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/clisrv.md
    $example_dir/clisrv.md
clrzmq4 的示例 clisrv 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/csharp/clrzmq4
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/clisrv.md
    $example_dir/clisrv.md
dartzmq 的示例 clisrv 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/dart/dartzmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/clisrv.md
    $example_dir/clisrv.md
Chumak 的示例 clisrv 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/erlang/chumak
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/clisrv.md
    $example_dir/clisrv.md
ezmq 的示例 clisrv 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/erlang/ezmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/clisrv.md
    $example_dir/clisrv.md
erlang-czmq 的示例 clisrv 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/erlang/erlang-czmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/clisrv.md
    $example_dir/clisrv.md
FsNetMQ 的示例 clisrv 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/fsharp/fsnetmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/clisrv.md
    $example_dir/clisrv.md
fszmq 的示例 clisrv 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/fsharp/fszmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/clisrv.md
    $example_dir/clisrv.md
zmq4 的示例 clisrv 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/go/zmq4
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/clisrv.md
    $example_dir/clisrv.md
goczmq 的示例 clisrv 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/go/goczmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/clisrv.md
    $example_dir/clisrv.md
zeromq4-haskell 的示例 clisrv 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/haskell/zeromq4-haskell
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/clisrv.md
    $example_dir/clisrv.md
JeroMQ 的示例 clisrv 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/java/jeromq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/clisrv.md
    $example_dir/clisrv.md
JZMQ 的示例 clisrv 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/java/jzmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/clisrv.md
    $example_dir/clisrv.md
jczmq 的示例 clisrv 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/java/jczmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/clisrv.md
    $example_dir/clisrv.md
zeromqjs 的示例 clisrv 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/nodejs/zeromqjs
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/clisrv.md
    $example_dir/clisrv.md
perlzmq 的示例 clisrv 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/perl/perlzmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/clisrv.md
    $example_dir/clisrv.md
Pyzmq 的示例 clisrv 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/python/pyzmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/clisrv.md
    $example_dir/clisrv.md
rbzmq 的示例 clisrv 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/ruby/rbzmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/clisrv.md
    $example_dir/clisrv.md
rust-zmq 的示例 clisrv 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/rust/rust-zmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/clisrv.md
    $example_dir/clisrv.md
zzmq 的示例 clisrv 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/zig/zzmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/clisrv.md
    $example_dir/clisrv.md

如果未指定 routing_id,或它未引用连接的客户端对等方,发送调用将失败。如果客户端对等方的出站缓冲区已满,发送调用将阻塞。SERVER socket 在任何情况下都不会丢弃消息。

特点总结

兼容对等 Socket CLIENT
方向 双向
发送/接收模式 无限制
出站路由策略 见正文
入站路由策略 公平队列
静默状态下的行为 失败

Radio-dish 模式

注意:此模式仍处于草稿状态,因此你使用的 ZeroMQ 库可能不支持!

Radio-dish 模式用于将数据从单个发布者以扇出方式一对多分发给多个订阅者。

Radio-dish 使用群组(group)(而非 Pub-sub 主题),Dish socket 可以加入一个群组,Radio socket 发送的每条消息都属于一个群组。

群组是空终止字符串,长度限制为 255 字节(包括空字符)。每个群组字符必须是一个字节,允许的值为 1-255。

群组使用精确匹配进行匹配(而非 PubSub 的前缀匹配)。

RADIO socket

RADIO socket 用于发布者分发数据。每条消息都属于一个群组。消息分发给群组的所有成员。此 socket 类型未实现接收操作。

libzmq 的示例 raddsh_radio_example 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/c/libzmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_radio_example.md
    $example_dir/raddsh_radio_example.md
czmq 的示例 raddsh_radio_example 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/c/czmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_radio_example.md
    $example_dir/raddsh_radio_example.md
zmqpp 的示例 raddsh_radio_example 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/cpp/zmqpp
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_radio_example.md
    $example_dir/raddsh_radio_example.md
#include <chrono>
#include <cstdlib>
#include <iostream>
#include <string>
#include <thread>
#include <zmq.hpp>

int main() {
  // Initialize the zmq context with a single IO thread
  zmq::context_t context{1};

  // Construct a Radio socket and connect to interface.
  zmq::socket_t radio{context, zmq::socket_type::radio};
  radio.bind("tcp://*:5555");

  // Send messages forever, alternating between 3 groups.
  for (uint32_t i = 1; true; i = (i % 3 == 0) ? 1 : i + 1) {
    std::string group = "group" + std::to_string(i);
    std::string payload = "This is for " + group;
    zmq::message_t msg{payload};
    msg.set_group(group.c_str());
    radio.send(msg, zmq::send_flags::none);
    std::cout << "Sent a message to " << group << "\n";
    std::this_thread::sleep_for(std::chrono::seconds(1));
  }

  return EXIT_SUCCESS;
}
azmq 的示例 raddsh_radio_example 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/cpp/azmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_radio_example.md
    $example_dir/raddsh_radio_example.md
czmqpp 的示例 raddsh_radio_example 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/cpp/czmqpp
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_radio_example.md
    $example_dir/raddsh_radio_example.md
fbzmq 的示例 raddsh_radio_example 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/cpp/fbzmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_radio_example.md
    $example_dir/raddsh_radio_example.md
NetMQ 的示例 raddsh_radio_example 缺失。你愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/csharp/netmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_radio_example.md
    $example_dir/raddsh_radio_example.md
缺少 raddsh_radio_example 示例,适用于 clrzmq4。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/csharp/clrzmq4
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_radio_example.md
    $example_dir/raddsh_radio_example.md
缺少 raddsh_radio_example 示例,适用于 dartzmq。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/dart/dartzmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_radio_example.md
    $example_dir/raddsh_radio_example.md
缺少 raddsh_radio_example 示例,适用于 Chumak。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/erlang/chumak
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_radio_example.md
    $example_dir/raddsh_radio_example.md
缺少 raddsh_radio_example 示例,适用于 ezmq。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/erlang/ezmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_radio_example.md
    $example_dir/raddsh_radio_example.md
缺少 raddsh_radio_example 示例,适用于 erlang-czmq。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/erlang/erlang-czmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_radio_example.md
    $example_dir/raddsh_radio_example.md
缺少 raddsh_radio_example 示例,适用于 FsNetMQ。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/fsharp/fsnetmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_radio_example.md
    $example_dir/raddsh_radio_example.md
缺少 raddsh_radio_example 示例,适用于 fszmq。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/fsharp/fszmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_radio_example.md
    $example_dir/raddsh_radio_example.md
缺少 raddsh_radio_example 示例,适用于 zmq4。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/go/zmq4
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_radio_example.md
    $example_dir/raddsh_radio_example.md
缺少 raddsh_radio_example 示例,适用于 goczmq。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/go/goczmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_radio_example.md
    $example_dir/raddsh_radio_example.md
缺少 raddsh_radio_example 示例,适用于 zeromq4-haskell。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/haskell/zeromq4-haskell
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_radio_example.md
    $example_dir/raddsh_radio_example.md
缺少 raddsh_radio_example 示例,适用于 JeroMQ。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/java/jeromq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_radio_example.md
    $example_dir/raddsh_radio_example.md
缺少 raddsh_radio_example 示例,适用于 JZMQ。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/java/jzmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_radio_example.md
    $example_dir/raddsh_radio_example.md
缺少 raddsh_radio_example 示例,适用于 jczmq。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/java/jczmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_radio_example.md
    $example_dir/raddsh_radio_example.md
缺少 raddsh_radio_example 示例,适用于 zeromqjs。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/nodejs/zeromqjs
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_radio_example.md
    $example_dir/raddsh_radio_example.md
缺少 raddsh_radio_example 示例,适用于 perlzmq。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/perl/perlzmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_radio_example.md
    $example_dir/raddsh_radio_example.md
缺少 raddsh_radio_example 示例,适用于 Pyzmq。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/python/pyzmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_radio_example.md
    $example_dir/raddsh_radio_example.md
缺少 raddsh_radio_example 示例,适用于 rbzmq。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/ruby/rbzmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_radio_example.md
    $example_dir/raddsh_radio_example.md
缺少 raddsh_radio_example 示例,适用于 rust-zmq。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/rust/rust-zmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_radio_example.md
    $example_dir/raddsh_radio_example.md
缺少 raddsh_radio_example 示例,适用于 zzmq。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/zig/zzmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_radio_example.md
    $example_dir/raddsh_radio_example.md

当 RADIO 套接字因达到订阅者的高水位标记而进入静音状态时,任何将发送给该订阅者的消息都会被丢弃,直到静音状态结束。对于此套接字类型,发送操作永远不会阻塞。

特点总结

兼容对等 Socket DISH
方向 单向
发送/接收模式 仅发送
入站路由策略 不适用
出站路由策略 扇出
静默状态下的行为 丢弃

DISH 套接字

DISH 套接字由订阅者用于订阅由 RADIO 分发的组。最初,DISH 套接字未订阅任何组。此套接字类型未实现 发送 操作。

缺少 raddsh_dish_example 示例,适用于 libzmq。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/c/libzmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_dish_example.md
    $example_dir/raddsh_dish_example.md
缺少 raddsh_dish_example 示例,适用于 czmq。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/c/czmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_dish_example.md
    $example_dir/raddsh_dish_example.md
缺少 raddsh_dish_example 示例,适用于 zmqpp。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/cpp/zmqpp
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_dish_example.md
    $example_dir/raddsh_dish_example.md
#include <cstdlib>
#include <iostream>
#include <zmq.hpp>

int main() {
  // Initialize the zmq context with a single IO thread
  zmq::context_t context{1};

  // Construct a Dish socket and connect to interface
  zmq::socket_t dish{context, zmq::socket_type::dish};
  dish.connect("tcp://localhost:5555");

  // Join message groups
  dish.join("group1");
  dish.join("group2");

  // Receive messages forever
  while (true) {
    std::cout << "Waiting to receive...\n";
    zmq::message_t msg;
    dish.recv(msg, zmq::recv_flags::none);
    std::cout << "Received a message: " << msg.to_string() << "\n";
  }

  return EXIT_SUCCESS;
}
缺少 raddsh_dish_example 示例,适用于 azmq。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/cpp/azmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_dish_example.md
    $example_dir/raddsh_dish_example.md
缺少 raddsh_dish_example 示例,适用于 czmqpp。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/cpp/czmqpp
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_dish_example.md
    $example_dir/raddsh_dish_example.md
缺少 raddsh_dish_example 示例,适用于 fbzmq。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/cpp/fbzmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_dish_example.md
    $example_dir/raddsh_dish_example.md
缺少 raddsh_dish_example 示例,适用于 NetMQ。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/csharp/netmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_dish_example.md
    $example_dir/raddsh_dish_example.md
缺少 raddsh_dish_example 示例,适用于 clrzmq4。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/csharp/clrzmq4
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_dish_example.md
    $example_dir/raddsh_dish_example.md
缺少 raddsh_dish_example 示例,适用于 dartzmq。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/dart/dartzmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_dish_example.md
    $example_dir/raddsh_dish_example.md
缺少 raddsh_dish_example 示例,适用于 Chumak。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/erlang/chumak
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_dish_example.md
    $example_dir/raddsh_dish_example.md
缺少 raddsh_dish_example 示例,适用于 ezmq。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/erlang/ezmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_dish_example.md
    $example_dir/raddsh_dish_example.md
缺少 raddsh_dish_example 示例,适用于 erlang-czmq。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/erlang/erlang-czmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_dish_example.md
    $example_dir/raddsh_dish_example.md
缺少 raddsh_dish_example 示例,适用于 FsNetMQ。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/fsharp/fsnetmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_dish_example.md
    $example_dir/raddsh_dish_example.md
缺少 raddsh_dish_example 示例,适用于 fszmq。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/fsharp/fszmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_dish_example.md
    $example_dir/raddsh_dish_example.md
缺少 raddsh_dish_example 示例,适用于 zmq4。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/go/zmq4
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_dish_example.md
    $example_dir/raddsh_dish_example.md
缺少 raddsh_dish_example 示例,适用于 goczmq。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/go/goczmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_dish_example.md
    $example_dir/raddsh_dish_example.md
缺少 raddsh_dish_example 示例,适用于 zeromq4-haskell。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/haskell/zeromq4-haskell
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_dish_example.md
    $example_dir/raddsh_dish_example.md
缺少 raddsh_dish_example 示例,适用于 JeroMQ。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/java/jeromq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_dish_example.md
    $example_dir/raddsh_dish_example.md
缺少 raddsh_dish_example 示例,适用于 JZMQ。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/java/jzmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_dish_example.md
    $example_dir/raddsh_dish_example.md
缺少 raddsh_dish_example 示例,适用于 jczmq。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/java/jczmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_dish_example.md
    $example_dir/raddsh_dish_example.md
缺少 raddsh_dish_example 示例,适用于 zeromqjs。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/nodejs/zeromqjs
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_dish_example.md
    $example_dir/raddsh_dish_example.md
缺少 raddsh_dish_example 示例,适用于 perlzmq。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/perl/perlzmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_dish_example.md
    $example_dir/raddsh_dish_example.md
缺少 raddsh_dish_example 示例,适用于 Pyzmq。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/python/pyzmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_dish_example.md
    $example_dir/raddsh_dish_example.md
缺少 raddsh_dish_example 示例,适用于 rbzmq。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/ruby/rbzmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_dish_example.md
    $example_dir/raddsh_dish_example.md
缺少 raddsh_dish_example 示例,适用于 rust-zmq。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/rust/rust-zmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_dish_example.md
    $example_dir/raddsh_dish_example.md
缺少 raddsh_dish_example 示例,适用于 zzmq。您愿意贡献吗?请按照以下步骤操作

    git clone https://github.com/zeromq/zeromq.org
    example_dir=content/docs/examples/zig/zzmq
    cd zeromq.org && mkdir -p $example_dir
    [ -s $example_dir/index.md ] || cat >$example_dir/index.md <<'EOF'
---
headless: true
---
EOF
    cp archetypes/examples/raddsh_dish_example.md
    $example_dir/raddsh_dish_example.md

特点总结

兼容对等 Socket RADIO
方向 单向
发送/接收模式 仅接收
入站路由策略 公平队列
出站路由策略 不适用