我正在使用ZeroMQ监视器,我发现它在逻辑断开时有效,但在网络故障时不能正常工作(拔掉我的电缆)。
例如:
显示器的设计是这样的吗?
如果是,除了心跳之外,是否有任何解决方案可以检测网络故障(电缆拔出事件)?
如果没有,如何使用ZeroMQ的原始监控机制来解决这个问题? setTCPKeepAlive()
界面可以有用吗?
我的情况如下。
操作系统:Android,在平板电脑上运行,IDE:Android studio 2.3,lib:jeromq-0.4.3
// Java Code
String monitorAddr = "inproc://client.req";
ZContext ctx = new ZContext();
ZMQ.Socket clientSocket = ctx.createSocket(ZMQ.REQ);
clientSocket.monitor(monitorAddr,ZMQ.EVENT_ALL);
// Then start a montitor thread which is implemented by my own.
操作系统:Windows 7(64位),在我的笔记本电脑上运行,IDE:VS2013,lib:Clrzmq4
// C# Code
const string MonitorEndpoint = "inproc://server.rep";
var ctx = new ZContext();
var serverSocket = new ZSocket(ctx,ZSocketType.REP);
ZError error;
// Create serverSocket pair socket
if (!serverSocket.Monitor(MonitorEndpoint, ZMonitorEvents.AllEvents, out error))
{
if (error == ZError.ETERM)
return ; // Interrupted
throw new ZException(error);
}
// Create a monitor
ZMonitor _monitor = ZMonitor.Create(ctx, MonitorEndpoint);
_monitor.AllEvents += _monitor_AllEvents;
_monitor.Start();
答案 0 :(得分:2)
AFAIK ZeroMQ内部没有内置心跳。我知道几年前在ZMQ社区内就这个话题进行了一些讨论,而且讨论可能仍在继续。
在您的应用程序使用ZeroMQ中加入您自己的心跳消息是相对简单的,特别是如果您使用类似Google协议缓冲区的内容来编码不同的消息类型;心跳只是另一个信息。
在您的应用程序中执行心跳(而不是依赖于某些内置机制)最终会更灵活;你可以选择心率,你可以选择心跳失败时做什么,你可以决定心跳何时重要而不重要等等。
考虑PUB / SUB模式中的心跳; ZMQ作者有点难以代表您决定哪些连接/断开/连接中断事件对您很重要。如果他们确实构建了一个机制,但是应用程序开发人员不想要它,那么它就是浪费带宽。
ZMQ作者更容易将这种应用程序体系结构问题留给应用程序作者(就是你!)来处理。
根据您的具体示例,未插入的网络电缆只是看起来(只要任何软件可以确定),就像没有流量一样;它与不发送任何内容的应用程序相同。如果应用程序没有发送任何内容,ZMQ不会发送任何内容。
如果你看一下套接字监视器可以报告的事件,它们都是流过网络连接的东西的结果,或者是应用程序对套接字做了什么。