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();
}
}
总之:享受分布式计算的世界吧!
我正在尝试使用 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, secondREP
-lies
onePUB
-lishes, anyoneSUB
-scribes to just listen
onePUSH
-es, the otherPULL
-s to receive
each party, bound together inPAIR
may both speak and listen, whenever, as needed
etc forBROKER
,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();
}
}