Domanda

In una delle risposte a Trasmetti come UDP con l'affidabilità di TCP, un utente menziona il Diffusione API di messaggistica.Ne ho anche incontrato uno chiamato ØMQ.Ho anche una certa familiarità con MPI.

Quindi, la mia domanda principale è:perché dovrei sceglierne uno piuttosto che l'altro?Più specificamente, perché dovrei scegliere di utilizzare Spread o ØMQ quando sono disponibili implementazioni mature di MPI?

È stato utile?

Soluzione

MPI è stato progettato per cluster di elaborazione strettamente collegati con reti veloci e affidabili.Spread e ØMQ sono progettati per grandi sistemi distribuiti.Se stai progettando un'applicazione scientifica parallela, scegli MPI, ma se stai progettando un sistema distribuito persistente che deve essere resistente ai guasti e all'instabilità della rete, utilizza uno degli altri.

MPI dispone di strutture molto limitate per la tolleranza agli errori;il comportamento predefinito di gestione degli errori nella maggior parte delle implementazioni è un errore a livello di sistema.Inoltre, la semantica di MPI richiede che tutti i messaggi inviati vengano prima o poi consumati.Ciò ha molto senso per le simulazioni su un cluster, ma non per un'applicazione distribuita.

Altri suggerimenti

Non ho utilizzato nessuna di queste librerie, ma potrei essere in grado di dare alcuni suggerimenti.

  1. MPI è un protocollo di comunicazione mentre Spread e ØMQ ne sono l'implementazione vera e propria.
  2. MPI deriva dalla programmazione "parallela" mentre Spread deriva dalla programmazione "distribuita".

Quindi, dipende davvero se stai cercando di costruire un sistema parallelo o un sistema distribuito.Sono correlati tra loro, ma le connotazioni/obiettivi impliciti sono diversi.La programmazione parallela si occupa di aumentare la potenza di calcolo utilizzando più computer contemporaneamente.La programmazione distribuita si occupa di un gruppo di computer affidabili (coerenti, tolleranti ai guasti e altamente disponibili).

Il concetto di "affidabilità" è leggermente diverso da quello di TCP.L'affidabilità di TCP è "dare questo pacchetto al programma finale, qualunque cosa accada". L'affidabilità della programmazione distribuita è "anche se alcune macchine muoiono, il sistema nel suo insieme continua a funzionare in modo coerente". Per garantire davvero che tutti i partecipanti hanno ricevuto il messaggio, uno avrebbe bisogno di qualcosa di simile Impegno in 2 fasi o una delle alternative più veloci.

Stai affrontando API molto diverse qui, con nozioni diverse sul tipo di servizi forniti e sull'infrastruttura per ciascuno di essi.Non ne so abbastanza di MPI e Spread per rispondere, ma posso aiutare un po' di più con ZeroMQ.

ZeroMQ è una semplice libreria di comunicazione di messaggistica.Non fa altro che inviare un messaggio a diversi peer (compresi quelli locali) in base a un insieme ristretto di modelli di messaggistica comuni (PUSH/PULL, REQUEST/REPLY, PUB/SUB, ecc.).Gestisce la connessione del client, il recupero e la congestione di base rigorosamente in base a tali schemi e tu devi fare il resto da solo.

Sebbene sembri molto limitato, questo semplice comportamento è principalmente ciò di cui avresti bisogno per il livello di comunicazione della tua applicazione.Ti consente di scalare molto rapidamente da un semplice prototipo, tutto in memoria, ad applicazioni distribuite più complesse in vari ambienti, utilizzando semplici proxy e gateway tra i nodi.Tuttavia, non aspettarti che esegua la distribuzione dei nodi, l'individuazione della rete o il monitoraggio dei server;Dovrai farlo da solo.

In breve, utilizza zeromq se hai un'applicazione che desideri scalare dal semplice processo multithread a un ambiente distribuito e variabile, o che desideri sperimentare e prototipare rapidamente e che nessuna soluzione sembra adattarsi al tuo modello.Aspettatevi tuttavia di dover impegnarvi nella distribuzione e nel monitoraggio della vostra rete se desiderate raggiungere un cluster molto grande.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top