Continuo a tornare a questo QA. E non ho trovato abbastanza sfumate le risposte esistenti, quindi sto aggiungendo questa.
TL; DR. Sì o No, a seconda dell'utilizzo dell'approvvigionamento di eventi.
Esistono due tipi principali di sistemi di origine evento di cui sono a conoscenza.
Processori di eventi a valle = Sì
In questo tipo di sistema, gli eventi accadono nel mondo reale e sono registrati come fatti. Come un sistema di magazzino per tenere traccia dei pallet di prodotti. Non ci sono praticamente eventi contrastanti. È già successo tutto, anche se era sbagliato. (Vale a dire il pallet 123456 messo sul camion A, ma era previsto per il camion B.) Successivamente i fatti vengono controllati per le eccezioni tramite meccanismi di segnalazione. Kafka sembra adatto per questo tipo di down-stream, applicazione per l'elaborazione di eventi.
In questo contesto, è comprensibile il motivo per cui la gente di Kafka lo sta proponendo come soluzione di approvvigionamento di eventi. Perché è abbastanza simile a come viene già utilizzato, ad esempio, nei flussi di clic. Tuttavia, le persone che usano il termine Event Sourcing (in contrapposizione a Stream Processing) si riferiscono probabilmente al secondo utilizzo ...
Fonte di verità controllata dall'applicazione = No
Questo tipo di applicazione dichiara i propri eventi a seguito di richieste degli utenti che passano attraverso la logica aziendale. Kafka non funziona bene in questo caso per due motivi principali.
Mancanza di isolamento dell'entità
Questo scenario richiede la possibilità di caricare il flusso di eventi per un'entità specifica. Il motivo comune per questo è costruire un modello di scrittura temporaneo che la logica aziendale deve utilizzare per elaborare la richiesta. Fare questo è poco pratico in Kafka. L'uso dell'argomento per entità potrebbe consentire ciò, tranne per il fatto che si tratta di un non-principiante quando ci possono essere migliaia o milioni di entità. Ciò è dovuto ai limiti tecnici di Kafka / Zookeeper.
Uno dei motivi principali per utilizzare un modello di scrittura temporaneo in questo modo è rendere le modifiche della logica di business economiche e facili da implementare.
L'uso di topic-per-type è raccomandato invece per Kafka, ma ciò richiederebbe il caricamento di eventi per ogni entità di quel tipo solo per ottenere eventi per una singola entità. Poiché non è possibile stabilire in base alla posizione del registro quali eventi appartengono a quale entità. Anche usando le istantanee per iniziare da una posizione di registro nota, questo potrebbe essere un numero significativo di eventi da sfogliare.
Mancanza di rilevamento dei conflitti
In secondo luogo, gli utenti possono creare condizioni di gara a causa di richieste simultanee contro la stessa entità. Potrebbe essere abbastanza indesiderabile salvare eventi in conflitto e risolverli dopo il fatto. Quindi è importante essere in grado di prevenire eventi contrastanti. Per ridimensionare il carico delle richieste, è comune utilizzare i servizi senza stato e prevenire conflitti di scrittura utilizzando le scritture condizionali (scrivere solo se l'ultimo evento dell'entità era #x). Concorrenza ottimistica di Aka. Kafka non supporta la concorrenza ottimistica. Anche se lo supportasse a livello di argomento, dovrebbe essere fino al livello dell'entità per essere efficace. Per utilizzare Kafka e prevenire eventi contrastanti, è necessario utilizzare un writer con stato con serializzazione a livello di applicazione. Si tratta di un requisito / limitazione architettonica significativa.
Ulteriori informazioni
Aggiornamento per commento
Il commento è stato eliminato, ma la domanda era qualcosa del genere: cosa usano le persone per l'archiviazione degli eventi?
Sembra che la maggior parte delle persone esegua l'implementazione dell'archiviazione degli eventi su un database esistente. Per scenari non distribuiti, come back-end interni o prodotti autonomi, è ben documentato come creare un archivio eventi basato su SQL. E ci sono librerie disponibili su database di vario genere. C'è anche EventStore , che è stato progettato per questo scopo.
In scenari distribuiti, ho visto un paio di implementazioni diverse. Il progetto Jet Panther usa Azure CosmosDB , con la funzionalità Feed di modifica per avvisare i listener. Un'altra implementazione simile di cui ho sentito parlare su AWS è l'utilizzo di DynamoDB con la sua funzione Stream per avvisare gli ascoltatori. La chiave di partizione probabilmente dovrebbe essere l'id del flusso per la migliore distribuzione dei dati (per ridurre la quantità di over-provisioning). Tuttavia, un replay completo attraverso gli stream in Dynamo è costoso (letto e dal punto di vista dei costi). Quindi questo impianto è stato anche configurato per Dynamo Streams per scaricare eventi su S3. Quando un nuovo ascoltatore viene online, o un ascoltatore esistente desidera un replay completo, leggerebbe S3 per primo.
Il mio progetto attuale è uno scenario multi-tenant e ho realizzato il mio oltre a Postgres. Qualcosa come Citus sembra appropriato per la scalabilità, partizionamento per tentant + stream.
Kafka è ancora molto utile in scenari distribuiti. È un problema non banale esporre gli eventi di ciascun servizio ad altri servizi. Un negozio di eventi non è stato creato per questo in genere, ma è esattamente ciò che Kafka fa bene. Ogni servizio ha una propria fonte interna di verità (potrebbe essere la memorizzazione di eventi o altro), ma ascolta Kafka per sapere cosa sta succedendo "all'esterno". Il servizio può anche pubblicare eventi a Kafka per informare il "fuori" di cose interessanti che il servizio ha fatto.