Propagation vs MPI vs zeromq?
Dans l'une des réponses à Diffusion comme UDP avec la Fiabilité de TCP, un utilisateur mentionne le Propagation API de messagerie. J'ai aussi rencontré un appelé ØMQ . J'ai aussi une certaine familiarité avec MPI.
Donc, ma question principale est: pourquoi choisir l'un plutôt que l'autre? Plus précisément, pourquoi devrais-je choisir D'utiliser Spread ou ØMQ quand il y a des implémentations matures de MPI à avoir?
3 réponses
MPI a été des clusters de calcul étroitement couplés avec des réseaux rapides et fiables. Spread et ØMQ sont conçus pour les grands systèmes distribués. Si vous concevez une application scientifique parallèle, optez pour MPI, mais si vous concevez un système distribué persistant qui doit être résistant aux pannes et à l'instabilité du réseau, utilisez l'un des autres.
MPI a des facilités très limitées pour la tolérance aux pannes; le comportement de gestion des erreurs par défaut dans la plupart des implémentations est un système à l'échelle échouer. En outre, la sémantique de MPI exige que tous les messages envoyés soient finalement consommés. Cela fait beaucoup de sens pour les simulations sur un cluster, mais pas pour une application distribuée.
Je n'ai utilisé aucune de ces bibliothèques, mais je pourrais peut-être donner quelques conseils.
- MPI est un protocole de communication tandis que Spread et ØMQ sont une implémentation réelle.
- MPI provient de la programmation "parallèle" tandis que Spread provient de la programmation "distribuée".
Donc, cela dépend vraiment si vous essayez de construire un système parallèle ou un système distribué. Ils sont liés les uns aux autres, mais les connotations/objectifs implicites sont différents. Programmation parallèle traite de l'augmentation de la puissance de calcul en utilisant plusieurs ordinateurs simultanément. La programmation distribuée concerne un groupe d'ordinateurs fiable (cohérent, tolérant aux pannes et hautement disponible).
Le concept de "fiabilité" est légèrement différent de celui de TCP. La fiabilité de TCP est " donner ce paquet au programme final, peu importe quoi."La fiabilité de la programmation distribuée est" même si certaines machines meurent, le système dans son ensemble continue de fonctionner de manière cohérente." De vraiment garantir que tous les participants ont reçu le message, on aurait besoin de quelque chose comme 2 Phase commit ou l'une des alternatives les plus rapides.
Vous abordez ici des API très différentes, avec des notions différentes sur le type de services fournis et l'infrastructure pour chacune d'elles. Je ne sais pas assez sur MPI et Spread pour répondre pour eux, mais je peux aider un peu plus avec ZeroMQ.
ZeroMQ est une bibliothèque de communication de messagerie simple. Il ne fait rien d'autre que d'envoyer un message à différents pairs (y compris locaux) en fonction d'un ensemble restreint de modèles de messagerie communs (PUSH/PULL, REQUEST/REPLY, PUB/SUB, etc.). Il gère la connexion client, la récupération et la congestion de base strictement basée sur ces modèles et vous devez faire le reste vous-même.
Bien qu'apparaissant très restreint, ce comportement simple est principalement ce dont vous auriez besoin pour la couche de communication de votre application. Il vous permet de passer très rapidement d'un simple prototype, tout en mémoire, à des applications distribuées plus complexes dans divers environnements, en utilisant de simples proxies et passerelles entre les nœuds. Cependant, ne vous attendez pas à faire déploiement de nœuds, découverte de réseau ou surveillance de serveur; vous devrez le faire vous-même.
Brièvement, utilisez zeromq si vous avez une application que vous voulez passer du processus multithread simple à un environnement distribué et variable, ou que vous voulez expérimenter et prototyper rapidement et qu'aucune solution ne semble correspondre à votre modèle. Attendez vous cependant à devoir mettre un peu d'effort sur le déploiement et la surveillance de votre réseau si vous voulez évoluer vers un très grand cluster.