If the User Management Service is scaling, leading to multiple instances running at the same time, how can it be ensured that the logic doesn't add the same user twice?
Qui ci sono un paio di risposte diverse.
Un buon punto di partenza sarebbe Nobody Needs Messaging affidabile di Marc de Graauw. L'idea di base è che i messaggi multipli hanno la stessa semantica aziendale, e quindi i consumatori possono rifiutare i duplicati stessi.
Questo a sua volta significa spingere all'indietro attraverso il protocollo; se abbiamo due copie di una richiesta HTTP, possibilmente separate nel tempo, che tentiamo di creare lo "stesso" utente, allora due istanze del Servizio di gestione utenti che gestiscono tali richieste dovrebbero finire per provare ad aggiungere eventi semanticamente equivalenti allo store.
Con questa proprietà, ogni consumatore può utilizzare la semantica del messaggio per eliminare i duplicati.
Le implementazioni dell'archivio eventi possono essere utili con Pubblicazione condizionale . Ad esempio, Event Store ottiene ciò supportando un expected version parametro nel comando write.
In una gara tra produttori concorrenti, i due scrittori saranno in competizione per scrivere sulla stessa versione prevista del flusso; un produttore avrà successo, e il secondo fallirà - il secondo produttore, quindi, sa che la sua rappresentazione localizzata nella cache del flusso non è aggiornata. Può quindi aggiornare la cache e riprovare a elaborare il messaggio.
In altre parole, le scritture sulle raccolte di eventi vengono raggiunte da confrontare e scambiare della coda di riferimento , piuttosto che "append".
Per quanto ne so, nel 2017 Kafka non supporta la pubblicazione condizionale. La esattamente una volta la consegna funzione in 0.11 non sembra gestire questo caso.
Più processi che scrivono sulla stessa partizione di eventi potrebbero non essere ciò che vuoi. Ragionare sul comportamento di una singola autorità è molto più facile. Anziché disporre di più istanze del servizio di gestione utenti che condividono l'autorizzazione per scrivere su un singolo flusso, è meglio servire creando più flussi, ciascuno con una singola autorità (in sostanza, ogni flusso distinto ha il proprio elezioni dei leader ).
I don't think I understood the last part 100%, though; would that look somewhat like this: i.imgur.com/b0C2xNV.png?
Sì, nel senso che ogni servizio utente ha il proprio argomento (libro del record) per gli eventi di output. Ma, inoltre, vuoi essere sicuro che tutti gli eventi relativi a un'entità specifica nel tuo modello vengano scritti sullo stesso argomento. Quindi ci sarebbe una logica responsabile per garantire che ogni comando venga gestito dall'istanza autorevole del servizio utente per quell'entità.