Java ZMQ路由器Req模式问题

Java ZMQ路由器Req模式问题,java,python,zeromq,distributed-system,Java,Python,Zeromq,Distributed System,我正在尝试动态地平衡工作负载。为此,我使用Req路由器模式 然而,目前它只是挂起,而不是通过任何消息 这是我的工作负载生成器代码(server.py): 和我的客户端代码(client.java): 在我看来,它与java客户机的作用是一样的(尽管我认为我遗漏了一些东西) 任何帮助都将不胜感激 ipc://TRANSPORT-CLASS有几个特点: ipc://运输类工作还有一些附加条件: 系统必须提供UNIX域套接字 ipc://transport classAccessPoint-地址说明

我正在尝试动态地平衡工作负载。为此,我使用Req路由器模式

然而,目前它只是挂起,而不是通过任何消息

这是我的工作负载生成器代码(
server.py
):

和我的客户端代码(
client.java
):

在我看来,它与java客户机的作用是一样的(尽管我认为我遗漏了一些东西)

任何帮助都将不胜感激

ipc://
TRANSPORT-CLASS有几个特点:
ipc://
运输类工作还有一些附加条件:

  • 系统必须提供UNIX域套接字
  • ipc://
    transport classAccessPoint-地址说明符的长度必须小于107字节
  • ipc://
    transport classAccessPoint-地址说明符必须符合有效的O/S文件系统路径语法规则(绝对路径和
    @
    -抽象命名空间端点也受其他约束)
  • ipc://
    transport classAccessPoint-地址端点必须已在操作系统命名空间内创建,方法是将其分配给具有成功的
    .bind()的套接字
  • ipc://
    传输类AccessPoint-地址端点必须是可写的,用于拥有调用
    上下文()
    -实例的进程(对于资源隔离和资源代理/抽象配置,容器都是可疑的,它们不允许访问实际托管的O/S资源,就好像这些资源通常由类似的进程使用一样,这些进程在“隔离”容器的抽象范围之外正常运行

下一步:找出能够向前推进的根本原因 即使上面的代码使用了
.recv()的阻塞模式
-s并且不显式测试任何潜在的错误状态,隔离根本原因的下一步第一步是使用tcp://
传输类设置相同的
来消除不可恢复的冲突是否与选择e传输类或是否有其他根本原因

还应该包括公平的资源管理步骤,以便在流程退出之前以优雅的方式释放资源(不要说强制终止的流程的影响,这些流程在重新运行预期代码时会挂起资源并禁止其重复使用):

  • 显式
    aSocketINSTANCE.setsockopt(ZMQ\u LINGER,0)

  • 显式
    aSocketINSTANCE.{close(),.unbind()}

  • 显式
    aContextINSTANCE.term()

使用
ZMQ_IMMEDIATE
{UID | PID | GID}
对可能和可能
.bind()/.connect()
的进程进行基于访问筛选,可能仍然需要一些额外的预防步骤和性能或安全调整,这些进程现在已被弃用,并使用(最初的“仅适用于tcp”)取而代之的是ZAP-API服务,仅举几个设计改进的进一步方向

后记: 不同的包装器不仅可以使用不同的ZeroMQ版本,还可以使用不同的资源处理策略。因此,python包装器可以工作,而java包装器不需要。例如,
.getsockopt(ZMQ\u use\u FD)
根据包装器作者的设计决策,可能会显示不同的输出



如果有人可能想阅读更多关于ZeroMQ内部的内容,或者只是想从轨道高度的角度(如中所示)大致了解一下,请随意点击,并根据Zero禅宗的规则,从轻松生活的体验中收集更多细节。

ZeroMQ在t上使用的确切版本是什么python方面,java方面?@user3666197它们是python:4.3.1和java:4.1.7的版本,所以我想这可能会引起问题?你也可以发布
uname-a
@Cjen1?谢谢。@user3666197
Linux 1e1b6a3d14de 4.15.0-55-generic#60 Ubuntu SMP周二18:22:20 UTC 2019 x86\u 64 x86\u 64 GNU/Linux
套接字被绑定,它得到了
755
,这可能会导致问题,因为可能位于另一个命名空间(不同容器)中的java进程无法写入它。但是,同一容器中的python代码是功能性的。为此,我无法在线找到太多关于ipc的明确文档,因此这是完美的!(即使在指南中)Always welcome@Cjen1请随意使用StackOverflow上这里收集的更多资源,但也要注意,一些行为和一些默认值与v3.x中的v2.x不同,并且随着越来越多的最新大师入侵Zen of Zero曾经健全和晶莹剔透的领域,这些行为和默认值在v4.x中进一步扩展。向Martin Sustrik致敬,fa关于ZeroMQ,我们可以从这个家伙身上学到很多东西。
import zmq

address = "ipc:///path/to/named/socket.sock"

socket = zmq.Context().socket(zmq.ROUTER)
socket.bind(address)

for i in range(1000):
    addr,_,resp = socket.recv_multipart()
    print(resp)
    socket.send_multipart([addr, b'', "Ping: " + str(i)])
public static void main(String[] args) throws Exception {
        String address = "/path/to/named/socket.sock";

        System.out.println("CLIENT: Parsed Address: " + address);

        ZMQ.Context context = ZMQ.context(1);
        ZMQ.Socket socket = context.socket(SocketType.REQ);

        address = "ipc://" + address;
        socket.connect( address );
        System.out.println("CLIENT: Connected to " + address);
        for(int i = 0; i < 1000; i++){
            socket.send("Ping " + i);
            System.out.println("CLIENT: Sent.");
            String rep = new String(socket.recv());
            System.out.println("Reply " + i + ": " + rep);
        }
        socket.close();
        context.term();
    }
}
import zmq
from sys import argv

print("CLIENT: pinging")
"""Sends ping requests and waits for replies."""
context = zmq.Context()
sock = context.socket(zmq.REQ)
print("CLIENT: Binding to ipc://"+argv[-1])
sock.bind("ipc://"+argv[-1])
print('bound')
for i in range(1000):
    sock.send('ping %s' % i)
    rep = sock.recv()  # This blocks until we get something
    print('Ping got reply:', rep)