I database sono i rappresentanti di fatti. Non sono code di messaggi. Se vuoi sapere qual è lo stato attuale dei tuoi interessi, dovresti consultare un database. Se hai bisogno di sapere quando è cambiato lo stato dei tuoi interessi, dovresti invece iscriverti a un sistema di messaggistica a cui le parti che fanno pubblicare le modifiche.
Presso la nostra organizzazione, usiamo RabbitMQ, un broker AMQP. Esistono altri, come ActiveMQ (per amq) ed ejabberd (per xmpp).
L'uso di una soluzione del genere richiede ovviamente che le modifiche siano alimentate attraverso la coda dei messaggi oltre a essere persistenti nel database. Un'implementazione ragionevole potrebbe essere simile a questa:
Actor1 publishes change data to "changeRequest" exchange
ChangeDelegate subscribes to "changeRequest" queue
upon recipt, ChangeDelegate performs the change transaction
- if the transaction was successful, ChangeDelegate publishes
change data to the "changeNotification" exchange
- if the transaction failed, ChangeDelegate publishes change data
to the "changeFailed" exchange
Actor2 subscribes to the "changeNotification" and/or "changeFailed" queues.
Sarai molto soddisfatto dei risultati dell'integrazione di una coda di messaggistica adeguata nel tuo ecosistema. Rende molto più semplice l'aggiunta e la rimozione di funzionalità e l'adattamento di nuove funzionalità. Ad esempio, se la transazione per aggiornare il database è lenta, ma affidabile, un altro attore potrebbe invece iscriversi alla coda "changeRequest"
e ricevere una notifica tempestiva sulla modifica, anche prima che si verifichi (anche se alla fine potrebbe non riuscire)