【发布时间】:2019-08-06 04:18:51
【问题描述】:
我正在尝试对工作负载进行动态负载平衡。为此,我使用了 Req-Router 模式。
但目前它只是挂起,而不是任何消息通过。
这是我的工作负载生成器代码 (server.py):
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)])
还有我的客户代码(Client.java):
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();
}
}
问题是这将打印出Client: Sent,但在另一端,服务器将永远不会打印出任何内容。
我有一个基本的 python 客户端:
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)
在我看来,这与 java 客户端的作用相同(尽管我不认为我遗漏了什么)。
任何帮助将不胜感激!
【问题讨论】:
-
在 python 端、java 端使用的 ZeroMQ 的确切版本是什么?
-
@user3666197 它们是 python:4.3.1 和 java:4.1.7 版本,所以我猜这可能会导致问题?
-
您也可以发布
uname -a@Cjen1 吗?谢谢。 -
@user3666197
Linux 1e1b6a3d14de 4.15.0-55-generic #60-Ubuntu SMP Tue Jul 2 18:22:20 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux此外,每次绑定套接字时,它都会得到755,这可能会导致问题,因为可能位于另一个命名空间(不同容器)中的 java 进程无法写入它。但是,同一容器中的 python 代码可以正常工作。