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