Приоритеты диалогов

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

Использование приоритетов диалога

Приоритеты диалога можно использовать в следующих целях.

  • Идентификация диалогов, имеющих более высокий приоритет по сравнению с другими.

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

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

Приоритеты и конечные точки диалога

Приоритеты диалога создаются в каждой базе данных с помощью инструкции CREATE BROKER PRIORITY. В каждом приоритете диалога определяются следующие параметры.

  • Имя приоритета диалога.

  • Уровень приоритета, который должен быть назначен диалогам компонента Service Broker. В качестве уровней используются целочисленные значения от 1 (самый низкий уровень) до 10 (самый высокий уровень). Значение по умолчанию 5.

  • В качестве критерия для назначения диалогам уровней приоритета используются:

    • имя контракта или ANY;

    • имя локальной службы или ANY;

    • имя удаленной службы или ANY.

Компонент Service Broker назначает уровни приоритета конечным точкам диалога при создании конечных точек. У каждого диалога есть две конечные точки.

  • Конечная точка — инициатор диалога связывает одну сторону диалога с вызывающей службой и очередью инициатора. Конечная — точка-инициатор диалога создается во время выполнения инструкции BEGIN DIALOG. С конечной точкой — инициатором диалога связаны следующие операции:

    • отправка сообщений вызывающей службой;

    • получение сообщений из очереди инициатора;

    • получение следующей группы сообщений из очереди инициатора.

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

    • получение сообщений из цели;

    • отправка сообщений целевой службой;

    • получение следующей группы сообщений из целевой очереди.

Какая служба считается локальной или удаленной, зависит от типа конечной точки диалога.

  • Для конечной точки — инициатора диалога на инициаторе вызывающая служба считается локальной, а целевая служба — удаленной.

  • Для целевой конечной точки диалога целевая служба считается локальной, а вызывающая служба — удаленной.

Назначение компонентом Service Broker уровней приоритета

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

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

Контракт конечной точки

Локальная служба конечной точки

Удаленная служба конечной точки

Контракт приоритета

Локальная служба приоритета

Удаленная служба приоритета

Контракт приоритета

Локальная служба приоритета

ANY

Контракт приоритета

ANY

Удаленная служба приоритета

Контракт приоритета

ANY

ANY

ANY

Локальная служба приоритета

Удаленная служба приоритета

ANY

Локальная служба приоритета

ANY

ANY

ANY

Удаленная служба приоритета

ANY

ANY

ANY

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

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

  • Один приоритет диалога, в котором указаны имя контракта, используемое диалогом, и ANY в качестве имен локальной и удаленной служб, может использоваться обеими конечными точками диалога.

  • Для каждой конечной точки диалога может использоваться отдельный приоритет:

    • один приоритет диалога для конечной точки-инициатора, в котором в качестве параметра LOCAL_SERVICE_NAME указано имя вызывающей службы, а в качестве параметра REMOTE_SERVICE_NAME указано имя целевой службы;

    • один приоритет диалога для целевой конечной точки, в котором в качестве параметра LOCAL_SERVICE_NAME указано имя целевой службы, а в качестве параметра REMOTE_SERVICE_NAME указано имя вызывающей службы.

Обеим конечным точкам диалога обычно назначается одинаковый уровень приоритета. Хотя каждой конечной точке диалога можно назначить различные уровни приоритета, обработка сообщений в одном направлении не будет более быстрой, чем в другом направлении. Сообщения отправляются из одной конечной точки диалога и приходят в другую конечную точку. Поэтому на передачу каждого сообщения влияют уровни приоритета обеих конечных точек. Например, можно настроить диалог таким образом: конечная точка — инициатор диалога имеет уровень приоритета 10, целевая конечная точка имеет уровень приоритета 1. В этом случае:

  • сообщения передаются от вызывающей службы с уровнем приоритета 1, а приходят из целевой очереди цели с приоритетом 1;

  • сообщения передаются от целевой службы с уровнем приоритета 1, а приходят из очереди инициатора с приоритетом 10.

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

  • диалог является членом группы;

  • в данный момент диалог содержит сообщения в очереди обслуживания.

Если приоритеты диалога не созданы в базе данных, всем конечным точкам диалога в базе данных назначается приоритет по умолчанию 5.

Приоритеты диалогов не влияют на перенаправление сообщений; для перенаправления всегда используется уровень приоритета 5.

Пример приоритета диалога

