Domanda

Perché redis per la coda?

Sono sotto l'impressione che Resis possa fare un buon candidato per l'implementazione di un sistema di accodamento. Fino a questo punto, abbiamo utilizzato il nostro database MySQL con il polling o il coniglio. Con RabbitMQ abbiamo avuto molti problemi: le librerie dei clienti sono molto povere e buggy e vorremmo non investire troppe ore di sviluppatore nel fissarli, alcuni problemi con la console di gestione del server, ecc. E, per il momento Essendo almeno, non stiamo afferrando per millisecondi o spingendo seriamente le prestazioni, così finché un sistema ha un'architettura che supporta una coda in modo intelligente, probabilmente siamo in buone condizioni.

Okay, quindi è lo sfondo. Essenzialmente ho un modello di coda molto classico e semplice - diversi produttori che producono lavori e diversi consumatori che consumano lavori, ed entrambi i produttori e i consumatori devono essere in grado di ridimensionare in modo intelligente. Si scopre che un ingenuo PUBSUB non funziona, dal momento che non voglio tutti gli abbonati per consumare lavoro, voglio solo uno abbonato per ricevere il lavoro. Al primo passaggio, mi sembra che BRPOPLPUSH sia un design intelligente.

Possiamo usare BRPOPLPUSH?

Il design di base con BRPOPLPUSH è una coda di lavoro e una coda di avanzamento. Quando un consumatore riceve il lavoro, spinge atomicamente l'elemento nella coda di avanzamento e quando completa il lavoro LREM IT. Ciò impedisce il blanhholing del lavoro se i clienti muoiono e facilitano il monitoraggio piuttosto senza sforzo, ad esempio possiamo dire se c'è un problema che causi un problema che i consumatori richieda molto tempo per eseguire attività, oltre a raccontare se c'è un grande volume di compiti. .

Assicura

    .
  • Il lavoro viene consegnato a esattamente un consumatore
  • Il lavoro si avvolge in una coda di avanzamento, quindi non può essere buco del blood se un consumatore

Gli svantaggi

    .
  • Sembra piuttosto strano che il miglior design che ho trovato non usi in realtà PUBSUB poiché questo sembra essere quello che la maggior parte dei post del blog sulla coda su Redis Focus on. Quindi mi sento come se mi manchi qualcosa di ovvio. L'unico modo in cui vedo usare PUBSUB senza consumare attività due volte è semplicemente spingere una notifica che è arrivato il lavoro, quali consumatori possono quindi generare non bloccando i RPOPLPUSH.
  • È impossibile richiedere più di un oggetto di lavoro alla volta, che sembra essere un problema di prestazione. Non è un enorme per la nostra situazione, ma piuttosto ovviamente afferma che questa operazione non è stata progettata per il throughput elevato o questa situazione
  • In breve: mi manca qualcosa di stupido?

Aggiunta anche di tag node.js, perché è la lingua con cui sto per lo più. Il nodo può offrire alcune semplificazioni nell'attuazione, data la sua natura single-thread e non bloccata, ma inoltre sto usando la biblioteca e le soluzioni del nodo-redis dovrebbero o possono essere sensibili ai suoi punti di forza e debolezze.

È stato utile?

Soluzione

Se si desidera utilizzare Redis per una coda di messaggi in node.js e non ti dispiace usare un modulo per questo, puoi provare rsmq - La coda di messaggi di Redis semplice per il nodo.Non è stato disponibile al momento questa domanda è stata posta, ma oggi è un'opzione praticabile.

Se si desidera effettivamente implement La coda da solo come hai dichiarato nella tua domanda, potresti leggere la fonte di RSMQ perché sono solo 20 schermi di codice che fa esattamente quello che stai chiedendo.

Vedi:

Altri suggerimenti

Ho incontrato alcune difficoltà finora mi piacerebbe documentare qui.

Come gestisci la logica di riconnessione?

Questo è un problema difficile e un problema particolarmente difficile nella progettazione e dell'implementazione di una coda di messaggi. I messaggi devono essere in grado di fare la coda da qualche parte quando i consumatori sono offline, quindi un semplice pub-sub non è abbastanza forte e i consumatori devono riconnettersi in uno stato di ascolto. Blocking Pops è uno stato difficile da mantenere, perché sono uno stato di ascolto non idoneotenti . L'ascolto dovrebbe essere un'operazione idoneotent, tuttavia, quando si tratta di una disconnessione rispetto a un POP di blocco, hai il piacere di pensare molto difficile se la disconnessione è avvenuta subito dopo che l'operazione è riuscita o appena prima dell'operazione fallita. Questo non è insormontabile, ma è indesiderabile.

Inoltre, l'operazione di ascolto dovrebbe essere il più semplice possibile. Idealmente dovrebbe avere queste proprietà:

    .
  • L'ascolto è idempotente.
  • Il consumatore è sempre L'ascolto e la logica a strozzatura viene elaborata al di fuori del codice logico di ascolto. Rabbitmq incapsularlo lasciando che il consumatore abbia vinto il numero di messaggi non scanati che può avere.
    In particolare sono andato con un design povero in cui rientrando un POP bloccante è stato contingente il successo delle precedenti operazioni, che era fragile e richiesto pensando duro.

Ora sto favorendo una soluzione Redis Pubsub + RPoplplpush. Questa notifica dei disatti di lavoro dal consumo di lavoro, che ci consente di effettuare un fattore di una soluzione di ascolto pulita. Il pubsub è responsabile solo della notifica del lavoro. La natura atomica di rpoplpush è responsabile del consumo e del delegamento del lavoro per un esattamente consumatore. All'inizio questa soluzione sembrava inutilmente complicata rispetto a un pop bloccante, ma ora vedo che la complicazione non era affatto inutile; Stava risolvendo un problema difficile.

Tuttavia questa soluzione non è abbastanza banali:

    .
  • I consumatori dovrebbero anche verificare il controllo del lavoro su riconnessione.
  • I consumatori potrebbero voler effettuare un sondaggio per un nuovo lavoro comunque, per la ridondanza. Se il sondaggio effettivamente riuscire dovrebbe essere emesso un avviso, poiché ciò dovrebbe accadere solo tra il consumo sul pubsub e il sondaggio su un rpoplpush. Quindi molti successi di sondaggio indicano un sistema di abbonamento rotto.

Nota che il design PUBSUB / RPOPlpsUn ha anche problemi di ridimensionamento. ogni Consumer riceve una notifica leggera di ogni messaggio , il che significa che questo ha un collo di bottiglia inutile. Sospetto che sia possibile utilizzare i canali per far svuotare il lavoro, ma questo è probabilmente un design difficile da allenare bene.

Quindi il motivo più grande della scelta di utilizzare RabbitMQ su Redis è gli scenari di errore e il clustering.

Questo articolo lo spiega davvero meglio, quindi fornirò solo il link:

https://aphyr.com/posts/283-jepsen-redis < / P >.

Redis Sentinel e più recentemente Redis Clustering non sono in grado di gestire un numero di scenari di errore molto di base che hanno reso una cattiva scelta per una coda.

Rabbitmq ha il proprio insieme di problemi, tuttavia che viene detto che è incredibilmente solido nella produzione ed è una buona coda di messaggi.

Ecco il post per coniglio:

https://aphyr.com/posts/315-jepsen-rabbitmq < / P >.

Quando si guarda il TARICO PAC (coerenza, disponibilità e gestione delle partizioni) È possibile scegliere solo 2 di 3. Stiamo sfruttando RMQ per il CP (coerenza e gestione delle partizioni) con il nostro caricamento del messaggio, se non siamo disponibili, Non è la fine del mondo. Per non perdere messaggi, usiamo ignorare per la gestione della partizione per non perdere messaggi. I duplicati possono essere gestiti poiché la fonte gestisce l'UUID.

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