【问题标题】:How to avoid dropping messages zeromq pub sub如何避免丢弃消息 zeromq pub sub
【发布时间】:2013-08-02 03:50:14
【问题描述】:

我已经看到了几个关于此的问题,但没有一个我认为满意的答案。这个问题,尤其是zeromq pattern: pub/sub with guaranteed delivery 是类似的,尽管我愿意使用任何其他 zeromq 机制来实现相同的效果。

我的问题是,有什么方法可以像 ZeroMQ 中的发布者-订阅者那样以扇出模式发送消息,并保证消息将被传递?似乎零副本的经销商可以做到这一点,但它会比 pub-sub 更混乱。有更好的选择吗?这样做除了要编写更多代码之外还有什么缺点?

需要这个的原因:

我正在编写代码来分析来自仪器的数据。连接到仪器的模块需要能够将数据广播到其他模块以供他们分析。反过来,他们需要将分析的数据广播到输出模块。

乍一看,使用 ZeroMQ 的 pub-sub 似乎非常适合这项工作,但如果任何订阅者速度变慢并达到高水位线,消息就会被丢弃。在这个系统的情况下,由于事件的连续性,只在一小部分模块中丢弃消息是不可接受的。所有模块都需要分析事件以使输出有意义。但是,如果没有模块收到事件的消息,那很好。因此,如果其中一个分析模块达到高水位线,则可以阻止发布者(检测模块)。

我想另一种选择是在事后处理丢失的消息,但这只会浪费处理稍后将被丢弃的事件的时间。

编辑: 我想进一步考虑这一点,我目前期望消息已发送 = 消息已传递,因为我正在使用 inproc 并在线程之间进行通信。但是,如果我要通过 TCP 发送消息,即使 ZeroMQ 没有故意丢弃它,消息也有可能丢失。这是否意味着即使我使用阻塞发送,我也可能需要处理丢弃的消息?使用 inproc 传递消息是否有任何保证?

【问题讨论】:

    标签: c++ zeromq publish-subscribe


    【解决方案1】:

    一般来说,我认为 0MQ 无法单独为 pub/sub 提供保证。如果你真的需要完全可靠的消息传递,你将不得不自己动手。

    网络本质上是不可靠的,这就是为什么 TCP 进行如此多的握手只是为了让数据包通过。

    与以往一样,这是延迟和吞吐量之间的平衡。如果您准备牺牲吞吐量,您可以自己进行消息握手 - 也许使用 REQ/REP - 并自己处理广播。

    0MQ 指南对如何至少实现您想要的部分内容有一些想法here

    【讨论】:

      【解决方案2】:

      我同意 SteveL 的观点。如果您真的需要 100% 的可靠性(或接近它),ZeroMq 可能不是您的解决方案。您最好使用商业消息传递产品,其中保证消息传递和持久性得到解决,否则,您将在 ZeroMq 中编写可靠性功能,并且可能会在此过程中费尽心思。如果您需要应用程序和数据库之间的 ACID 合规性,您会实现自己的应用程序服务器吗?除非您想实现自己的事务管理器,否则您会购买 WebLogic、WebSphere 或 JBoss 来为您完成。

      这是否意味着我可能需要处理丢弃的消息,即使我 使用阻塞发送?

      我会远离明确阻止任何东西,它太脆弱了。如果消费端出现问题,同步发送方可能会无限期挂起。您可以使用轮询和超时来解决这个问题,但同样,它是脆弱和混乱的代码;坚持异步。

      对于使用 inproc 的消息传递是否有任何保证?

      嗯,一件事是有保证的;您无需处理物理套接字,因此消除了任何网络问题。

      【讨论】:

        【解决方案3】:

        这个问题出现在搜索引擎上,所以我只是想更新一下。

        您可以在使用 PUB 套接字时阻止 ZeroMQ 丢弃消息。您可以设置ZMQ_XPUB_NODROP option,它会在发送缓冲区已满时引发错误。

        利用这些信息,您可以创建类似死信队列的东西,如 here 所述,并继续尝试重新发送,并在其间进行休眠。

        目前可能无法有效处理此问题,因为似乎没有办法在 ZeroMQ 中的发送缓冲区不再满时得到通知,这意味着定时休眠/轮询可能是找出问题的唯一方法如果发送队列又有空间,那么消息就可以发布了。

        【讨论】:

          猜你喜欢
          • 2017-07-12
          • 2011-11-20
          • 2015-04-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-16
          • 1970-01-01
          相关资源
          最近更新 更多