ZeroMQ 服务器是否在无限监听?

Is ZeroMQ server listening infinitely?

我正在尝试使用 ZeroMQ 实现客户端服务器。

我是 运行 无限循环中的服务器,绑定到套接字并无限轮询套接字。

当客户端发送请求时,服务器仅在第一次接收。后面的请求没有被服务器接收到,下面是我的代码片段

服务器:

        ZMQ.Socket socket = context.socket(ZMQ.REP);
        socket.bind ("tcp://*:5555");
        System.out.println("Server is in receive mode");
            while (!Thread.currentThread ().isInterrupted ()) {           
                Poller poller = new Poller(1);
                poller.register(socket, Poller.POLLIN);
                poller.poll();
                if (poller.pollin(0)) {
                    ZMsg zmqMessage = ZMsg.recvMsg(socket);                 
                    if (zmqMessage!=null) {
                        zmqMessage.getFirst().getData();
                    }
                }

客户:

    ZMQ.Socket socket = context.socket(ZMQ.REQ);
    socket.connect ("tcp://localhost:5555");
    ZMsg readyFrame = new ZMsg();
    readyFrame.add(new ZFrame("READY"));
    readyFrame.send(socket);

我试过在客户端进行投票,如下所示,但没有成功。

        Poller poller = new Poller(1);
        poller.register(socket, Poller.POLLOUT);
        poller.pollout(0);

REP 套接字必须先发送回复才能再次接收。 如果您只是想要一种单向通信,您最好使用 PUB & SUB.

ZeroMQ 是 Pieter HINTJENS 和 Martin SUSTRIK 团队的一件绝妙的艺术品。是的,有一些 low-level、technology-related 问题,仍然需要一些设计工作,但是 ZeroMQ 非常稳定且非常成熟。

系统思维 - 玩具作为分布式自动机工作

是的,SEQ 编程语言中的 work-flow 串行(或“只是”并发)编程语言突然有了新的维度——分布式自动机维度。

因此本地工作流程依赖于外部操作方。

每个 ZeroMQ 正式通信模式的原始原型都具有 human-familiar 个名称:

one REQ-ests, second REP-lies
one PUB-lishes, anyone SUB-scribes to just listen
one PUSH-es, the other PULL-s to receive
each party, bound together in PAIR may both speak and listen, whenever, as needed
etc for BROKER, DEALER, XPUB, XSUB, et al

这就是 by-design 原因,为什么你的 server-side REQ-原型行为不会收到来自任何其他方的任何下一条消息(是的,可能有更多客户端连接到同一个 REQ-transport-class 节点),直到它确实 REP-lies(无论是是否为空消息)到分布式自动机的REP端。

最好的下一步

好吧,在这个方向上成为专业人士的最好的下一步是恕我直言,以获得更多的全球视野,这对于尝试使用 ZeroMQ 编码的前几件事来说可能听起来很复杂,但如果你at least jump to the page 265 of the [Code Connected, Volume 1] [available asPdf >>> http://hintjens.wdfiles.com/local--files/main%3Afiles/cc1pe.pdf ],如果不是阅读step-by-step的情况。

fastest-ever learning-curve 将首先在 图 60 上有一个 un-exposed 视图 重新发布更新图 62 HA 克隆服务器对可能的 High-availability 方法 然后回到根,元素和细节。

间接费用:

作为一个小提示,一旦轮询器将在 while(){} 循环“外部”创建,降低处理开销将是公平的 resource-wise,因为没有明显的理由恢复这样的元素和re-register它一次又一次地为每个循环服务:

Poller poller      = new Poller(1);                  // new INSTANCE
poller.register( socket, Poller.POLLIN );            // pay COSTS of SETUP
                                                     //     JUST ONCE, HERE
while ( !Thread.currentThread ().isInterrupted () ) {// inf LOOP

    poller.poll();                                   //     POLL !BLOCKING
    if ( poller.pollin( 0 ) ) {                      //     if ITEMS{ ... proc 'em }
    ZMsg zmqMessage  = ZMsg.recvMsg( socket );
    if ( zmqMessage != null )
         zmqMessage.getFirst().getData();
    }
}

总之:享受分布式计算的世界吧!