Coda messaggi. Database vs MQ dedicato

10

Sono in cerca di consigli per l'accodamento dei messaggi. Abbiamo i requisiti per "lavori" da pubblicare su una coda di messaggi.

Il suggerimento originale era solo utilizzare un'istanza di SQL Server ed elaborare i messaggi da quella. Tutto ciò che ho letto su Internet suggerisce che l'utilizzo di un database per una coda di messaggi non è una soluzione scalabile. Per questo motivo, è stata suggerita l'idea di utilizzare RabbitMQ o altri MQ di terze parti.

L'altra cosa da tenere in considerazione è che il requisito per "l'elaborazione del lavoro" non sarà inferiore a 30 secondi, quindi il processo che esegue il lavoro eseguirà il polling del database ogni 30 secondi. Per me, questo non sembra così male e probabilmente funzionerebbe bene senza aggiungere un grande carico al Database.

Abbiamo già un database sui nostri clienti che potremmo usare per questo, quindi non aggiungerà molto supporto extra richiesto ai nostri clienti, mentre se aggiungessimo un MQ di terze parti ci sarebbe un supporto extra per la configurazione di rete, ecc. che sarebbe considerevole dato che ci sono molti utenti.

L'altra opzione che stavo considerando era quella di consentire agli utenti di scegliere tra entrambi. Se sono un utente piccolo, la soluzione Sql Server sarà ok, ma se sono utenti più grandi, consentiremo loro di configurare una soluzione MQ di terze parti.

Non sono venduto su nessuna soluzione, mi chiedo se qualcuno abbia qualcosa che dovrei considerare o consigliare.

    
posta user1653400 23.06.2017 - 02:17
fonte

5 risposte

11

Everything I have read on the internet suggests that using a database for a Message Queue isn't a scalable solution.

La realtà spesso ignorata dal non usa X perché non lo fa t scale "(il link contiene linguaggio che alcuni potrebbero trovare discutibili) la folla è che la scala non è sempre importante. Direi che se osservi tutte le applicazioni sulla faccia del pianeta in modo aggregato, la scala è raramente importante.

Il tuo commento cita una frequenza di 20.000 messaggi al giorno, il che significa che starai cercando di supportare un tasso medio di 0,23 messaggi al secondo (uno ogni 4,3 secondi). Se il tuo progetto risulta essere di due ordini di grandezza più soddisfacente di quanto ti aspettassi, le tue esigenze passano all'elaborazione di 23 messaggi al secondo, un compito che mi piacerebbe dare al mio cellulare di quattro anni o a un Raspberry Pi. Questo non è ancora un'applicazione su vasta scala, anche se si aggiungono altri due ordini di grandezza.

Ho visto (fortunatamente, dai margini) i progetti finiscono male perché hanno passato troppo tempo troppo presto per ossessionare la scala che non sarebbe accaduto o senza tempo e sono stati schiacciati dalla scala che alla fine ha fatto . Come tutto il resto, c'è un mezzo felice. Se pensi che un ridimensionamento grande per la tua applicazione sia una possibilità realistica, non dovrebbe essere difficile fare un business case per fare la piccola quantità di lavoro extra per costruire abbastanza astrazioni intorno a parti non scalabili che sono poco costose da implementare ora . Ciò significa che più tardi , se dovesse sorgere un bisogno di scala, hai un modo (e probabilmente le entrate) di fare la sostituzione all'ingrosso di quelle parti senza dover ripensare all'intero sistema.

Anche se il volume dei messaggi dell'applicazione non sta per rendere un database o un sistema di accodamento dei messaggi un sudore anche su hardware modesto, probabilmente ci sono altri requisiti su come vengono gestite le transazioni dei messaggi che rendono l'una o l'altra una scelta migliore . Questi requisiti sono ciò che dovresti valutare.

    
risposta data 24.06.2017 - 17:06
fonte
7

Le code dei messaggi diventano davvero uniche quando ne hai molte e instradi messaggi tra di loro, fanout a più di un consumatore ecc.

Se hai una sola "coda di lavoro" di cose che vuoi elaborare "offline", allora una tabella SQL andrà benissimo.

Non dimenticare di assicurarsi di avere un modo per contrassegnare i lavori in corso, pulire quelli vecchi e avvisare quando il sistema si ferma. Ma per una singola coda la gestione manuale di queste cose sarà meno impegnativa del mantenimento di una soluzione di accodamento separata.

    
risposta data 23.06.2017 - 09:46
fonte
4

Per praticità, i motivi principali per cui ho bisogno di usare una coda di messaggi sono:

  • Non ho dovuto reinventare la ruota. Progettare anche la coda dei messaggi più semplice utilizzando il database richiede almeno un paio di ore di riflessione, poche ore di codice e così via. Rispetto all'implementazione di una coda di messaggi, il tempo richiesto per configurare e / o automatizzare la configurazione è banale
  • Le code dei messaggi hanno un'interfaccia piacevole e chiara per produttore e consumatore. Questa è probabilmente la cosa più importante nella scrittura di un'applicazione. Senza l'interfaccia, le code di messaggi sono fondamentalmente solo una raccolta di dati
  • Le code di messaggi offrono più funzionalità che potrebbero essere necessarie in futuro

Per quanto riguarda consentire agli utenti di scegliere, questo è davvero un dettaglio di implementazione di cui gli utenti non dovrebbero preoccuparsi. Gli utenti dovrebbero avere la stessa interfaccia e non dovrebbe esserci differenza per gli utenti se viene utilizzata una coda di messaggi o di un database. Una volta impostato un singolo progetto, una scelta probabile per gli utenti è quanti nodi devono essere distribuiti per soddisfare le loro esigenze.

    
risposta data 26.06.2017 - 01:39
fonte
3

Come altri hanno già detto, la scala non è probabilmente importante qui. Il problema con l'utilizzo di due diversi meccanismi di archiviazione è l'integrazione delle transazioni.

Se si utilizza una coda di messaggi dedicata, è necessario scegliere una delle seguenti opzioni in caso di errore.

  1. Consenti che i dati possano essere su mb ma non su db
  2. Consenti che i dati possano essere in db ma non in mb
  3. Impostazione di commit a due fasi o transazioni distribuite tra db an mq che può essere complicato

Tutti questi problemi scompaiono se si salvano solo i dati in un'unica posizione utilizzando una normale transazione. Per questo motivo l'utilizzo di db come una coda di attività è una soluzione perfetta.

    
risposta data 24.06.2017 - 17:27
fonte
0

Ho creato una soluzione di coda messaggi Mssql in grado di gestire 20k operazioni al secondo, in base a un test delle prestazioni, e abbiamo bisogno di 10 / sec la maggior parte del tempo. Penso che il fatto che tu possa effettivamente avere una priorità incorporata è una caratteristica che manca alla coda dei messaggi dedicata. E questo era un requisito importante nel mio caso.

    
risposta data 11.10.2018 - 19:24
fonte

Leggi altre domande sui tag