Рассмотрим следующую систему.

  • База данных InitiatorDB содержит службу InitiatorService и очередь InitiatorQueue.

  • База данных TargetDB содержит службу TargetService и очередь TargetQueue.

  • Контракт SimpleContract указывает, что сообщения RequestMessages направляются от службы InitiatorService к службе TargetService. В нем также указано, что сообщения ReplyMessages направляются от службы TargetService к службе InitiatorService.

Приведенный ниже сценарий задает уровень приоритета для конечной точки — инициатора диалога и связанных с ней операций:

  • операции SEND для отправки сообщений RequestMessage от службы InitiatorService в очередь TargetQueue;

  • операции RECEIVE для получения сообщений ReplyMessage из очереди InitiatorQueue.

USE InitiatorDB;
GO
CREATE BROKER PRIORITY InitiatorToTargetPriority
    FOR CONVERSATION
    SET (CONTRACT_NAME = SimpleContract,
         LOCAL_SERVICE_NAME = InitiatorSerivce,
         REMOTE_SERVICE_NAME = N'TargetService',
         PRIORITY_LEVEL = 3);
GO

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

  • операции RECEIVE для получения сообщений RequestMessage из очереди TargetQueue;

  • операции SEND для отправки сообщений ReplyMessage от службы TargetService в очередь InitiatorQueue.

USE TargetDB;
GO
CREATE BROKER PRIORITY TargetToInitiatorPriority
    FOR CONVERSATION
    SET (CONTRACT_NAME = SimpleContract,
         LOCAL_SERVICE_NAME = TargetService,
         REMOTE_SERVICE_NAME = N'InitiatorService',
         PRIORITY_LEVEL = 3);
GO

Как работают приоритеты

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

Уровни приоритета при получении

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

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

  • Каждая инструкция RECEIVE получает сообщения от одной группы сообщений.

    • Инструкция RECEIVE, не содержащая предложений WHERE, получает сообщения для наиболее приоритетной незаблокированной группы сообщений, сообщения которой имеются в очереди.

    • Инструкция RECEIVE, содержащая предложения WHERE, получает сообщения для группы сообщений, указанной в предложении WHERE.

  • В рамках группы сообщений инструкция RECEIVE получает сообщения в зависимости от уровня приоритета сообщений в группе. Сначала выполняется получение всех сообщений диалога с самым высоким приоритетом, затем сообщений диалога со следующим уровнем приоритета и т. д.

  • В рамках группы сообщений получение выполняется в той последовательности, в которой сообщения были отправлены.

Инструкция GET CONVERSATION GROUP возвращает группу с наиболее высоким уровнем приоритета из числа незаблокированных групп, сообщения которых имеются в очереди

Уровни приоритета при передаче

Передача сообщений, находящихся в очередях передачи экземпляра, выполняется в последовательности, которая определяется:

  • уровнем приоритета связанной с ними конечной точки диалога;

  • в рамках уровня приоритета — последовательностью отправки в ходе диалога.

Координация уровней приоритета по всем очередям передачи в экземпляре компонента Database Engine выполняется компонентом Service Broker. Сначала компонент Service Broker передает сообщения из диалогов с уровнем приоритета 10, затем из диалогов с уровнем приоритета 9 и т. д.

Чем больше разница между уровнями приоритета, тем сильнее отличается производительность обработки их сообщений. В системе, использующей два смежных уровня приоритета, например 9 и10, производительность обработки сообщений с более высоким уровнем приоритета не будет сильно отличаться от производительности обработки сообщений с более низким уровнем. В системе, использующей два сильно разнесенных уровня приоритета, например 1 и 10, производительность обработки сообщений с более высоким уровнем приоритета будет выгодно отличаться от производительности обработки сообщений с более низким уровнем. В системах с несколькими уровнями приоритета большинству операций обработки назначаются верхние два или три уровня приоритета.

Уровни приоритетов диалогов применяются к сообщениям из очереди передачи только в том случае, если для параметра HONOR_BROKER_PRIORITY базы данных установлено значение ON. Если для параметра HONOR_BROKER_PRIORITY установлено значение OFF, отправка всех сообщений, находящихся в очереди передачи для базы данных, выполняется с уровнем приоритета по умолчанию 5. В представлении sys.transmission_queue для сообщения отображается уровень приоритета, назначенный сообщению в конечной точке, однако при передаче сообщения используется уровень приоритета, установленный по умолчанию.

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

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

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

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

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