Маршруты

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

Маршрут включает три основных компонента:

  • Имя службы
    Имя службы, для которой данный маршрут определяет адресацию. Это имя должно точно соответствовать Service Name в команде BEGIN DIALOG.

  • Идентификатор экземпляра брокера
    Уникальный идентификатор конкретной базы данных, которой должно быть отправлено сообщение. Он хранится в таблице sys.databases, в поле service_broker_guid строки, соответствующей базе данных, на которую указывает данный маршрут.

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

Чтобы определить маршрут доставки сообщений, передаваемых в ходе диалога, SQL Server сопоставляет имя службы и идентификатор экземпляра брокера, указанные в инструкции BEGIN DIALOG CONVERSATION, с именем службы и идентификатором экземпляра компонента Service Broker, указанными в маршруте. Маршруты, в которых не задано имя службы, соответствуют любым именам служб. Маршруты, в которых не задан идентификатор экземпляра брокера, соответствуют любым идентификаторам. Если требованиям диалога соответствует несколько маршрутов, SQL Server выбирает маршрут согласно принципам, описанным в разделе Маршрутизация компонента Service Broker.

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

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