【发布时间】:2016-06-25 22:57:39
【问题描述】:
考虑以下几点:
- 一组 3 个逻辑服务:
S1、S2和S3 - 每个服务的两个实例都在运行,所以我们有以下进程:
S1P1,S1P2,S2P1,S2P2,S3P1,S3P2 -
ZeroMQ代理在单个进程中运行,所有服务进程均可访问
一个逻辑服务,比如S1,发布一条消息M1,逻辑服务S2和S3感兴趣。每个逻辑服务只有一个进程必须接收M1,假设S2P1 和S3P2。
我尝试了以下方法,但没有成功:
- 代理线程 1 正在运行
XSUB/XPUB代理 - 代理线程 2 正在运行
ROUTER/DEALER代理,其中ROUTER连接到XPUB套接字并订阅了所有内容(对于逻辑S1) - 代理线程 3 正在运行
ROUTER/DEALER代理,其中ROUTER连接到XPUB套接字并订阅了所有内容(对于逻辑S2) - 代理线程 4 正在运行一个
ROUTER/DEALER代理,其中ROUTER连接到 XPUB 套接字并订阅了所有内容(对于逻辑S3) - 每个逻辑服务进程都在运行一个连接到代理
DEALER套接字的REP套接字线程
我认为XSUB/XPUB 代理会给我发布/订阅语义,而ROUTER/DEALER 代理会在REP 套接字之间为XSUB/XPUB 代理发送的消息引入竞争。
如何结合ZeroMQ 套接字来完成此任务?
更新1
我知道“没有成功”没有帮助,我尝试了不同的配置并得到了不同的错误。我尝试的最新配置如下:
(XSUB proxy=> XPUB) => (SUB copyLoop=> REQ) => (ROUTER proxy=> DEALER) => REP
copyLoop 是这样的:
public void start() {
context = ZMQ.context(1);
subSocket = context.socket(ZMQ.SUB);
subSocket.connect(subSocketUrl);
subSocket.subscribe("".getBytes());
reqSocket = context.socket(ZMQ.REQ);
reqSocket.connect(reqSocketUrl);
while (!Thread.currentThread().isInterrupted()) {
final Message msg = receiveNextMessage();
resendMessage(msg);
}
}
private Message receiveNextMessage() {
final String header = subSocket.recvStr();
final String entity = subSocket.recvStr();
return new Message(header, entity);
}
private void resendMessage(Message msg) {
reqSocket.sendMore(msg.getKey());
reqSocket.send(msg.getData(), 0);
}
我得到的异常如下:
java.lang.IllegalStateException: Cannot send another request
at zmq.Req.xsend(Req.java:51) ~[jeromq-0.3.4.jar:na]
at zmq.SocketBase.send(SocketBase.java:613) ~[jeromq-0.3.4.jar:na]
at org.zeromq.ZMQ$Socket.send(ZMQ.java:1206) ~[jeromq-0.3.4.jar:na]
at org.zeromq.ZMQ$Socket.sendMore(ZMQ.java:1189) ~[jeromq-0.3.4.jar:na]
at com.xyz.messaging.zeromq.SubReqProxyConnector.resendMessage(SubReqProxyConnector.java:47) ~[classes/:na]
at com.xyz.messaging.zeromq.SubReqProxyConnector.start(SubReqProxyConnector.java:35) ~[classes/:na]
我正在运行 JeroMQ 0.3.4、Oracle Java 8 JVM 和 Windows 7。
【问题讨论】:
-
您可能想知道
ZeroMQ是无代理的设计 -
当你说“没有成功”时——你遇到了什么问题?我会在答案中建议一个替代(但类似)架构,但根据您遇到问题的位置,它可能没有帮助。
-
@Jason 你说的不太清楚是绝对正确的——这是因为我尝试了不同的组合并得到了不同的例外。我已更新问题以反映最新配置。
-
@user3666197 是的,我知道这一点,我正在尝试确定是否可以使用 ZeroMQ 构建一个准系统代理,以避免在客户的环境中安装像 RabbitMQ 这样的新组件。
-
我不会称 ZMQ 无代理,我会说 ZMQ 是一个比代理低级别的消息传递库。您可以根据消息传递要求设计拓扑,如果需要代理,则构建一个,如果不需要,则不需要。