Sfondo
Sto provando a progettare un layer / componente nella mia applicazione distribuita che comunicherà tra il componente A e il componente B.
In questo momento, questa "comunicazione" si realizza replicando un intero database dal server in cui il componente A vive sopra al componente B. Ma questo progetto si è rivelato molto fragile e troppo strettamente accoppiato. Voglio raccomandare al team di passare a una soluzione di messaggistica in cui A notifica a B un cambiamento di stato dei dati.
Domande
Ma ecco la domanda. A seconda della dimensione dei dati, posso
- invia i dati come parte del carico utile del messaggio,
- o semplicemente notifica a B che c'è qualcosa da fare a B / da afferrare.
Chiaramente, l'opzione 1 è più semplice perché non ho bisogno di scrivere troppo codice nella mia logica di sottoscrizione. Tuttavia, la realtà è che a volte (non troppo spesso) la dimensione dei dati può superare la dimensione massima consentita del messaggio. (userò mqtt per avviare il mio prototipo che come dimensione massima del carico utile di 268435455 byte)
Per quanto riguarda il design, mi rendo conto che è meglio per ogni servizio / componente (A e B) essere autonomo ... e semplicemente "sapere" cosa deve fare quando riceve un messaggio. Ma in termini pratici, cosa significa?
Ad esempio, considera questo caso d'uso:
"A" pubblica un messaggio che un nuovo widget è appena stato creato nel suo database. "B" è un abbonato sul canale "widget". Ottiene il messaggio che include quanto segue:
- action:CREATE
- widgetID: 123
Per ottenere i dati sul widget, dovrebbe B:
-
chiama un'API REST in esecuzione sul server A?
ad es. link
-
essere in grado di catturare i dati del widget dal payload del messaggio?
Altre domande potrebbero includere:
- quando dovrei considerare che il broker dei messaggi abbia successo? Quando viene consegnato il messaggio? O quando B ha una copia dei dati in questione?
- qualche buon articolo che sai di quello che posso leggere per aiutarti con questo tipo di design?
- che dire se ho appena evitato di inviare messaggi tutti insieme ... e ho scritto un'interfaccia CRUD per il componente B? "A" chiamerebbe l'interfaccia CRUD ogni volta che veniva modificato un widget. qual è il vantaggio di utilizzare il broker dei messaggi su questo tipo di soluzione?