在Broadcast like UDP with the Reliability of TCP的一个答案中,用户提到了Spread消息传递API。我还遇到了一个叫ØMQ的人。我也熟悉MPI。
所以,我的主要问题是:为什么我会选择一个而不是另一个?更具体地说,当有成熟的MPI实现时,为什么我会选择使用Spread或ØMQ?
答案 0 :(得分:50)
MPI是紧密耦合的计算集群,具有快速,可靠的网络。 Spread和ØMQ专为大型分布式系统而设计。如果您正在设计并行科学应用程序,请使用MPI,但如果您正在设计一个需要对故障和网络不稳定具有弹性的持久分布式系统,请使用其中一个。
MPI的容错设施非常有限;大多数实现中的默认错误处理行为是系统范围的失败。此外,MPI的语义要求最终消耗所有发送的消息。这对于群集上的模拟很有意义,但对于分布式应用程序却没有。
答案 1 :(得分:14)
我没有使用过任何这些库,但我可能会给出一些提示。
因此,这实际上取决于您是否正在尝试构建并行系统或分布式系统。它们彼此相关,但隐含的内涵/目标是不同的。并行编程通过同时使用多台计算机来处理增加的计算能力。分布式编程处理可靠(一致,容错和高可用)的计算机组。
“可靠性”的概念与TCP略有不同。 TCP的可靠性是“无论如何都将此数据包提供给最终程序”。分布式编程的可靠性是“即使一些机器死机,整个系统仍然以一致的方式工作。”为了真正保证所有参与者都能收到消息,我们需要2 phase commit或更快的替代方案之一。
答案 2 :(得分:4)
您在这里处理的是非常不同的API,其中包含有关所提供服务类型和每种服务的基础架构的不同概念。我不太了解MPI和Spread来回答它们,但我可以用ZeroMQ做更多的帮助。
ZeroMQ是一个简单的消息传递通信库。它除了基于一组受限制的通用消息传递模式(PUSH / PULL,REQUEST / REPLY,PUB / SUB等)向不同的对等体(包括本地对等体)发送消息之外别无其他。它严格根据这些模式处理客户端连接,检索和基本拥塞,您必须自己完成其余的工作。
虽然看起来非常有限,但这种简单的行为大多是您应用程序的通信层所需要的。它允许您使用简单的代理和节点之间的网关,从一个简单的原型,内存中的所有内容,到各种环境中更复杂的分布式应用程序,快速扩展。但是,不要指望它进行节点部署,网络发现或服务器监控;你必须自己做。
简单地说,如果您有一个应用程序要从简单的多线程进程扩展到分布式和可变环境,或者您希望快速进行实验和原型并且没有解决方案似乎适合您的模型,请使用zeromq。但是,如果要扩展到非常大的集群,则必须在网络的部署和监控上付出一些努力。