Throughput lento: vale ancora la pena utilizzare una coda di messaggi dedicata?

6

Ecco alcuni requisiti per una coda:

  • Ogni pochi giorni aggiungi ~ 100k attività con varie priorità
  • I lavoratori eseguiranno le attività in genere meno di 10 secondi
  • Le attività devono essere completate da ~ 2 operatori unici (per il controllo degli errori), quindi a seconda del risultato potenzialmente da un altro lavoratore
  • Memorizzazione persistente delle attività

Dato che la velocità di elaborazione del compito è piuttosto modesta, vale la pena aggiungere un sistema di accodamento messaggi dedicato al mio stack o riutilizzare il database (MongoDB)?

    
posta hoju 29.07.2016 - 00:22
fonte

3 risposte

3

È difficile dire senza una completa comprensione di ciò che stai cercando di realizzare, ma in base a ciò che stai dicendo, penso che un database abbia più senso. Potresti voler utilizzare insieme un database e un sistema di accodamento.

La ragione è che in questo tipo di situazione in genere si desidera avere una sorta di controllo di controllo e le code di controllo non forniscono questo. Volete sapere chi ha fatto cosa quando è giusto? Dove lo rintraccerai? Molto probabilmente è in un DB. Inoltre devi preoccuparti di cose come un lavoratore che seleziona un'attività e poi torna a casa malato. Non vuoi avere un sacco di letture a lungo termine senza fili sulle code.

La cosa importante da capire sulle code è che le letture sono distruttive. Questo li rende una soluzione povera (da soli) in molte situazioni comuni. In poche parole, una volta che qualcuno ha eseguito la lettura, è difficile non sapere che il messaggio è mai stato lì. Se un messaggio viene letto e commesso da un consumatore ma quest'ultimo non riesce a elaborarlo correttamente, le cose possono andare perse. Un sacco di sistemi di code hanno "consegna garantita" che non significa tanto quanto la gente pensa di sì. Significa semplicemente che è arrivato alla sua destinazione (o che è stato segnalato come non consegnabile) ma non garantisce che il consumatore abbia fatto qualcosa con esso. "Quindi cosa, la lettura da un database non cambia" si potrebbe dire. La differenza è che quando leggi il messaggio dal DB, non scompare. Spesso non vuoi nemmeno cancellarlo dal DB ma piuttosto monitorare lo stato. Ciò significa che non si perdono messaggi a causa di difetti nei consumatori.

Penso che la soluzione ibrida funzioni bene qui. Usa le code come meccanismo di distribuzione. Sono grandiosi per la gestione di molti lettori che tirano dallo stesso insieme di cose e assicurandosi che solo un lettore ottenga ogni cosa. Puoi farlo in DBs ma è un po 'brutto. Quindi, una volta che un lettore ha rivendicato e articolo, è possibile aggiornare il DB con quelle informazioni con contesa molto poco. È possibile inviare lo stesso messaggio in coda secondo necessità per il requisito di 2 lavoratori (è necessario un meccanismo per evitare che lo stesso operatore gestisca entrambe le richieste) e anche nel caso in cui un lavoratore preleva un messaggio ma non esegue mai l'operazione.

    
risposta data 29.07.2016 - 20:34
fonte
3

Ciò che mi colpisce di più non è la velocità effettiva. Si tratta di ~ 100k attività ogni pochi giorni. Mi sembra un'elaborazione in batch. Il tipo di cosa che si vorrebbe essere persistente in modo da poter essere spento per installare un aggiornamento ogni tanto. Ciò non significa necessariamente DB, ma non è certamente qualcosa che si desidera avere solo nella memoria volatile.

    
risposta data 29.07.2016 - 06:37
fonte
1

Recentemente ho usato Apache Camel con ActiveMQ e posso dire che una coda di messaggi è molto facile da usare. La velocità e le prestazioni non sono state un problema per me.

ActiveMQ, insieme a quasi tutti i broker di messaggi su larga scala supportano la persistenza, in ActiveMQ è semplice come fornire un percorso file a un database nella configurazione. Se la troughput è un problema, ho sentito che Apache Kafka è un buon candidato.

Kafka ha un throughput teorico maggiore di ActiveMQ a causa di ActiveMQ che fluffa ogni messaggio con 144 byte e Kafka solo 9 (!) byte.

Nella mia esperienza, probabilmente a causa del fatto che non sono un mago del database, direi che è più facile creare risultati migliori con una coda di messaggi.

Vedi questo articolo: Il database come Anti-Pattern della coda

    
risposta data 29.07.2016 - 09:36
fonte

Leggi altre domande sui tag