繁体   English   中英

如何避免丢弃消息 zeromq pub sub

[英]How to avoid dropping messages zeromq pub sub

我已经看到了几个关于这个的问题,但没有一个我觉得满意的答案。 这个问题, zeromq 模式:特别是保证交付的发布/订阅是类似的,尽管我愿意使用任何其他 zeromq 机制来实现相同的效果。

我的问题是,有没有什么方法可以像 ZeroMQ 中的发布者-订阅者那样以扇出模式发送消息,同时保证消息会被传递? 似乎零拷贝的经销商可以做到这一点,但它会比 pub-sub 麻烦得多。 有更好的选择吗? 除了必须编写更多代码之外,这样做的缺点是什么?

需要这个的原因:

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

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

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

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

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

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

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

0MQ 指南有一些关于如何至少完成您在此处想要的部分内容的想法。

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

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

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

是否有关于 inproc 消息传递的任何保证?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM