Sto progettando un'applicazione che richiede un gruppo distribuito di elaboratori che devono consumare in modo asincrono e produrre dati in un flusso specifico. Ad esempio:Esiste un framework di pipeline di elaborazione dati distribuiti o un buon modo per organizzarne uno?
- Il componente A recupera le pagine.
- Componente B analizza le pagine da A.
- Componente C esercizi analizzati pezzi da B.
Ci sono ovviamente più appena tre componenti coinvolti.
Ulteriori requisiti:
- Ogni componente deve essere un processo separato (o un insieme di processi).
- I produttori non sanno nulla dei loro consumatori. In altre parole, il componente A produce solo dati, non conoscendo quali componenti consumano tali dati.
Questo è un tipo di flusso di dati risolto dai sistemi orientati alla topologia come Storm. Mentre Storm sembra buono, sono scettico; è un sistema Java ed è basato su Thrift, nessuno dei quali sono un fan.
Attualmente mi sto orientando verso un approccio pub/sub-style che utilizza AMQP come trasporto dati, con HTTP come protocollo per la condivisione/archiviazione dei dati. Ciò significa che il modello di coda AMQP diventa un'API pubblica: in altre parole, il consumatore deve sapere quale host e coda AMQP viene utilizzato dal produttore, cosa di cui non sono particolarmente soddisfatto, ma potrebbe valerne la pena.
Un altro problema con l'approccio AMQP è che ogni componente dovrà avere logica molto simile per:
- Collegamento alla coda
- Gestione degli errori di connessione dati
- serializzazione/deserializzazione in un formato comune
- Esecuzione dei lavoratori effettivi (goroutines o sottoprocessi che si biforcano)
- ridimensionamento dinamico dei lavoratori
- Tolleranza agli errori di registrazione
- Nodo
- metriche Processing
- coda di limitazione
- priorità Queue (alcuni lavoratori sono meno importanti di altri)
... e tanti altri piccoli dettagli che ogni componente avrà bisogno.
Anche se un consumatore è logicamente molto semplice (si pensi ai lavori di MapReduce, qualcosa come la divisione del testo in token), c'è molto standard. Certamente posso fare tutto da solo - ho molta familiarità con AMQP e code e tutto il resto - e avvolgo tutto in un pacchetto comune condiviso da tutti i componenti, ma poi sono già sulla strada per inventare un framework.
Esiste un buon quadro per questo tipo di cose?
Nota che ti sto chiedendo specificamente di Go. Voglio evitare Hadoop e l'intero stack Java.
Modifica: sono stati aggiunti alcuni punti per maggiore chiarezza.
Apprezzo la risposta, ma praticamente hai semplicemente ripetuto quello che ho scritto nella mia domanda. AMQP è quello che sto prendendo in considerazione, e ho familiarità con le code, ma non sono felice di dover scrivere tutto da solo. Ad esempio, ogni "componente" deve eseguire un certo numero di lavoratori paralleli (goroutine o processi biforcati); gestire questi lavoratori, consentendo al numero di lavoratori di scalare in modo dinamico, e così via, è qualcosa che ogni componente dovrà avere, quindi deve essere trasformato in un aiuto comune. –
@AlexanderStaubo vedo. Ci scusiamo per la risposta ingenua allora. Non sono a conoscenza di cose del genere per Go, ad eccezione di ciò che [Iron.io] (http://www.iron.io) offre con i suoi servizi Worker e MQ. – Mostafa