Маршрутизация компонента Service Broker

В этом разделе подробно описано, как компонент 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', компонент Service Broker доставляет сообщения службе, относящейся к текущему экземпляру. В случае сообщений, поступающих извне экземпляра, маршрут должен содержаться в таблице 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 механизм пересылки сообщений следит за числом пересылок сообщений, предотвращая образование бесконечных петель маршрутизации. Дополнительные сведения см. в разделе Пересылка сообщений компонентом 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 надежно доставляет сообщения в тех ситуациях, когда участник и партнер могут взаимодействовать, но экземпляр, отправляющий сообщение, не может получить доступ к участнику.