Condividi tramite


Conservazione dei messaggi

Si applica a:SQL ServerIstanza gestita di SQL di Azure

Quando una coda specifica la conservazione dei messaggi, Service Broker non elimina i messaggi dalla 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 un record esatto di tutti i messaggi inviati e ricevuti mentre la conversazione è attiva, il mantenimento dello stato in una tabella di stato potrebbe migliorare le prestazioni. Tenere inoltre presente che quando termina la conversazione, i messaggi conservati vengono rimossi dalla coda, quindi se si usa la conservazione 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. È consigliabile usare questa impostazione 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 messaggi che mostrano lo stato 1. Dopo che l'istruzione RECEIVE restituisce un messaggio, imposta lo stato su 0 e lascia il messaggio nella coda se la conservazione dei messaggi è attiva. Se la conservazione 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 per il servizio (con un status di 3) e inoltre aggiunge i messaggi alla 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 i messaggi conservati, usare un'istruzione SELECT per eseguire una query sulla 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 altre informazioni sull'uso SELECT delle istruzioni per accedere a una coda, vedere Code di query.