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


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

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

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

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

Приоритеты беседы можно использовать для выполнения следующих действий:

  • Определите беседы, имеющие приоритет над другими пользователями.

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

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

Приоритеты беседы и конечные точки беседы

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

  • Имя приоритета беседы.

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

  • Критерии, определяющие, какие беседы применяются к следующему уровню приоритета:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ЛЮБАЯ

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

ЛЮБАЯ

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

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

ЛЮБАЯ

ЛЮБАЯ

ЛЮБАЯ

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

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

ЛЮБАЯ

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

ЛЮБАЯ

ЛЮБАЯ

ЛЮБАЯ

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

ЛЮБАЯ

ЛЮБАЯ

ЛЮБАЯ

Сначала компонент 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. В данном случае:

  • Сообщения, передаваемые из службы инициатора с помощью уровня приоритета 10, получаются из целевой очереди с использованием уровня приоритета 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 = InitiatorService,
             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.

  • В группе бесед ПОЛУЧЕНИЕ извлекает сообщения в зависимости от уровня приоритета бесед в группе. Сначала извлекаются все сообщения из беседы с наивысшим уровнем приоритета, а затем сообщения для беседы с следующим уровнем приоритета и т. д.

  • В беседе сообщения извлекаются в той же последовательности, что и они были отправлены.

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

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

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

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

  • последовательности отправки в диалоге при одинаковом приоритете.

Service Broker координирует уровни приоритета во всех очередях передачи в экземпляре ядро СУБД. Service Broker сначала передает сообщения из приоритетных 10 бесед во всех очередях передачи, а затем сообщения из приоритетных 9 бесед и т. д.

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

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

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

Сообщения и фрагменты сообщений могут отправляться в порядке приоритета:

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

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

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

См. также