首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用ZeroMQ监控机制检测网络崩溃?

如何用ZeroMQ监控机制检测网络崩溃?
EN

Stack Overflow用户
提问于 2017-11-14 05:51:20
回答 1查看 2.2K关注 0票数 2

A.说明

我使用的是ZeroMQ监视器,我发现它在逻辑断开时工作,但当网络断开时不工作(拔掉我的电缆)。

例如:

  • 我在android平台上启动客户端应用程序,然后在我的windows笔记本上启动服务器应用程序。它们通过带有电缆的路由器连接。
  • 如果我手动关闭或打开客户端应用程序或服务器应用程序,监视器就会很好。也就是说,双方的监视器都可以接收“连接”或“接受”和“断开”事件。
  • 但如果我拔掉服务器端的电缆,当客户端和服务器端连接并运行时,双方的监视器都无法检测到“断开”事件。

显示器是这样设计的吗?

如果是,除了心跳之外,是否有任何解决方案来检测网络故障(电缆断开事件)?

如果不是,如何使用ZeroMQ的原始监视机制来解决这个问题?setTCPKeepAlive() 接口有用吗?

B.系统环境

我的情况如下。

客户端

OS: Android,运行在pad上,IDE: Android 2.3,lib:jeromq-0.4.3

代码语言:javascript
运行
复制
// 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

代码语言:javascript
运行
复制
// 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();
EN

回答 1

Stack Overflow用户

发布于 2017-11-14 07:59:00

在ZeroMQ中没有内置的心跳。我知道几年前在ZMQ社区中有一些关于这个主题的讨论,而且这种讨论可能还在继续。

将自己的心跳消息结合到应用程序对ZeroMQ的使用中是相对简单的,特别是当您使用类似Google缓冲区的东西来编码不同的消息类型时,心跳只是另一条消息。

在应用程序中执行心跳(而不是依赖某种内置的机制)最终是更灵活的;您可以选择心跳速率,如果心跳失败,您可以选择做什么,您可以决定心跳是重要的还是不重要的,等等。

考虑发布/子模式中的心跳;对于ZMQ作者来说,要代表您决定连接/断开/连接中断事件对您来说是有点困难的。如果他们确实构建了一种机制,但应用程序开发人员并不想要它,那么这就浪费了带宽。

对于ZMQ作者来说,将这种应用程序架构问题留给应用程序作者(就是您!)要容易得多!去处理。

通过您的具体示例,拔出的网络电缆看起来(就任何软件所能确定的范围而言)就好像没有流量;它与应用程序没有发送任何内容相同。如果应用程序没有发送任何内容,ZMQ不会发送任何内容。

如果您查看套接字监视器可以报告的事件,它们都是通过网络连接流的结果,或者是应用程序对套接字所做的事情。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47278561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档