Debezium, Kafka e .Net Core (Italian)
Ciao a tutti, va tutto bene?
Al giorno d’oggi la crescita di applicazioni distribuite, microservizi per risolvere problemi di business per un’azienda è nota.
All’inizio degli anni 2000, avevamo una sola applicazione che faceva tutto, il famoso monolite ed era molto difficile o quasi impossibile scalare questa applicazione sui server che erano ospitati nei data center della sede dell’azienda.
Gli ambienti cloud sono cresciuti in modo esponenziale, e anche il concetto di separazione dei contesti ha portato noi architetti, sviluppatori, a creare soluzioni sempre più veloci e con meno accoppiamenti.
Per questo, abbiamo bisogno di separare il database, in modo che ogni banca abbia informazioni specifiche per ogni contesto e dobbiamo avere, in un certo modo, una sincronizzazione di questi dati in diversi altri database. Come per esempio:
Questo esempio, in modo semplice, mostra che quando si registra un nuovo dipendente, le informazioni del dipendente possono trovarsi in altri sistemi. Ogni sistema (box) ha il suo database.
Come faremo ad avere le stesse informazioni negli altri 3 database?
Possiamo farlo con la messaggistica, mettendo RabbitMQ per orchestrare tutto questo. Dove ogni sistema riceve un messaggio con i dati del dipendente da elaborare.
È un ottimo approccio, e funziona molto bene, ma se i consumatori possono dare problemi, come ad esempio uno di loro ha cercato di connettersi alla base, ed è uscito, i messaggi non verranno elaborati, causando differenze di informazioni tra i consumatori;
Per risolvere questo problema, utilizzeremo Kafka Connect.
Kafka Connect è un servizio che non funziona da solo, dobbiamo installare plugin per connetterci ai database. In questo esempio useremo come plugin per monitorare il database Debezium (sorgente).
Cos’è Debezium?
Debezium è un insieme di servizi distribuiti per acquisire le modifiche nei database in modo che le applicazioni possano vedere e rispondere a tali modifiche.
Debezium registra tutte le modifiche a livello di riga in ogni tabella del database in un flusso di eventi di modifica e le applicazioni leggono semplicemente questi flussi per vedere gli eventi di modifica nello stesso ordine in cui si sono verificati.
Secondo la documentazione, Debezium è in grado di acquisire modifiche come Insert, Delete, Update dal mio database e creare un argomento in Kafka, affinché un’altra applicazione possa utilizzarlo.
Ma affinché Debezium funzioni, SQL Server deve abilitare la funzionalità Change Data Capture (CDC)
Per il nostro esempio, utilizzeremo SQL Server e un’applicazione che utilizza argomenti Kafka.
Dai, prima di tutto, creiamo un’istanza di SQL Server. Creerò il database tramite il container Docker:
docker run -e ACCEPT_EULA=Y -e SA_PASSWORD = [password] -e MSSQL_PID =Developer -p 1433: 1433 -e MSSQL_AGENT_ENABLED = true -d mcr.microsoft.com/mssql/server:2019-latest
Per utilizzare Debezium su SQL Server, dovremo abilitare SQL Server Agent. L’Agente monitorerà le modifiche apportate dal database e quindi Debezium acquisirà i dati da inviare a Kafka. Quindi la variabile -e MSSQL_AGENT_ENABLED=true
Dopo aver caricato il container di SQL Server, creeremo un database denominato TesteEF e una tabella denominata Person e abiliteremo CDC
Vedi che c’è l’esecuzione della procedure sys.sp_cdc_enable_db questo comando abiliterà il funzionamento di CDC nel tuo database.
E la procedure sys.sp_cdc_enable_table assocerà la tabella che verrà monitorata dal CDC, nel nostro caso la tabella Person
Una volta configurato, caricheremo i container Zooekeeper, Kafka e Kafka Connect, per configurare Debezium
Presta attenzione all’indirizzo IP in KAFKA_ADVERTISED_LISTENERS e BOOTSTRAP_SERVER. Aggiungi la macchina in esecuzione
Ora, dopo che i container sono in esecuzione, configuriamo su Kafka Connect con il plugin Debezium, con le impostazioni del nostro database
Inizialmente possiamo controllare, tutti i plugin installati su Kafka Connect a questo URL: http://youripserver:8083/connector-plugins
Il servizio Kafka Connect ti fornisce questa API per interrogare i plugin. E useremo anche l’API per configurare il plugin Debezium per SQL Server, che monitorerà il nostro database.
Sono andato su Postman, e all’URL http://youripserver:8083/connector, andremo tramite POST, aggiungeremo le impostazioni:
Vedi l’immagine sopra, le impostazioni per il container Debezium
database.hostname => Server in cui si trova il tuo database
database.port => porta SQL Server
database.user => Il tuo utente del database
database.password => La password del tuo database
database.dbname => Quale database verrà monitorato
database.server.name => Un nome per essere un server
table.whitelist => Quale tabella verrà monitorata
database.history.kafka.bootstrap.servers => Cluster Kafka
database.history.kafka.topic => Nome del database che memorizzerà i messaggi dell’argomento in Kafka
Dopo aver aggiunto le impostazioni, eseguiremo questa richiesta in Postman e il risultato sarà questo:
Con ciò la configurazione viene eseguita in Kafka Connect.
Il nome che verrà generato da Kafka, per ottenere i messaggi, sarà la combinazione di queste proprietà:
database.server.name + table.whitelist
Con questo il nostro argomento sarà: dbserver1.dbo.Person
Prima di inserire un record in SQL Server, userò un’applicazione che ho realizzato in C#, che si trova sul mio GitHub, dove riceverò tutti i messaggi inviati da SQL Server da Kafka Connect tramite topic
Questa console sarà il consumatore dell’argomento che Kafka Connect genererà con le modifiche apportate alla tabella in SQL Server.
Vedi che nella proprietà BootstrapServers, metteremo l’indirizzo del servizio Kafka, che è in esecuzione sulla macchina. E sulla riga 22, Iscriviti con il nome dell’argomento.
Esegui la tua applicazione e inseriscila nel tuo database;
Dopo l’inserimento, vedi che nella console il record che hai inserito nel tuo database.
Ora cambiamo il record:
Visualizza nella console la modifica che hai apportato al tuo database
Controlla che tutte le modifiche apportate a SQL Server, la mia applicazione sarà in grado di consumare. Questo grazie a Kafka Connect;
Bene gente, questo è un semplice esempio di come risolvere un problema che potremmo avere nei sistemi distribuiti. Stiamo qui utilizzando container, probabilmente nelle vostre applicazioni produttive, di sicuro la migliore sarà l’installazione di Kafka standalone o Cloud (Confluence) per avere maggiori prestazioni.
Ci sono diversi problemi che possiamo risolvere con questo tipo di soluzione, e spero che questo tipo di articolo possa aiutare le persone a capire di più su Kafka e anche a risolvere alcuni problemi;
Il 31 agosto, il mio amico Ray Carneiro e io abbiamo fatto un live sul canale JunDevelopers, parlando di questo argomento. Ma lì abbiamo maggiori dettagli, e anche questo live usando il connettore MongoDB Sink, dove MongoDb riceve i messaggi dall’argomento Kafka. Vedi lì ..
In Portoghese:
Spero che ti sia piaciuto!
Al prossimo!