Conversazioni di dialogo

Si applica a:SQL ServerIstanza gestita di SQL di Azure

Tutti i messaggi inviati da Service Broker fanno parte di una conversazione. Un dialogo è una conversazione tra due servizi. Un dialogo è un flusso bidirezionale affidabile e permanente di messaggi tra due servizi.

I dialoghi consentono il recapito di messaggi inviati una sola volta rispettando l'ordine di invio (EOIO, exactly-once-in-order). I dialoghi usano l'identificatore di conversazione e i numeri di sequenza contenuti in ogni messaggio per identificare i messaggi correlati e recapitare i messaggi nell'ordine corretto. Un dialogo è un flusso affidabile e permanente di messaggi tra due servizi.

Una conversazione di dialogo ha due partecipanti. L'iniziatore avvia la conversazione. La destinazione accetta una conversazione avviata dall'iniziatore. Il fatto che un partecipante inizi la conversazione determina i messaggi che il partecipante può inviare, come specificato nel contratto della conversazione. Il seguente diagramma mostra il flusso dei messaggi in un dialogo:

Message flow between initiator and target

Le applicazioni si scambiano messaggi come parte del dialogo. Quando riceve un messaggio per un dialogo, SQL Server lo inserisce nella coda relativa al dialogo. L'applicazione riceve il messaggio dalla coda ed elabora il messaggio in base alle esigenze. Durante l'elaborazione, l'applicazione potrebbe inviare messaggi all'altro partecipante del dialogo.

Recapito affidabile

I dialoghi includono gli acknowledgment di ricezione automatici dei messaggi per garantire un recapito affidabile. Service Broker salva ogni messaggio in uscita nella coda di trasmissione fino a quando non riceve l’acknowledgment del messaggio da parte del servizio remoto. Gli acknowledgment automatici consentono di risparmiare tempo e risorse. Permettono infatti di evitare che un’applicazione debba inviare l'acknowledgment esplicito di ogni messaggio. Se possibile, i messaggi di acknowledgment vengono inclusi nei messaggi restituiti per il dialogo.

Nota

Service Broker gestisce i messaggi di acknowledgment internamente. Questi messaggi non vengono visualizzati in una coda e non vengono recapitati all'applicazione. Service Broker non considera errore un servizio remoto non raggiungibile. In questo caso, i messaggi per il servizio non raggiungibile vengono mantenuti da Service Broker finché il servizio non è di nuovo raggiungibile o la durata del dialogo non scade.

Durata del dialogo

I messaggi possono essere scambiati tra applicazioni durante il ciclo di vita del dialogo. che inizia dal momento in cui il dialogo viene creato dall'istanza locale di SQL Server fino al momento in cui un'applicazione termina esplicitamente il dialogo o riceve un messaggio di errore associato al dialogo. Ogni partecipante è responsabile di terminare in modo esplicito la conversazione quando l'applicazione riceve un messaggio che indica un errore o la fine della conversazione. Nella maggior parte dei servizi, un partecipante è responsabile di indicare che la conversazione è completa e ha esito positivo, chiudendo la conversazione senza errori. Se questa operazione viene eseguita dalla destinazione o dall'iniziatore dipende dallo scopo della conversazione.

L'istanza locale di Service Broker per un'applicazione di origine crea un endpoint di conversazione per il dialogo quando questo viene iniziato dall'applicazione. L'istanza locale di Service Broker per un'applicazione di destinazione crea un endpoint di conversazione per il dialogo quando l'istanza riceve il primo messaggio del dialogo.

I dialoghi possono anche garantire che la durata di una conversazione non superi un limite specificato. L'applicazione di avvio può facoltativamente specificare una durata massima di dialogo. Entrambe le istanze locale e remota di Service Broker tengono traccia di questa durata. Quando un dialogo raggiunge la propria durata massima, ogni lato della conversazione inserisce un messaggio di errore di timeout nella coda del servizio e rifiuta nuovi messaggi di dialogo. Le conversazioni non superano mai la durata massima stabilita all'avvio del dialogo. Si noti che, mentre un'applicazione può comunque ricevere messaggi per la conversazione dopo aver terminato la conversazione, nessun nuovo messaggio può arrivare in quella conversazione. L'applicazione non può inviare messaggi sulla conversazione.

Alle applicazioni è delegato il compito di indicare il completamento di un dialogo terminandolo in modo esplicito. Service Broker non termina mai un dialogo automaticamente. Il dialogo rimane nel database fino a quando un'applicazione non termina esplicitamente la conversazione. Quindi, anche quando si verifica il timeout del dialogo o il broker segnala un errore, ogni partecipante della conversazione deve emettere in modo esplicito l'istruzione END CONVERSATION.

Timer di conversazione

Un timer di conversazione consente a un'applicazione di ricevere un messaggio in un momento specifico. Quando il timer di conversazione scade, SQL Server inserisce un messaggio nella coda della conversazione in corrispondenza dell'endpoint di avvio del timer di conversazione. Un'applicazione può usare un timer di conversazione per qualsiasi scopo. Il timer di conversazione viene usato comunemente, ad esempio, per rispondere ai ritardi nelle risposte del servizio remoto. o per creare un servizio che invia messaggi al servizio remoto a intervalli prestabiliti. Un servizio può, ad esempio, utilizzare un timer di conversazione per segnalare lo stato corrente di SQL Server a intervalli di alcuni minuti. Le applicazioni possono anche usare un timer di conversazione per attivare una stored procedure in un determinato momento. In questo modo Service Broker è in grado di supportare attività pianificate.

Ciascun partecipante di una conversazione può impostare un timer di conversazione per ogni conversazione. Il timer della conversazione non viene condiviso con l'altro partecipante e non influisce sulla durata della conversazione. Al contrario, alla scadenza del timer l'istanza locale di Service Broker aggiunge un messaggio di timeout alla coda del servizio locale. Un messaggio di timeout ha il nome del tipo https://schemas.microsoft.com/SQL/ServiceBroker/DialogTimer

Vedi anche