C++ 如何避免删除消息zeromq pub sub

C++ 如何避免删除消息zeromq pub sub,c++,zeromq,publish-subscribe,C++,Zeromq,Publish Subscribe,我见过几个关于这方面的问题,但没有一个答案让我满意。这个问题尤其类似,尽管我愿意使用任何其他zeromq机制来实现相同的效果 我的问题是,有没有任何方法可以像ZeroMQ中的publisher subscriber那样以扇出模式发送消息,并保证消息将被传递?似乎零拷贝的经销商可以做到这一点,但这会比pub-sub更混乱。有更好的选择吗?这样做除了需要编写更多的代码之外还有什么缺点 需要这样做的原因: 我正在编写一个代码来分析来自检测的数据。连接到仪器的模块需要能够将数据广播到其他模块,以便进行分

我见过几个关于这方面的问题,但没有一个答案让我满意。这个问题尤其类似,尽管我愿意使用任何其他zeromq机制来实现相同的效果

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

需要这样做的原因:

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

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

我认为另一种选择是在事后处理丢失的消息,但这只会浪费处理事件的时间,而这些事件将在以后被丢弃

编辑:
我想再进一步考虑一下,我现在希望messagesent=messagedelivered,因为我使用inproc并在线程之间通信。但是,如果我通过TCP发送消息,即使ZeroMQ没有故意删除消息,消息也有可能丢失。这是否意味着即使使用阻止发送,我也可能需要处理丢弃的消息?inproc对消息传递有任何保证吗?

一般来说,我认为没有办法用0MQ单独为发布/订阅提供保证。如果你真的需要完全可靠的消息,你就必须自己动手

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

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


《0MQ指南》对如何至少部分实现您的需求有一些想法。

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

这是否意味着即使我 使用阻止发送

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

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

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