Хранение сообщений
Если в очереди указано хранение сообщений, компонент Service Broker не удаляет сообщения из очереди до завершения диалога. Кроме того, компонент Service Broker копирует в очередь и исходящие сообщения. Это позволяет службе вести точный список входящих и исходящих сообщений.
Хранение сообщений дает возможность вести точный журнал диалога для службы, пока диалог остается активным. Для приложений, которым необходим подробный аудит или которые должны выполнять компенсирующие транзакции в случае ошибки диалога, такой подход может оказаться более удобным, чем копирование каждого сообщения в таблицу состояний, пока идет диалог.
Хранение сообщений увеличивает число сообщений в очереди для активных диалогов и повышает объем работы, выполняемой SQL Server при отправке сообщения. Поэтому хранение сообщений снижает производительность. Конкретное значение потерь производительности зависит от схемы связи для служб, использующих очередь. Обычно следует использовать хранение сообщений всегда, когда оно необходимо для правильной работы приложения. Если приложению не нужен точный список всех сообщений, отправленных и полученных, пока диалог остается активным, сохранение состояния в таблице состояний может повысить производительность. Также следует помнить, что в момент завершения диалога хранимые сообщения удаляются из очереди, и если хранение используется в целях аудита, необходимо предусмотреть копирование сообщений в постоянное хранилище перед завершением диалога.
Примечание |
---|
Использование хранения сообщений может снизить производительность. Эту возможность следует использовать только в случае, если соглашение об уровне обслуживания приложения требует хранить точные копии отправленных и полученных сообщений. |
Сообщения в очереди, готовые к получению, имеют состояние 1. Инструкция RECEIVE возвращает сообщения, в которых указано состояние 1. После того, как инструкция RECEIVE возвращает сообщение, оно устанавливает состояние в 0 и оставляет сообщение в очереди, если включено хранение сообщений. Если хранение сообщений выключено, инструкция RECEIVE удаляет сообщение из очереди. Любая служба, использующая очередь, сохраняет входящие и исходящие сообщения. В этом случае команда SEND копирует сообщения в очередь для службы (задавая для параметра status значение 3), а также добавляет сообщение в очередь для передачи. При завершении диалога очередь удаляет все сообщения для этого диалога.
Приложение не может получить одно сообщение дважды и не может получить сообщение, которое добавлено в очередь в качестве исходящего. Для работы с сохраненными сообщениями применяются запросы очереди с помощью инструкции SELECT. В целях аудита приложение вставляет сохраненные сообщения в таблицу аудита перед завершением диалога. В ходе компенсирующих транзакций приложение обычно проходит по обработанным сообщениям в обратном направлении и последовательно отменяет каждое сообщение, пока не будут обработаны все сообщения.
Дополнительные сведения об использовании инструкции SELECT для доступа к очереди см. в разделе Запросы очередей.
См. также