【问题标题】:ZeroMQ publisher socket - raise event on subscriptionZeroMQ 发布者套接字 - 在订阅时引发事件
【发布时间】:2017-01-13 00:57:26
【问题描述】:

我想知道是否有办法在新订阅发布者套接字时引发事件

例如:

        PublisherSocket publisher = new PublisherSocket();

        publisher.Bind("tcp://*:5555");

        NetMQPoller poller = new NetMQPoller { publisher };
        poller.RunAsync();

        poller.OnSubscription += topic =>
        {
            AddToPool(topic);
        };

        Task.Factory.StartNew(() =>
        {
            SubscriberSocket sub = new SubscriberSocket();
            sub.Connect("tcp://127.0.0.1:5555");

            Thread.Sleep(1000);
            sub.Subscribe("A");
        }, TaskCreationOptions.LongRunning);

        publisher.ReceiveReady += Publisher_ReceiveReady;

当然,OnSubscription 并不存在,但我想知道有没有办法解决它。

我需要我的服务器知道所有订阅。

我想到了两种实现方式:

  1. 在服务器中创建一个额外的路由器套接字,所有订阅都将发送到发布者套接字和路由器套接字(取消订阅也是如此)。这将允许我从路由器轮询订阅。

  2. 根本不使用发布者/订阅者,使用路由器/经销商创建所有发布订阅机制。

你会建议我做什么?

【问题讨论】:

  • 如 zeroMQ 指南中所写,无法跟踪订阅,但查看Advanced Pub-Sub-Pattern 您会发现 Reliable-Pub-Sub (Clone) Pattern,即使用第二个 ROUTER /DEALER 套接字来实现你想要的

标签: zeromq netmq


【解决方案1】:

如果您使用 XPUB 而不是 PUB 套接字,您可以像在任何其他套接字类型上接收常规消息一样接收订阅消息。

【讨论】:

  • 请注意,[An Answer][A Solution Proposal] 是两个不同的东西。 [An Answer] 应该是“不,在 ZeroMQ 传输服务中对于 OnSubscription() 功能没有这样的机制但是可以添加这样的行为作为附加信令,使用单独的传输原型或使用相同但扩展的原型XPUB/XSUB,它为此类事件的基于代码的信令提供手段,并允许对方采取像raise这样的行动......”既真实又公平。
  • @David 谢谢回复,我查了确实是这样,我可以通过XPublisherSocket收听订阅、退订。它对我来说仍然不够可靠。我的计划是创建一个服务器,当有人开始订阅某个订阅时,它会引发订阅事件,并在没有人再订阅该主题时引发取消订阅事件。为此,我必须跟踪所有主题和客户身份,并实施心跳机制来跟踪断开连接的客户。
  • @David 我认为路由器套接字更适合后者,因为它开箱即用地知道所有客户端身份。此外,我无法使用 XPublisher 实现心跳,它不允许我阅读与订阅无关的消息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-14
  • 1970-01-01
相关资源
最近更新 更多