Condividi tramite


Gruppi di conversazioni

Un gruppo di conversazioni, ovvero un insieme di conversazioni correlate, consente a un'applicazione di coordinare facilmente le conversazioni coinvolte in una determinata attività aziendale.

Ogni conversazione appartiene a un gruppo di conversazioni. Ogni gruppo di conversazioni è associato a un servizio specifico e tutte le conversazioni nel gruppo provengono o sono destinate a tale servizio. Un gruppo di conversazioni può contenere un numero qualsiasi 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. Pertanto, per un gruppo di conversazioni solo una sessione alla volta può ricevere messaggi. Il blocco del gruppo di conversazioni garantisce un'unica elaborazione dei messaggi in ogni conversazione rispettando l'ordine di invio. Un gruppo di conversazioni può contenere più conversazioni. Un'applicazione quindi può utilizzare tali gruppi per identificare i messaggi correlati alla stessa attività aziendale ed elaborare tali messaggi congiuntamente.

Un gruppo di conversazioni non è condiviso tra i partecipanti a una conversazione. Ogni partecipante è quindi libero di raggruppare la conversazione nel modo desiderato. Un'applicazione può gestire interazioni complesse tra i servizi senza alcun supporto speciale da parte dei 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 nelle due conversazioni, indipendentemente dal servizio da cui proviene il messaggio. Dato che 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. L'indipendenza dei servizi contribuisce a semplificare la stesura del codice e la manutenzione di ogni servizio. Un ulteriore vantaggio di tale indipendenza è dato dal fatto che quando uno dei servizi non è disponibile l'altro continua a funzionare.

Organizzazione dello stato dell'applicazione

Un vantaggio del gruppo di conversazioni consiste nel fatto che il relativo identificatore rappresenta una comoda chiave 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à implica lo scambio di numerosi messaggi nel tempo, non è efficiente mantenere in esecuzione un'istanza dell'applicazione solo per mantenere lo stato dell'applicazione. La scalabilità dell'applicazione è migliore se tra un messaggio e l'altro tutti i dati associati all'attività vengono archiviati nel database e quindi recuperati alla ricezione del messaggio successivo associato a tale attività. L'identificatore del gruppo di conversazioni può essere utilizzato come chiave primaria in una tabella di stato fornita dallo sviluppatore dell'applicazione per consentire un recupero rapido dello stato associato a un'attività particolare. Per ulteriori 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 i 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. Mediante l'istruzione GET CONVERSATION GROUP un'applicazione può bloccare un gruppo di conversazioni e ripristinare lo stato prima dell'elaborazione dei messaggi. Per informazioni, vedere l'istruzione GET CONVERSATION GROUP (Transact-SQL).

Durata di un gruppo di conversazioni

La durata del gruppo di conversazioni è gestita da Service Broker e non è quindi necessario creare o distruggere esplicitamente un gruppo di conversazioni. Service Broker crea un nuovo gruppo di conversazioni nelle seguenti circostanze:

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

  • Un'applicazione avvia una conversazione correlata a un identificatore di gruppo di conversazioni non esistente. In questo caso, Service Broker crea un nuovo gruppo di conversazioni con l'identificatore specificato. Questo significa che è possibile assegnare il valore desiderato all'identificatore di un gruppo di conversazioni.

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

    1. Individuazione della coda appropriata.

    2. Creazione di un nuovo gruppo di conversazioni e associazione di questo alla coda.

    3. Creazione di un nuovo handle di conversazione e aggiunta di questo al nuovo gruppo di conversazioni.

    4. Inserimento dei messaggi in arrivo nella coda.

Service Broker aggiunge l'identificatore del gruppo di conversazioni ai metadati per la conversazione che ha dato origine al gruppo di conversazioni. Ogni volta che Service Broker riceve un messaggio per una conversazione associata al gruppo di conversazioni, aggiunge l'identificatore del gruppo di conversazioni al messaggio prima di inserirlo nella coda.

L'identificatore di un gruppo di conversazioni è valido dal momento in cui viene creato da Service Broker fino al termine di tutte le conversazioni associate ad esso. In altre parole, l'identificatore del gruppo di conversazioni è sicuramente valido finché nel gruppo sono presenti conversazioni attive.

Un'applicazione che utilizza l'identificatore del gruppo di conversazioni per gestire lo stato delle applicazioni utilizza una tabella di stato fornita dallo sviluppatore. Quando l'applicazione rileva che lo stato non è più necessario, lo deve eliminare dalla tabella di stato. In molti casi, lo stato viene eliminato al termine dell'attività o quando alcuni errori segnalano l'impossibilità di completare l'attività. In previsione di questi casi, l'applicazione in genere include il comando di eliminazione dello stato all'interno della transazione che invia il messaggio di risposta finale e termina la conversazione. Questa strategia garantisce la stessa durata per lo stato dell'applicazione e l'identificatore del gruppo di conversazioni. Se l'operazione di invio non è possibile, 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 il messaggio non viene inviato da SQL Server. In entrambi i casi, lo stato dell'applicazione e l'identificatore del gruppo di conversazioni rimangono validi. Se entrambe le operazioni vengono completate, la durata dell'identificatore del gruppo di conversazioni termina nel momento esatto in cui il programma elimina lo stato dell'applicazione associato.