考慮以下幾點:如何隊列連接到ZeroMQ PUB/SUB
- 一組3個邏輯服務:
S1
,S2
和每個服務正在運行的S3
- 兩個實例,所以我們有以下進程:
S1P1
,S1P2
,S2P1
,S2P2
,S3P1
,S3P2
- 一個
ZeroMQ
經紀人在單個進程中運行,並且可通過所有服務流程
一個合乎邏輯的服務,讓我們說S1
,發佈消息M1
是感興趣的邏輯服務S2
和S3
。每個邏輯服務只有一個進程必須接收M1
,所以我們假設S2P1
和S3P2
。
我曾嘗試以下,但沒有成功:
- 經紀人線程1正在運行
XSUB/XPUB
代理 - 經紀人線程2正在運行
ROUTER/DEALER
代理與連接到XPUB
的ROUTER
套接字和訂閱所有內容(對於邏輯S1
) - 代理線程3正在運行
ROUTER/DEALER
代理與ROUTER
連接到XPUB
插座和訂閱所有(邏輯S2
) - 經紀人螺紋4是運行
ROUTER/DEALER
代理與連接到XPUB插座ROUTER
和訂閱所有(邏輯S3
) - 每個邏輯服務過程正在運行連接到代理
DEALER
插座
我盤算了一下,XSUB/XPUB
代理會給我發佈/訂閱語義,而且ROUTER/DEALER
代理將引入競爭是REP
插座線補間XSUB/XPUB
代理髮送的郵件的REP
套接字。
我怎樣才能結合ZeroMQ
插座來完成這個?
UPDATE1
我知道「沒有成功」是沒有幫助的,我已經嘗試了不同的配置,得到了不同的錯誤。我試過的最新配置如下:
(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'是無代理商設計** – user3666197
當您說「沒有成功」時 - 您遇到了哪些問題?我會在答案中提出一個替代(但相似)的體系結構,但根據您遇到問題的位置可能沒有幫助。 – Jason
@Jason你說得沒錯,這是因爲我嘗試了不同的組合,並得到了不同的例外。我已更新問題以反映最新的配置。 – Spiff