Ho appena letto questo articolo e sono confuso.
Immaginiamo 1 webapp e 1 distinta applicazione che funge da "worker", entrambi condividendo lo stesso database .
Oh, ho detto "condivisione" .. ma di cosa parla l'articolo? :
In quarto luogo, condividere un database tra applicazioni (o servizi) è una cosa negativa. È troppo allettante per mettere lo stato amorfo condiviso lì e prima che tu lo sappia avrai un mostro enormemente accoppiato.
=> non sono d'accordo. Ci sono alcuni casi in cui applicazioni distinte fanno ancora parte della stessa unità e, pertanto, la nozione di "problema dell'accoppiamento" non ha senso in questo caso.
Continuiamo: la webapp gestisce le richieste HTTP del client e può aggiornare in qualsiasi momento alcuni aggregati (termine DDD), generando gli eventi di dominio corrispondenti.
L'obiettivo del lavoratore sarebbe quello di gestire quegli eventi di dominio elaborando i lavori necessari.
Il punto è:
Come devono essere trasmessi i dati sugli eventi al lavoratore?
La prima soluzione, come promuove l'articolo letto, sarebbe usare RabbitMQ, essendo un ottimo middleware orientato ai messaggi.
Il flusso di lavoro sarebbe semplice:
Ogni volta che il web dyno genera un evento, lo pubblica tramite RabbitMQ, che nutre il lavoratore.
Lo svantaggio sarebbe che nulla garantisce l' immediata coerenza tra il commit dell'aggiornamento aggregato e la pubblicazione dell'evento, senza affrontare i potenziali errori di invio ... o problemi hardware; questo è un altro problema principale.
Esempio: sarebbe possibile che un evento sia stato pubblicato senza successo dell'aggiornamento aggregato ... risultante in un evento che rappresenta una falsa rappresentazione del modello di dominio.
Si potrebbe sostenere che esiste un XA globale (commit in due fasi), ma non è una soluzione che si adatta a tutti i database o middleware.
Quindi quale potrebbe essere una buona soluzione per garantire questa coerenza immediata? :
IMO, memorizzando l'evento nel database, nella stessa transazione locale dell'aggiornamento aggregato.
Un semplice programmatore asincrono verrebbe creato e responsabile di interrogare gli eventi non pubblicati correnti dal database e inviarli a RabbitMQ, che a sua volta popola il lavoratore.
Ma perché è necessario un programmatore aggiuntivo sul lato webapp e comunque: perché in questo caso è necessario RabbitMQ?
Con questa soluzione, sembra logicamente che RabbitMQ potrebbe non essere necessario, soprattutto perché il database è condiviso.
In effetti, in ogni caso, abbiamo visto che la coerenza immediata comporta un polling dal database.
Quindi, perché il lavoratore non dovrebbe essere direttamente responsabile di questo sondaggio?
Pertanto, mi chiedo perché così tanti articoli sul web criticano difficilmente l'accodamento dei database, promuovendo nel contempo il middleware orientato ai messaggi.
Estratto dell'articolo:
Semplice, usa lo strumento giusto per il lavoro: questo scenario richiede un sistema di messaggistica. Risolve tutti i problemi sopra descritti; niente più polling, consegna efficiente dei messaggi, nessuna necessità di cancellare i messaggi completati dalle code e nessuno stato condiviso.
E consistenza immediata, ignorata?
Per riassumere, sembra davvero che qualunque sia il caso, ovvero database condiviso o meno, abbiamo bisogno del polling del database .
Ho perso alcune nozioni critiche?
Grazie