Conservazione dei messaggi

Si applica a:SQL ServerIstanza gestita di SQL di Azure

Quando una coda specifica la memorizzazione dei messaggi, Service Broker non elimina i messaggi in coda fino al termine della conversazione. Inoltre, Service Broker copia anche i messaggi in uscita nella coda. Ciò consente al servizio di registrare con precisione i messaggi in ingresso e in uscita.

La memorizzazione dei messaggi consente di registrare con precisione una conversazione nella coda mentre la conversazione è attiva. Per le applicazioni che richiedono un controllo dettagliato o che devono eseguire transazioni di compensazione quando la conversazione ha esito negativo, questo metodo può risultare più pratico rispetto al dover copiare ogni messaggio in una tabella di stato mentre la conversazione è in corso.

La memorizzazione dei messaggi aumenta il numero di messaggi nella coda per le conversazioni attive nonché il numero di operazioni eseguite da SQL Server durante l'invio di un messaggio, Quindi, la memorizzazione dei messaggi riduce le prestazioni. L'impatto esatto sulle prestazioni dipende dai modelli di comunicazione per i servizi che usano una coda. In generale, è consigliabile usare la memorizzazione dei messaggi nei casi in cui è necessaria affinché un'applicazione funzioni correttamente. Se l'applicazione non richiede una registrazione esatta di tutti i messaggi inviati e ricevuti mentre la conversazione è attiva, la gestione dello stato in una tabella di stato può migliorare le prestazioni. Occorre tenere presente che quando termina la conversazione, i messaggi conservati vengono rimossi dalla coda, quindi se si usa la memorizzazione a scopo di controllo, è necessario assicurarsi di copiare i messaggi in una risorsa di archiviazione permanente prima di terminare la conversazione.

Nota

Usare la memorizzazione dei messaggi può ridurre le prestazioni. Questa impostazione deve essere usata solo se il contratto di servizio dell'applicazione richiede che l'applicazione mantenga i messaggi esatti inviati e ricevuti. I messaggi in una coda pronti per la ricezione hanno lo stato 1. L'istruzione RECEIVE restituisce i messaggi che mostrano lo stato 1. Dopo che l'istruzione RECEIVE restituisce un messaggio, imposta lo stato su 0 e lascia il messaggio in coda, se la memorizzazione dei messaggi è attiva. Se la memorizzazione dei messaggi è disattivata, l'istruzione RECEIVE elimina il messaggio dalla coda. Tutti i servizi che usano la coda salvano sia i messaggi in ingresso che in uscita. In questo caso, il comando SEND copia i messaggi nella coda relativa al servizio (con il valore dello stato impostato su 3) e aggiunge i messaggi nella coda di trasmissione. Al termine di una conversazione, la coda elimina tutti i messaggi della conversazione.

Un'applicazione non può ricevere lo stesso messaggio due volte e un'applicazione non può ricevere un messaggio aggiunto alla coda come messaggio in uscita. Per usare la memorizzazione dei messaggi, usare un'istruzione SELECT per eseguire una query nella coda. Per consentire di eseguire il controllo, un'applicazione inserisce i messaggi memorizzati in una tabella di controllo prima di terminare la conversazione. Per le transazioni di compensazione, un'applicazione lavora tipicamente a ritroso sui messaggi elaborati e annulla il lavoro per ogni messaggio in successione, fino a quando tutti i messaggi sono stati elaborati.

Per ulteriori informazioni sull'utilizzo delle istruzioni SELECT per accedere a una coda, vedere Esecuzione query sulle code.

Vedi anche