Condividi tramite


Gruppi 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 in 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

Un'applicazione per le risorse umane potrebbe avere un GetEmployeeInformation servizio che combina informazioni da un servizio di retribuzione e informazioni da un servizio vantaggi. Il GetEmployeeInformation servizio inizia una conversazione con ogni servizio e mette in relazione una conversazione con l'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 il GetEmployeeInformation servizio in modo che corrispondano alle informazioni sui vantaggi delle informazioni sulle retribuzioni, indipendentemente dal numero di richieste in corso nel GetEmployeeInformation servizio.

I messaggi al servizio di retribuzione e i messaggi al servizio benefits non contengono informazioni sul gruppo di conversazioni per il gruppo di conversazioni creato da GetEmployeeInformation. Ogni servizio opera in modo indipendente e solo il GetEmployeeInformation servizio mantiene informazioni sull'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.

Organizzare lo 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 mantenere 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 consentire il recupero rapido dello stato associato a una determinata attività. Per altre informazioni sull'uso dell'identificatore del gruppo di conversazioni per mantenere lo stato, vedere Gestione dello stato.

Poiché SQL Server blocca il gruppo di conversazioni ogni volta che un'applicazione invia o riceve un messaggio, un'applicazione non deve impedire esplicitamente a un altro programma di aggiornare contemporaneamente gli stessi dati sullo stato. 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 .

Durata del gruppo di conversazioni

Service Broker gestisce la durata 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 dopo errori indica 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 ha esito negativo, l'operazione di invio esegue il rollback 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.