Маршрутизация сервисного посредника

Область применения: SQL Server Управляемый экземпляр SQL Azure

В этой статье описаны сведения о том, как Service Broker направляет сообщения. Общие сведения см. в разделе Маршруты.

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

Описание процесса маршрутизации

В SQL Server используются два уровня сведений о маршрутизации. Каждая база данных содержит локальную таблицу маршрутизации для sys.routesбесед, начинающихся в этой базе данных. Если диалог запущен в пределах экземпляра SQL Server, сервер SQL Server выполняет поиск в таблице маршрутизации базы данных, создавшей диалог. Для бесед, поступающих из-за пределов экземпляра, SQL Server выполняет поиск msdb.sys.routes.

Базовый процесс сопоставления одинаков, вне зависимости от того, начинается ли разговор в сеансе или вне его. Процесс игнорирует маршруты, срок действия которых истек. Процесс маршрутизации состоит из трех отдельных шагов:

  1. Поиск соответствующих маршрутов: Service Broker находит набор возможных маршрутов, сопоставляя имя службы и идентификатор Service Broker.

  2. Выберите маршрут: Service Broker выбирает маршрут из набора возможных маршрутов.

  3. Найдите целевую службу: когда выбранный маршрут указывает 'LOCAL' в качестве сетевого адреса, компонент Service Broker находит службу в экземпляре. Если служба не существует в экземпляре, компонент Service Broker может вернуться на шаг 2 и выбрать другой маршрут.

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

Ответные сообщения из целевой службы

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

Поиск соответствующих маршрутов

Далее описывается, как SQL Server сопоставляет маршруты. Если на каком-то шаге будет найден хотя бы один возможный маршрут, процесс поиска возможных маршрутов завершается и компонент Service Broker выбирает один из совпадающих маршрутов (если их несколько) следующим образом.

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

  2. Найдите точное соответствие имени службы среди маршрутов, которые не указывают идентификатор Service Broker.

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

  4. Если маршрут к службе динамической маршрутизации присутствует, и запрос на маршрут к службе не ожидается, пометьте беседу с задержкой и запросите сведения о маршрутизации из этой службы.

  5. Найдите маршрут, который не указывает ни имя службы, ни идентификатор Service Broker.

  6. Если в беседе указывается идентификатор Service Broker, а экземпляр содержит одну или несколько баз данных с службами, имена которых совпадают с именем, указанным в беседе, направьте беседу, как будто в таблице маршрутизации был бы маршрут с именем службы и сетевым адресом 'LOCAL'.

  7. Пометьте задержку беседы.

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

Выбор маршрута

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

  1. Выберите один маршрут из маршрутов, указывающих зеркальный адрес.

  2. Выберите один маршрут из маршрутов, которые указывают 'LOCAL' в качестве сетевого адреса. Если этот экземпляр SQL Server не содержит службу, которая соответствует имени, указанному в разговоре, продолжайте с пункта 3.

  3. Выберите один маршрут из маршрутов, указывающих сетевой адрес.

  4. Выберите один маршрут из маршрутов, которые указывают 'TRANSPORT' в качестве сетевого адреса.

Если переадресация брокера не активна, компонент Service Broker удаляет сообщение, если беседа не начинается в текущем экземпляре, и адрес выбранного маршрута не равен 'LOCAL'.

Найдите службу назначения

Как описано ранее, Service Broker отправляет сообщения в службу в текущем экземпляре, когда соответствующий маршрут указывает 'LOCAL' в качестве сетевого адреса. Для сообщений, поступающих извне экземпляра, маршрут должен находиться в msdb.sys.routes. Для сообщений, поступающих в инстанции, соответствующий маршрут должен быть указан в таблице sys.routes для базы данных, инициирующей беседу.

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

В противном случае Service Broker находит службу, сначала ища ее имя в базе данных, содержащей диалог. Затем он ищет имя службы в других базах данных в пределах экземпляра. Компонент Service Broker доставляет сообщение первой обнаруженной службе. Однако порядок, в котором Service Broker выполняет поиск других баз данных в экземпляре, не определен и не гарантируется его однообразие от одного выполнения к другому. Это означает, что если в экземпляре существует более одной копии целевой службы, то компонент Service Broker случайным образом выбирает службу, на которую будет направлен запрос.

Другие вопросы

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

Циклы маршрутов

Реализованный в компоненте Service Broker механизм пересылки сообщений следит за числом пересылок сообщений, предотвращая образование бесконечных петель маршрутизации. Дополнительные сведения см. в разделе "Переадресация сообщений Service Broker".

Если совпадающий маршрут содержит сетевой адрес, который разрешается как адрес текущего экземпляра, SQL Server обрабатывает диалог так, как если бы он возникал вне экземпляра. Service Broker направляет сообщения для беседы с помощью маршрутов в msdb.sys.routes. Маршрутизация этих сообщений идентична маршрутизации сообщений извне экземпляра. В частности, пересылка сообщений должна быть активной для Service Broker, чтобы переслать сообщение на сетевой адрес, отличный от 'LOCAL'.

Зеркальные адреса

Маршруты с зеркальными адресами имеют наивысший приоритет при выборе маршрута из исходного набора соответствующих маршрутов. Однако Service Broker не учитывает зеркальные адреса при поиске соответствующих маршрутов для беседы.

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

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