Este es exactamente el escenario en el que estuve hace unos meses y decidí usar AMQP con RabbitMQ usando intercambios de temas, además de Memcache para objetos grandes.
Los mensajes AMQP son todas cadenas de caracteres, en formato de objeto JSON para que sea fácil agregar atributos a un mensaje (como el número de reintentos) y volver a publicarlo. Los objetos JSON son un subconjunto de JSON que corresponde a los dictados de Python. Por ejemplo, {"recordid": "272727"} es un objeto JSON con un atributo. Podría haber escaqueado un dict de Python, pero eso nos habría bloqueado para usar Python con las colas de mensajes.
Los objetos grandes no son enrutados por AMQP, sino que entran en un Memcache en el que están disponibles para que otro proceso los recupere. Podrías usar Redis o Tokyo Tyrant para este trabajo. La idea es que no queríamos que los mensajes cortos se pusieran en cola detrás de objetos grandes.
Al final, mis procesos de Python terminaron usando AMQP y ZeroMQ para dos aspectos diferentes de la arquitectura. Puede encontrar que tiene sentido usar OpenMPI y AMQP pero para diferentes tipos de trabajos.
En mi caso, un proceso de supervisor se ejecuta para siempre, inicia una bandada completa de trabajadores que también se ejecuta para siempre a menos que mueran o se cuelguen, en cuyo caso el supervisor los reinicia. El trabajo fluye constantemente como mensajes a través de AMQP, y cada proceso maneja solo un paso del trabajo, de modo que cuando identificamos un cuello de botella podemos tener múltiples instancias del proceso, posiblemente en máquinas separadas, para eliminar el cuello de botella. En mi caso, tengo 15 instancias de un proceso, 4 de otras dos y alrededor de otras 8 instancias individuales.
Abbot, gracias por su respuesta. Sí, estoy enviando 'paquetes grandes '(pocos MB cada uno) a través de una red de 100 máquinas; Tengo una red 1G simple. Nada sofisticado; puede tener un poco de latencia, no tiene que ser el más rápido. – user3262424
+1. En general, MPI es bueno para ejecutar una sola tarea grande en múltiples nodos confiables (por ejemplo, nodos en un clúster o un montón de PC en un laboratorio).Como se mencionó anteriormente, también es excelente cuando no se sabe qué tipo de red tienen, o si se quiere aprovechar la memoria compartida entre núcleos en un nodo. Cuanto más te alejas de este tipo de caso de uso, menos se adapta MPI. Añadiré que OpenMPI es solo una implementación de MPI; MPICH2, otro, es igual de bueno. Y si vas a usar MPI + Python, recomiendo mpi4py. (http://mpi4py.scipy.org/) –
Jonathan, gracias. ¿Hay alguna ventaja de usar 'OpenMPI' contra' RabbitMQ'? – user3262424