Поделиться через


Группы сообщений

Группа сообщений определяет группу взаимосвязанных диалогов. Группа сообщений позволяет приложению легко координировать диалоги, связанные с конкретной бизнес-задачей.

Каждый диалог принадлежит одной группе сообщений. Каждая группа сообщений связана с конкретной службой, а все диалоги в группе представляют собой входящие или исходящие диалоги этой службы. Группа сообщений может содержать любое количество диалогов.

SQL Server использует группы диалогов для обеспечения доступа к сообщениям, связанным с определенной бизнес-задачей, строго по порядку. Когда приложение отправляет или получает сообщение, SQL Server блокирует группу сообщений, которой принадлежит это сообщение. Таким образом, сообщения для группы сообщений может одновременно получать только один сеанс. Блокировка группы сообщений гарантирует приложению возможность обработки сообщений каждого диалога строго по порядку. Поскольку группа сообщений может включать несколько диалогов, приложение может использовать ее для идентификации сообщений, связанных с одной бизнес-задачей, и обрабатывать такие сообщения вместе.

Участники диалога не имеют общей группы сообщений. Поэтому каждый участник диалога может группировать этот диалог по своему усмотрению. Приложение может управлять сложными взаимодействиями служб, не нуждаясь в их специальной поддержке.

Примеры групп сообщений

Приложение по управлению персоналом может иметь службу GetEmployeeInformation, объединяющую данные службы платежных ведомостей и службы льгот. Служба GetEmployeeInformation начинает диалог с каждой службой и связывает один диалог с другим в одну группу сообщений. Компонент Service Broker добавляет идентификатор группы сообщений к каждому входящему сообщению этих двух диалогов, независимо от того, приходят ли эти сообщения от службы платежных ведомостей или службы льгот. Поскольку эти диалоги находятся в одной группе сообщений, компонент Service Broker поставляет все сведения, необходимые службе GetEmployeeInformation для сопоставления данных о льготах с данными о зарплате, независимо от того, сколько запросов обрабатывается службой GetEmployeeInformation.

Сообщения службе платежных ведомостей и службе льгот не содержат сведений группы сообщений, соответствующей группе сообщений, созданной службой GetEmployeeInformation. Каждая служба работает независимо, и только служба GetEmployeeInformation сохраняет данные обо всей бизнес-задаче. Сохранение независимости служб упрощает написание программы для каждой службы и ее обслуживание. Другое преимущество поддержания независимости заключается в том, что если одна служба недоступна, другая служба может продолжать работать.

Организация состояния приложений

Одно из преимуществ групп сообщений состоит в том, что идентификатор группы сообщений служит удобным ключом для определения и выборки состояния приложения. Идентификатор группы сообщений облегчает поддержание состояния приложения в базе данных. Если выполнение задачи предполагает обмен многими сообщениями в течение некоторого времени, неэффективно будет оставлять экземпляр приложения запущенным только для того, чтобы сохранить состояние приложения. Приложение лучше масштабируется, если в перерыве между сообщениями данные, связанные с задачей, сохраняются в базе данных, а затем извлекаются, когда поступает следующее сообщение, связанное с этой задачей. Идентификатор группы сообщений может использоваться в качестве первичного ключа в таблице состояний, которую предоставляет разработчик приложения, чтобы быстро извлекать состояние, связанное с конкретной задачей. Дополнительные сведения об использовании идентификатора группы сообщений для поддержания состояния см. в разделе Управление состоянием.

Поскольку SQL Server блокирует группу сообщений каждый раз, когда приложение отправляет или принимает сообщение, приложение не нуждается в том, чтобы явно предотвращать действия другой программы по одновременному обновлению тех же данных состояния. Приложение просто блокирует группу сообщений, восстанавливает состояние, обрабатывает сообщения, обновляет состояние и завершает транзакцию.

Для удобства SQL Server позволяет приложению блокировать следующую доступную группу сообщений, не получая сообщения. Используя инструкцию GET CONVERSATION GROUP, приложение может блокировать группу сообщений и восстановить состояние до начала обработки сообщений. Дополнительные сведения см. в разделе инструкции GET CONVERSATION GROUP (Transact-SQL).

Время существования группы сообщений

Компонент Service Broker управляет временем существования группы сообщений. Не нужно явно создавать или удалять группу сообщений. Компонент Service Broker создает новую группу сообщений при следующих обстоятельствах:

  • Приложение начинает новый диалог, не связанный с существующей группой сообщений. Компонент Service Broker создает новую группу сообщений и присваивает ей новый идентификатор.

  • Приложение начинает диалог, связанный с идентификатором группы сообщений, которая в данный момент не существует. В этом случае компонент Service Broker создает новую группу сообщений с указанным идентификатором. Это означает, что идентификатору группы сообщений можно присвоить свое значение.

  • Компонент Service Broker получает первое сообщение в новом диалоге, начатом другой службой. В этом случае компонент Service Broker использует имя службы и идентификатор экземпляра Service Broker (если такой имеется), чтобы сделать следующее:

    1. найти соответствующую очередь;

    2. создать новую группу сообщений и связать ее с этой очередью;

    3. создать новый дескриптор диалога и добавить его к новой группе сообщений;

    4. поместить входящее сообщение в очередь.

Компонент Service Broker добавляет идентификатор группы сообщений к метаданным диалога, который создал группу диалогов. Каждый раз, когда компонент Service Broker получает сообщение для диалога, связанного с этой группой сообщений, компонент Service Broker добавляет к сообщению идентификатор группы сообщений, прежде чем поместить сообщение в очередь.

Идентификатор группы сообщений действителен с момента его создания компонентом Service Broker до завершения всех диалогов, связанных с этим идентификатором. Это означает, что действительность идентификатора группы сообщений гарантирована, пока активен хотя бы один диалог в группе.

Приложение, применяющее для управления состоянием приложения идентификатор группы сообщений, использует таблицы состояний, предусмотренные разработчиком. Приложение должно удалить это состояние из таблицы состояний, когда определяет, что состояние больше не нужно. Часто приложение удаляет состояние после успешного завершения задания или после того, как ошибки указывают, что это задание невозможно завершить. В этих случаях приложение обычно включает команду удаления состояния в транзакцию, которая отправляет последнее ответное сообщение и завершает диалог. Такой подход обеспечивает одинаковое время существования состояния приложения и идентификатора группы сообщений. Если операция отправки была неудачной, выполняется откат операции удаления. Точно так же, если операция удаления была неудачной, выполняется откат операции отправки, и SQL Server не отправляет сообщение. И в том, и в другом случае состояние приложения и идентификатор группы сообщений остаются действительными. Если обе операции проходят успешно, время существования идентификатора группы сообщений завершается в тот же момент, когда программа удаляет состояние соответствующего приложения.