gpt4 book ai didi

sockets - ZMQ套接字-满足所有请求时断开连接

转载 作者:行者123 更新时间:2023-12-03 12:03:47 26 4
gpt4 key购买 nike

我正在尝试在Java中实现ZMQ REQ/REP 模型

我有一个服务器 -role,在帖子5564上运行,它充当复制器

ZMQ.Socket repSock = context.socket(ZMQ.REP);

我有一个 客户端-角色,运行于5563后
ZMQ.Socket syncclient = context.socket(ZMQ.REQ);

我在中间有一个 代理 -server,它通过请求和响应
ZMQ.proxy(reqSocket, repSocket, null);

拥有代理的好处是我可以添加多个服务器
repSocket.connect("tcp://" + addr.getHostAddress() + ":" + port);

哪个工作正常。

现在,当我从代理服务器中删除服务器节点时
repSocket.disconnect("tcp://" + addr.getHostAddress() + ":" + port);

客户端被卡住,因为已发出请求,并且 REQ -socket等待响应。

因此,该过程停留在 syncclient.recvStr()
for (int request_nbr = 0; request_nbr < (request_nbr + 1); request_nbr++) {          

syncclient.send(str.getBytes(),0);
System.out.println("Send Dataaaa....... " );
String data = syncclient.recvStr(Charset.defaultCharset());
System.out.println(" here.. " +data);

request_nbr++;
}

我搜索了却找不到追踪 REQ -socket的方法

我需要两件事中的任何一件事:
  • 一种跟踪Socket -instance(即将断开连接)的方法,等待所有消息处理完毕,以便syncclient.recvStr()不会被阻止
  • 重置syncclient -socket的一种方法,这样我就可以保持REQ/REP的响应而不会中断
  • 最佳答案

    在实际场景中,最好避免使用ZeroMQ的.send()/.recv()方法的阻塞模式,而最好使用.poll()

    尽管这可能需要更多的SLOC代码,但结果却将您留在了控件中,而阻塞的SLOC则将代码中的所有控件都带走了,直到(如果有的话)下一条消息被传递,您将无法做任何事情。这是一个非常错误的设计实践,除了最简单的教科书示异常(exception),它们实际上是现实世界中的反模式。

    因此,不要指望问题2 会以某种方式神奇地解决,这不是ZeroMQ API的一部分(出于许多相当大的原因)。如果API版本和使用上下文允许,或者根本不使用琐碎的 .setsockopt( ZMQ.REQ_RELAXED, 1 ) 模式,最好在 REQ/REP 之间做出决定(由于已知的风险会陷入无法挽回的相互僵局(请参阅本文章的其他文章)非常主题,这种现象既被说明又被解释了无数次))。

    以类似的方式,在您从未阅读过ZeroMQ规范和/或文档以及ZeroMQ“最佳实践”的情况下,询问问题1 似乎是合理的。在此花了一些时间之后,您的选择将非常清晰。没有内置此类工具。如果需要根据自己的需要添加任何类似的非核心逻辑,则可以添加一些附加组件。 aSocket.close() 中提供了唯一间接影响.setsockopt( ZMQ.LINGER, 0 )行为的设置,这可以帮助防止系统从过渡到有效的挂机状态,一旦aSocket无限等待状态,这种情况在任何情况下都不会发生消息队列仍然是非空的(消息仍在等待传递)。

    进入分布式系统设计就像进入一个新世界。没有保证任何序列(发生非串行代码执行路径)。无法对远程实体,它们的状态,它们的故障,它们的存在,它们的实际ZeroMQ API版本进行任何本地控制。

    确实是一个充满挑战的世界。

    注:
    您可能已经知道,无需使用代理就可以将.connect() aSocket -instance(最好是aSocket -instance的访问点)到多个远程端。使用一些额外的.setsockopt()调整为ZMQ.IMMEDIATE 到1,将有助于更好地管理循环分发策略,而与实际邮件传递所使用的传输类({ tcp:// | ipc:// | vmci:// | pgm:// | epgm:// | inproc:// })无关。所有这些都在您的指尖。

    关于sockets - ZMQ套接字-满足所有请求时断开连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47010256/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com