Debezium, Kafka e .Net Core (Italian)

Fernando Mendes
6 min readNov 25, 2020

--

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)

I record di Change Data Capture inseriscono, aggiornano ed eliminano le attività applicate a una tabella di SQL Server. Fornisce inoltre i dettagli delle modifiche in un formato relazionale facilmente utilizzabile. Le informazioni sulle colonne ei metadati richiesti per applicare le modifiche in un ambiente di destinazione vengono acquisiti per le righe modificate e archiviati nelle tabelle delle modifiche che rispecchiano la struttura della colonna delle tabelle di origine tracciate. Le funzioni valutate della tabella sono fornite per consentire l’accesso sistematico ai dati di modifica da parte dei consumatori
Debezium ha molti altri connettori per i database principali come Mongo, Oracle, MySql e tra gli altri.

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:

201 (Created)

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!

--

--

Fernando Mendes
Fernando Mendes

Written by Fernando Mendes

Software Architect .NET C# | Microsoft MVP 🏆🏆 | Co-Founder community JunDevelopers

No responses yet