Condividi tramite


Memorizzazione dei messaggi

Se per una coda è specificata la memorizzazione dei messaggi, Service Broker non elimina messaggi dalla coda fino al termine della conversazione e copia inoltre i messaggi in uscita nella coda. In questo modo il servizio è in grado di gestire un record preciso dei messaggi in ingresso e in uscita.

La memorizzazione dei messaggi consente di gestire un record esatto di una conversazione relativa a una coda mentre la conversazione è attiva. Per applicazioni per cui è necessario un controllo dettagliato o che devono eseguire transazioni di compensazione quando la conversazione ha esito negativo, questa situazione può essere più conveniente rispetto alla copia di 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, con la conseguente riduzione delle prestazioni. L'impatto esatto sulle prestazioni dipende dai modelli di comunicazione per i servizi che utilizzano la coda. In generale, è necessario utilizzare la memorizzazione dei messaggi tutte le volte che tale funzionalità è necessaria per il corretto funzionamento di un'applicazione. Se per l'applicazione non è necessario un record esatto di tutti i messaggi inviati e ricevuti mentre la conversazione è attiva, la gestione delle informazioni sullo stato in una tabella di stato può migliorare le prestazioni. È inoltre opportuno ricordare che quando la conversazione termina i messaggi mantenuti vengono rimossi dalla coda. Di conseguenza, se si utilizza la memorizzazione per scopi di controllo, è necessario assicurarsi di copiare i messaggi in un archivio permanente prima di terminare la conversazione.

[!NOTA]

L'utilizzo della memorizzazione dei messaggi può ridurre le prestazioni. È pertanto opportuno utilizzare questa impostazione solo se per il contratto di servizio dell'applicazione è necessario che l'applicazione mantenga i messaggi inviati e ricevuti esatti.

I messaggi in una coda già ricevuti hanno lo stato 1. L'istruzione RECEIVE restituisce messaggi per cui il valore dello stato è 1. Dopo che l'istruzione RECEIVE restituisce un messaggio, lo stato viene impostato su 0 e il messaggio viene lasciato nella coda, se l'impostazione di memorizzazione è attivata. Se la memorizzazione dei messaggi è disattivata, il messaggio viene eliminato dalla coda tramite l'istruzione RECEIVE. Qualsiasi servizio che utilizza la coda salva sia messaggi in ingresso che quelli 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. Quando la conversazione termina, tutti i messaggi relativi alla conversazione vengono eliminati dalla coda.

Un'applicazione non può ricevere due volte lo stesso messaggio né può ricevere un messaggio aggiunto alla coda come messaggio in uscita. Per utilizzare i messaggi mantenuti, è necessario utilizzare un'istruzione SELECT per eseguire una query sulla coda. Per il controllo, un'applicazione inserisce i messaggi mantenuti in una tabella di controllo prima di terminare la conversazione. Per le transazioni di compensazione, un'applicazione in genere procede a ritroso tra i messaggi elaborati e annulla le operazioni eseguite per ogni messaggio, fino a quando non sono stati elaborati tutti i messaggi.

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