Python:OpenMPI与RabbitMQ之比较

8
假设有人想编写一个应用程序,其中不同的进程之间需要通信。这些通信将通过发送字符串和/或numpy数组来完成。
在选择OpenMPI和RabbitMQ等工具时,需要考虑哪些因素?
2个回答

13

这类问题没有单一的正确答案,它取决于许多不同的因素。例如:

  1. 您使用的通信类型是什么?是发送大块数据还是小块数据?需要高带宽还是低延迟?
  2. 您需要什么样的交付保证?
  3. OpenMPI 只能立即将消息传递给正在运行的进程,而不同的 MQ 解决方案可以排队消息并允许花式生产者 - 消费者配置。
  4. 您使用的网络类型是什么?如果在本地主机上运行,则诸如 ZeroMQ 之类的东西可能是最快的。如果在一组主机上运行,则取决于可用的互连方式。例如,OpenMPI 可以利用 InfiniBand/MiryNet 链接。
  5. 您进行的处理类型是什么?使用 MPI 时,所有进程通常同时启动、处理并一次性终止。

Abbot,感谢您的回复。是的,我正在通过一个由100台机器组成的网络发送“大数据包”(每个几MB);我的网络很简单,只有1G。没有什么花哨的东西;可以有一些延迟 - 不必是最快的。 - user3262424
1
总的来说,MPI适用于在多个可靠节点上运行单个大型任务(例如,集群中的节点或实验室中的一堆PC)。如上所述,当您不知道什么样的网络连接方式时,或者想利用节点上核之间的共享内存时,MPI也非常好。您离开这种使用情况越远,MPI的适用性就越差。我只想补充一点,OpenMPI只是MPI的一个实现;另一个实现MPICH2同样出色。如果您要使用MPI+Python,则建议使用mpi4py。(http://mpi4py.scipy.org/) - Jonathan Dursi
Jonathan,谢谢你。使用OpenMPI相比RabbitMQ有什么优势吗? - user3262424
当然有。这完全取决于我回复中问题的答案。例如:如果在具有Infiniband硬件的集群上运行,OpenMPI在吞吐量和延迟方面将比RabbitMQ更胜一筹。RabbitMQ确实允许轻松配置多个生产者-多个消费者,而您将不得不编写大量样板代码才能使用OpenMPI实现此目标。等等。 - abbot

4

几个月前我遇到了这种情况,我决定使用AMQP与RabbitMQ使用主题交换,另外还使用memcache处理大型对象。

AMQP消息都是字符串,以JSON对象格式传递,因此很容易添加消息属性(如重试次数)并重新发布。 JSON对象是JSON的子集,对应于Python字典。例如{"recordid": "272727"}是具有一个属性的JSON对象。我可以选择只使用Python来锁定消息队列,但这样做会限制我们只能使用Python。

大型对象不会通过AMQP路由,而是进入memcache,供另一个进程检索。您也可以使用Redis或Tokyo Tyrant来完成此工作。想法是我们不希望短消息排在大型对象后面。

最终,我的Python进程最终同时使用AMQP和ZeroMQ处理架构的两个不同方面。您可能会发现,使用OpenMPI和AMQP对于不同类型的工作都有意义。

在我的情况下,监管进程永远运行,启动整个工作程序,除非它们死亡或挂起,在这种情况下,监管人员将重新启动它们。工作以消息形式通过AMQP不断流动,每个进程只处理工作的一步,因此当我们确定瓶颈时,我们可以拥有多个进程实例,可能在单独的机器上,以消除瓶颈。在我的情况下,我有15个进程实例,其中一个有4个,另外还有大约8个单个实例。


Michael,这是一个有趣的设计。谢谢你分享这个。 - user3262424
你还应该考虑使用_msgpack_进行序列化,它可以与_zeromq_完美配合。 - errordeveloper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接