Monitorare le tabelle di Azure SQL Database con Change Event Streaming

di Cristian Civera, in Azure SQL Database,

Azure SQL Database e un servizio PaaS completamente gestito che ci consente di eseguire database relazionali nel cloud senza occuparci di patching, backup e alta disponibilita. Possiamo beneficiare di scalabilita automatica, integrazione nativa con l'ecosistema Azure e un modello di sicurezza avanzato. Tra i vantaggi principali troviamo la riduzione dell'overhead operativo e la possibilita di adattare le risorse in base al carico; tra gli svantaggi dobbiamo considerare una maggiore attenzione ai costi e alcuni limiti rispetto a un'istanza completamente gestita on premise.

Uno dei problemi piu comuni quando utilizziamo Azure SQL Database in architetture moderne e il monitoraggio efficiente delle modifiche sulle tabelle. Se dobbiamo integrare microservizi, sistemi di auditing o pipeline di analytics, non possiamo permetterci di interrogare continuamente le tabelle con logiche di polling. Questo approccio genera carico inutile e aumenta la latenza. Abbiamo quindi bisogno di una soluzione che intercetti in modo nativo le operazioni INSERT, UPDATE e DELETE e le trasformi in eventi pronti per essere consumati.

La soluzione e utilizzare Change Event Streaming verso Azure Event Hubs. Change Event Streaming intercetta in modo nativo le operazioni DML generate dal database, legge le informazioni dal transaction log e le converte in eventi strutturati in formato standard, pronti per essere pubblicati su un broker di messaggistica. In questo modo il database diventa una sorgente di eventi quasi real time, senza introdurre query di polling o logiche applicative aggiuntive, mantenendo un'architettura disaccoppiata e scalabile. 

Per provare concretamente la soluzione iniziamo creando un namespace e un Event Hub in Azure, quindi definiamo una SAS policy con permesso Send.

Recuperiamo la chiave primaria e generiamo un token SAS tramite PowerShell. Un esempio pratico di generazione e il seguente:

$namespace = "mioNamespace"
$eventHub  = "mioEventHub"
$policy    = "sender" // deve coincidere con la policy usata
$key       = "chiave base 64"

# durata token (es. 50 anni)
$expiry = [double][double]::Parse(
    (Get-Date).AddYears(50).ToUniversalTime().
    Subtract([datetime]'1970-01-01').TotalSeconds
)

$resourceUri = "https://$namespace.servicebus.windows.net/$eventHub"
$encodedUri  = [System.Web.HttpUtility]::UrlEncode($resourceUri)

$stringToSign = "$encodedUri`n$expiry"

$hmac = New-Object System.Security.Cryptography.HMACSHA256
$hmac.Key = [Text.Encoding]::UTF8.GetBytes($key)

$signature = [Convert]::ToBase64String(
    $hmac.ComputeHash([Text.Encoding]::UTF8.GetBytes($stringToSign))
)

$encodedSignature = [System.Web.HttpUtility]::UrlEncode($signature)

$sasToken = "SharedAccessSignature sr=$encodedUri&sig=$encodedSignature&se=$expiry&skn=$policy"

$sasToken

Una volta ottenuto il token configuriamo Change Event Streaming nel database creando le credenziali con il token SAS e definendo l'endpoint HTTPS completo, ad esempio https://mioNamespace.servicebus.windows.net/ eseguendo il seguente script.

-- Creazione della master key per memorizzare le credenziali
CREATE MASTER KEY
ENCRYPTION BY PASSWORD = 'StrongPassword!';

-- Creazione credenziali
CREATE DATABASE SCOPED CREDENTIAL EventHubCredential
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
SECRET = 'SharedAccessSignature ottenuto da PowerShell ...';

-- Abilitazione CES
EXEC sys.sp_enable_event_stream;

-- Configurazione stream
EXEC sys.sp_create_event_stream_group
    @stream_group_name = N'Stream',
    @destination_type = N'AzureEventHubsAmqp',
    @destination_location = N'mioNamespace.servicebus.windows.net/mioEventHub',
    @destination_credential = EventHubCredential,
    @max_message_size_kb = 256,
    @partition_key_scheme = N'None';

-- Configuro quale tabella monitorare sullo stream
EXEC sys.sp_add_object_to_event_stream_group
    N'Stream',
    N'dbo.miaTabella';

Dopo aver associato lo stream alle tabelle desiderate eseguiamo alcune operazioni DML di test. Possiamo quindi accedere al Data Explorer di Event Hubs e verificare la presenza degli eventi in formato application/avro-json.

Con questo approccio otteniamo un monitoraggio efficiente e scalabile delle modifiche, evitando polling e riducendo la latenza. In alternativa al SAS possiamo utilizzare il modello basato su Entra ID, e oltre a Amqp è supportato anche il protocollo Kafka. Per amministrare e controllare l'intera configurazione di Change Event Streaming possiamo fare riferimento alle viste di sistema, alle funzioni e alle stored procedure dedicate messe a disposizione dal motore. Consultando la documentazione ufficiale disponibile all'indirizzo https://learn.microsoft.com/en-us/sql/relational-databases/track-changes/change-event-streaming/configure?view=sql-server-ver17 possiamo approfondire l'utilizzo.

Commenti

Visualizza/aggiungi commenti

| Condividi su: LinkedIn, Facebook

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi