Gruppo di conversazioni

Si applica a:SQL ServerIstanza gestita di SQL di Azure

Un gruppo di conversazioni identifica un gruppo di conversazioni correlate. Un gruppo di conversazioni consente a un'applicazione di coordinare facilmente le conversazioni coinvolte in un'attività commerciale specifica.

Ogni conversazione appartiene a un gruppo di conversazioni. Ciascun gruppo di conversazioni è associato a un servizio specifico e tutte le conversazioni nel gruppo sono conversazioni da o verso tale servizio. Un gruppo di conversazioni può contenere qualsiasi numero di conversazioni.

SQL Server utilizza i gruppi di conversazioni per garantire il recapito di messaggi inviati una sola volta rispettando l'ordine di invio per i messaggi correlati a un'attività aziendale specifica. Quando un'applicazione invia o riceve un messaggio, SQL Server blocca il gruppo di conversazioni a cui il messaggio appartiene. Quindi, solo una sessione alla volta può ricevere messaggi per il gruppo di conversazioni. Il blocco del gruppo di conversazioni garantisce che un'applicazione possa elaborare i messaggi in ogni conversazione esattamente una volta rispettando l'ordine di invio. Poiché un gruppo di conversazioni può contenere più conversazioni, un'applicazione può usare gruppi di conversazioni per identificare i messaggi correlati alla stessa attività commerciale ed elaborarli insieme.

Un gruppo di conversazioni non viene condiviso tra i partecipanti a una conversazione. Quindi, ogni partecipante di una conversazione è libero di raggruppare la conversazione come opportuno. Un'applicazione può gestire interazioni complesse tra i servizi, senza richiedere alcun supporto speciale dai servizi.

Esempi di gruppi di conversazioni

Si supponga che un'applicazione per la gestione delle risorse umane disponga di un servizio GetEmployeeInformation che combina le informazioni tratte da un servizio di gestione delle retribuzioni e le informazioni tratte da un servizio di gestione benefit. Il servizio GetEmployeeInformation avvia una conversazione con ogni servizio, quindi associa una conversazione all'altra nello stesso gruppo di conversazioni. Service Broker aggiunge l'identificatore del gruppo di conversazioni a ogni messaggio in arrivo in queste due conversazioni, indipendentemente dal fatto che il messaggio arrivi dal servizio di retribuzione o dei benefit. Poiché le conversazioni si trovano nello stesso gruppo di conversazioni, Service Broker fornisce tutte le informazioni necessarie per l'abbinamento delle informazioni sui benefit e le retribuzioni da parte del servizio GetEmployeeInformation, indipendentemente dal numero di richieste in corso nel servizio GetEmployeeInformation.

I messaggi al servizio di gestione delle retribuzioni e al servizio di gestione benefit non contengono informazioni relative al gruppo di conversazioni creato da GetEmployeeInformation. Ogni servizio opera in modo indipendente e solo il servizio GetEmployeeInformation mantiene le informazioni relative all'intera attività aziendale. Mantenere i servizi indipendenti l'uno dall'altro consente di semplificare il codice di ogni servizio e la manutenzione. Un altro vantaggio di mantenere questa indipendenza è che se un servizio non è disponibile, l'altro può continuare a funzionare.

Organizzazione dello stato dell'applicazione

Uno dei vantaggi del gruppo di conversazioni è che l'identificatore del gruppo è una chiave utile per identificare e recuperare lo stato dell'applicazione. L'identificatore del gruppo di conversazioni semplifica la gestione dello stato dell'applicazione nel database. Se l'esecuzione di un'attività comporta lo scambio di molti messaggi nel tempo, è inefficiente mantenere un'istanza dell'applicazione in esecuzione solo per gestire lo stato dell'applicazione. Un'applicazione viene ridimensionata meglio se, tra i messaggi, tutti i dati associati all'attività vengono archiviati nel database e quindi vengono recuperati quando viene ricevuto il messaggio successivo associato a tale attività. L'identificatore del gruppo di conversazioni può essere usato come chiave primaria, in una tabella di stato fornita da uno sviluppatore di applicazioni, per abilitare il recupero rapido dello stato associato a una determinata attività. Per altre informazioni sull'utilizzo dell'identificatore del gruppo di conversazioni per il mantenimento dello stato, vedere Gestione dello stato.

Poiché SQL Server blocca il gruppo di conversazioni ogni volta che un'applicazione invia o riceve un messaggio, non è necessario che un'applicazione impedisca esplicitamente a un altro programma l'aggiornamento degli stessi dati di stato nello stesso momento. L'applicazione blocca il gruppo di conversazioni, ripristina lo stato, elabora messaggi, aggiorna lo stato e quindi esegue il commit della transazione.

Per comodità, SQL Server consente a un'applicazione di bloccare il successivo gruppo di conversazioni disponibile senza ricevere un messaggio. Usando l'istruzione GET CONVERSATION GROUP, un'applicazione può bloccare un gruppo di conversazioni e ripristinare lo stato, prima di elaborare i messaggi. Per informazioni dettagliate, vedere l'istruzione GET CONVERSATION GROUP (Transact-SQL).

Durata del gruppo di conversazioni

Service Broker gestisce il ciclo di vita del gruppo di conversazioni. Non è necessario creare o eliminare in modo esplicito un gruppo di conversazioni. Service Broker crea un nuovo gruppo di conversazioni nelle seguenti circostanze:

  • Un'applicazione avvia una nuova conversazione non correlata a un gruppo di conversazioni esistente. Service Broker crea un nuovo gruppo di conversazioni e assegna un nuovo identificatore al gruppo.

  • Un'applicazione avvia una conversazione correlata a un identificatore del gruppo di conversazioni che non esiste attualmente. In questo caso, Service Broker crea un nuovo gruppo di conversazioni con l'identificatore specificato. Ciò significa che è possibile assegnare il valore che si desidera a un identificatore del gruppo di conversazioni.

  • Service Broker riceve il primo messaggio in una nuova conversazione avviata da un altro servizio. In questo caso, Service Broker usa il nome del servizio e l'identificatore dell'istanza del broker (se presente) per eseguire le seguenti operazioni:

    1. Individuare la coda appropriata.

    2. Creare un nuovo gruppo di conversazioni e associarlo alla coda.

    3. Creare un nuovo handle di conversazione e aggiungerlo al nuovo gruppo di conversazioni.

    4. Inserire il messaggio in arrivo in coda.

Service Broker aggiunge l'identificatore del gruppo di conversazioni ai metadati per la conversazione che ha creato il gruppo. Ogni volta che Service Broker riceve un messaggio per qualsiasi conversazione associata al gruppo di conversazioni, aggiunge l'identificatore del gruppo di conversazioni a tale messaggio prima di immetterlo nella coda.

Un identificatore del gruppo di conversazioni è valido dal momento in cui Service Broker lo crea fino al termine di tutte le conversazioni associate all'identificatore. Quindi, l'identificatore del gruppo di conversazioni è garantito che sia valido mentre qualsiasi conversazione nel gruppo è attiva.

Un'applicazione che usa l'identificatore del gruppo di conversazioni per gestire lo stato dell'applicazione sfrutta una tabella di stato fornita dallo sviluppatore. L'applicazione deve eliminare lo stato dalla tabella quando l'applicazione determina che non è più necessario. In molti casi, l'applicazione elimina lo stato dopo il completamento dell'attività o quando degli errori indicano che l'attività non può essere completata. In questi casi, l'applicazione include in genere il comando per eliminare lo stato all'interno della transazione che invia il messaggio di risposta finale e chiude la conversazione. Questa strategia garantisce che lo stato dell'applicazione e l'identificatore del gruppo di conversazioni abbiano la stessa durata. Se l'operazione di invio non riesce, viene eseguito il rollback dell'operazione di eliminazione. Analogamente, se l'operazione di eliminazione non è possibile, viene eseguito il rollback dell'operazione di invio e SQL Server non invia il messaggio. In entrambi i casi, lo stato dell'applicazione e l'identificatore del gruppo di conversazioni rimangono validi. Se entrambe le operazioni hanno esito positivo, la durata dell'identificatore del gruppo di conversazioni termina in contemporanea all'eliminazione dello stato dell'applicazione associato.

Vedi anche