【问题标题】:Using NetMQMonitor to detect server disconnects?使用 NetMQMonitor 检测服务器断开连接?
【发布时间】:2022-08-03 15:29:59
【问题描述】:

我正在寻找一种更好的方法来检测路由器/服务器出现故障或由于连接不良而无法使用时的断开连接。 (我正在收听在 wifi 上运行的经销商/客户端)我找到了 zmq_socket_monitor() 并发现 NetMQ 具有相同的功能。我从文档中的理解是,当您监视套接字时,您会给它一个 inproc 地址,它会通知您使用该地址的任何套接字更改。除了unit tests,我真的找不到NetMQMonitor 的任何示例,我的问题是我在下面的代码中是否正确使用了它?与 NetMQPoller 一起使用是否有效?

        // run poller on a separate thread
        _poller = new NetMQPoller { _dealer, _subscriber, _outgoingMessageQueue, _subscriptionChanges};
        _poller.RunAsync();

        // run a monitor listening for Connected and Disconnected events
        _monitor = new NetMQMonitor(_dealer, \"inproc://rep.inproc\", SocketEvents.Disconnected | SocketEvents.Connected);
        _monitor.EventReceived += _monitor_EventReceived;
        _monitor.StartAsync();

**** 更新 ****


所以...在发布此内容后,我在NetMQPoller tests on github 中找到了答案,因此可以回答您是否可以将 NetMQMonitor 与 NetMQPoller 一起使用,但我仍然很好奇是否有人对使用监视器的整体方法有想法跟踪连接状态。这是任何有兴趣的人的相关代码:

    [Fact]
    public void Monitoring()
    {
        var listeningEvent = new ManualResetEvent(false);
        var acceptedEvent = new ManualResetEvent(false);
        var connectedEvent = new ManualResetEvent(false);

        using (var rep = new ResponseSocket())
        using (var req = new RequestSocket())
        using (var poller = new NetMQPoller())
        using (var repMonitor = new NetMQMonitor(rep, \"inproc://rep.inproc\", SocketEvents.Accepted | SocketEvents.Listening))
        using (var reqMonitor = new NetMQMonitor(req, \"inproc://req.inproc\", SocketEvents.Connected))
        {
            repMonitor.Accepted += (s, e) => acceptedEvent.Set();
            repMonitor.Listening += (s, e) => listeningEvent.Set();

            repMonitor.AttachToPoller(poller);

            int port = rep.BindRandomPort(\"tcp://127.0.0.1\");

            reqMonitor.Connected += (s, e) => connectedEvent.Set();

            reqMonitor.AttachToPoller(poller);

            poller.RunAsync();

            req.Connect(\"tcp://127.0.0.1:\" + port);
            req.SendFrame(\"a\");

            rep.SkipFrame();

            rep.SendFrame(\"b\");

            req.SkipFrame();

            Assert.True(listeningEvent.WaitOne(300));
            Assert.True(connectedEvent.WaitOne(300));
            Assert.True(acceptedEvent.WaitOne(300));
        }
    }

    标签: c# .net zeromq netmq


    【解决方案1】:

    使用监视器正是寻找连接状态变化的正确方法。

    在引擎盖下,管理线程正在通过连接 ping。如果乒乓球干涸了,那就有问题了。这可以检测网络问题,但也可以检测崩溃等问题;如果其中一个套接字的进程死亡,则通知另一端的进程死连接。

    唯一的不足之处在于,发送的消息会发生什么对您来说很重要。不同的套接字将消息缓存在不同的位置,一些倾向于将它们保留在发送端直到接收端准备好,另一些则将它们存储在接收端。如果连接中断并且您希望返回未传递的消息(也许是发送到其他地方),那么您将无法获取它们。 ZMQ 就像一个邮局。一旦你把信交给柜台,他们就不能也不会把它还给你,即使你仍然可以看到它!

    这就是 Actor 模型的本质,也是 ZMQ 实现的。 Communicating Sequential Processes 是 Actor 模型的一种发展,根本不将消息存储在通道中,这意味着如果连接断开,应用程序仍然拥有未发送的消息。有时确定消息是否确实没有传递很有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-13
      • 2014-07-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-23
      相关资源
      最近更新 更多