传播与MPI vs zeromq?
在像TCP这样的可靠性的UDP广播的答案之一中,用户提到了Spread消息传递API。 我也跑了一个叫做ØMQ 。 我也对MPI有一些了解。
所以,我的主要问题是:为什么我会select一个呢? 更具体地说,为什么当MPI有成熟的实现时,我会select使用Spread或ØMQ?
MPI被devise成紧密耦合的计算集群,具有快速,可靠的networking。 Spread和ØMQ是为大型分布式系统devise的。 如果你正在devise一个并行的科学应用程序,那么去MPI吧,但是如果你正在devise一个需要对故障和networking不稳定性进行恢复的永久分布式系统,那就使用其中一个。
MPI的容错能力非常有限, 大多数实现中的默认error handling行为是系统范围的失败。 另外,MPI的语义要求所有发送的消息最终被消耗。 这对于群集上的仿真很有意义,但对于分布式应用程序则不是。
我没有使用任何这些库,但我可能会提供一些提示。
- MPI是通信协议,而Spread和ØMQ是实际实现的。
- MPI来自“并行”编程,而Spread来自“分布式”编程。
所以,这要看你是在试图build立一个并行系统还是分布式系统。 它们是相互关联的,但隐含的内涵/目标是不同的。 并行编程通过同时使用多台计算机来处理增加的计算能力。 分布式编程涉及可靠的(一致的,容错的和高度可用的)计算机组。
“可靠性”的概念与TCP的概念略有不同。 TCP的可靠性是“无论如何都要将这个数据包发给最终的程序”。 分布式编程的可靠性是“即使有些机器死机,整个系统仍然以一致的方式工作”。 要真正保证所有的参与者都能得到这个信息,就需要像2阶段提交或者更快的select。
您在这里处理的是非常不同的API,它们提供的服务types和基础设施的概念各不相同。 我不太了解MPI和Spread为他们回答,但我可以帮助更多与ZeroMQ。
ZeroMQ是一个简单的消息通信库。 除了根据一组受限制的常用消息模式(PUSH / PULL,REQUEST / REPLY,PUB / SUB等),它不会发送消息给不同的对等体(包括本地的对等体)。 它严格地基于这些模式来处理客户端连接,检索和基本拥塞,您必须自己完成其他任务。
虽然看起来非常有限,但是这个简单的行为大部分是你的应用程序的通信层所需要的。 它使您可以从简单的原型(所有内存)快速扩展到各种环境中更复杂的分布式应用程序,使用简单的代理和节点之间的网关。 但是,不要指望它执行节点部署,networking发现或服务器监视; 你将不得不自己做。
简而言之,如果您有一个应用程序需要从简单multithreading进程扩展到分布式和可变环境,或者您希望快速进行实验和原型制作,并且没有任何解决scheme符合您的模型,请使用zeromq。 不过,如果要扩展到非常大的群集,则需要花费一些精力来部署和监视networking。