Python: OpenMPI 与 RabbitMQ 对比

8 投票
2 回答
4471 浏览
提问于 2025-04-16 21:53

假设你想写一个 python 应用程序,这个程序需要不同的进程之间进行交流。交流的方式是通过发送 字符串 和/或 numpy 数组。

在选择使用 OpenMPI 还是像 RabbitMQ 这样的工具时,有哪些需要考虑的因素呢?

2 个回答

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个其他的单实例。

13

这个问题没有一个固定的答案,因为答案会受到很多不同因素的影响。比如说:

  1. 你们的通信方式是什么?是发送大数据包还是小数据包?你需要好的带宽还是低延迟?
  2. 你需要什么样的送达保证?
  3. OpenMPI只能把消息立即发送给正在运行的进程,而不同的消息队列(MQ)解决方案可以把消息排队,并允许复杂的生产者-消费者配置。
  4. 你的网络环境是什么样的?如果你是在本地运行,像ZeroMQ这样的工具可能是最快的。如果你是在一组主机上运行,那就要看它们之间的连接情况。例如,OpenMPI可以利用infiniband或mirynet链接。
  5. 你在做什么样的处理?使用MPI时,所有进程通常是同时启动的,处理完后也会一起结束。

撰写回答