如何使用同一套接字检查ZeroMQ消息传递?

时间:2019-04-06 00:28:55

标签: java zeromq jeromq

如下图所示,我们在项目中使用ZeroMQ作为消息代理。这使我们能够将两个不同的方分开,并分别进行扩展。由于ZeroMQ,我们从一方(Service1)发送数据,而从另一方(Service1)获取数据。

因为它不提供开箱即用的消息传递保证,因此对于我们在发送时不会丢失任何数据至关重要,我们正在通过向反方向发送心跳作为解决方法来检查消息代理是否仍然有效。 我们将PUB-SUB套接字类型用于发送数据,将SUB-PUB套接字类型用于向反方向发送心跳。

Message broker architecture

我们注意到数据和心跳有时可能会通过拓扑中的不同负载均衡器。这会导致这样的问题,即使是心跳传输负载均衡器(例如LB2)仍然可以工作,我们也无法注意到数据传输负载均衡器(例如LB1)何时关闭。我们的逻辑假设一切正常,仅因为它仍然收到心跳。但是实际上存在一个问题,因为负载均衡器已关闭,我们的数据没有被传输。

我们尝试合并数据和心跳套接字。我们认为,如果我们在同一套接字上管理这两个不同的消息,则可以克服不同的负载平衡器问题。我们在ZeroMQ中寻找了一种套接字类型,该套接字类型允许双向非阻塞通信,并且还为这两个部分提供了机会,只要它们希望不被阻塞就可以发送消息。

经销商-经销商似乎是一个不错的选择,因为它允许双向通信和非阻塞通信。但是我们还有另一个要求。我们希望我们的Service1实例不只坚持使用特定的消息代理,而是每次都将消息发送到不同的消息代理。这就是为什么每个Service1实例都与映像中的每个消息代理实例连接的原因。因此,这一次,DEALER类型将不允许向每个Service1用户发送心跳,因为DEALER-DEALER结构对于1:1样式很方便。 Service1实例将不会收到每个ping,而只会收到我们的方案不可接受的一部分。


Service1-Service1.java

ZMQ.Context context;
ZMQ.Socket dataSocket;
ZMQ.Socket heartbeatSocket;

dataSocket = context.socket(ZMQ.PUB);
dataSocket.connect(messageBrokerDataReceiveEndpoint);

heartbeatSocket = context.socket(ZMQ.SUB);
heartbeatSocket.connect(messageBrokerHeartbeatEndpoint);

MessageBroker-Broker.java

ZMQ.Context context;
ZMQ.Socket dataSendSocket;
ZMQ.Socket dataReceiveSocket

dataSendSocket = context.socket(ZMQ.XPUB);
dataSendSocket.bind(messageBrokerDataSendEndpoint);

dataReceiveSocket = context.socket(ZMQ.XSUB);
dataReceiveSocket.bind(messageBrokerDataReceiveEndpoint);

ZMQ.proxy(dataSendSocket, dataReceiveSocket, null);

MessageBroker-Heartbeat.java

//run this block in a scheduled way (e.g. 500ms)
ZMQ.Context context;
ZMQ.Socket heartbeatSocket;

heartbeatSocket = context.socket(ZMQ.PUB);
heartbeatSocket.bind(messageBrokerHeartbeatEndpoint);

Service2-Service2.java

ZMQ.Context context;
ZMQ.Poller poller;
ZMQ.Socket dataSocket;

dataSocket = context.socket(ZMQ.SUB);
dataSocket.connect(messageBrokerDataSendEndpoint);

/*
poller checks each message broker instance and if there is something new, 
it fetches and shares the data with each Service2 instance
*/


我们想知道是否有ZeroMQ提供的插座类型或结构能很好地满足我们的要求。为了再次提及他们;
*我们需要从一方发送消息给另一方
*我们需要通过同一套接字传输数据和心跳
* Service1实例应该能够与每个消息代理实例进行通信,并且消息代理应该能够将消息转发到每个Service2实例

如果您可以建议合适的套接字类型或以不同方式满足我们需求的其他体系结构,我们将不胜感激。

0 个答案:

没有答案