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"
$sasTokenUna 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
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Rendere affidabile lo scale out su Azure App Service
Blazor e InputHidden in .NET 10
Testare le API di Azure Resource Manager con API Playground
Personalizzare i parametri del CSS Scroll Snap
Creare un indice su una colonna JSON in SQL Server
Usare i generics di C# con la clausola nameof in modo semplificato
Configurare OpenTelemetry per Application Insights su ASP.NET Core
Gestione opzioni colonna nella Blazor QuickGrid
Enterprise Live Migrations - Migrare da Azure DevOps a GitHub
Validazione personalizzata nelle Minimal API di ASP.NET Core
Breaking the Legacy Barrier: how to Use AI to Modernize Applications
Proteggere l'endpoint dell'agente A2A delle Logic App


