Протоколы связи Service Broker

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

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

Уровни протокола

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

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

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

Смежный протокол брокера использует транспортный протокол, например TCP/IP, для перемещения сообщений от брокера к брокеру.

Протокол диалогового окна

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

Каждая сторона беседы — это конечная точка на уровне протокола диалога, в представлении sys.conversation_endpoints каталога отображаются сведения о конечных точках протокола диалога. Конечная точка беседы существует в течение всего времени существования беседы.

Смежный протокол брокера

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

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

Транспортный протокол

Уровень протокола транспорта обрабатывает фактическую сетевую передачу. Данный уровень находится за пределами компонента Service Broker. Например, сообщения компоненту Service Broker, выполняемому в другом экземпляре SQL Server, в качестве уровня транспортного протокола используют TCP/IP.

Конечные точки компонента Service Broker задают параметры транспортного протокола. SQL Server не содержит конечные точки Service Broker по умолчанию. Дополнительные сведения о создании конечной точки Service Broker см. в разделе "Практическое руководство. Активация сети Service Broker".

Обработка сообщений Service Broker

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

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

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

Фрагментация сообщения

Компонент Service Broker разбивает исходящие сообщения на фрагменты и объединяет входящие фрагменты в исходные сообщения. Для небольших сообщений весь текст содержится в одном фрагменте. Для больших сообщений компонент Service Broker создает много фрагментов.

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

При повторной сборке сообщения частичное сообщение хранится в конечной очереди. Если целевая очередь недоступна, она хранится в очереди передачи. Частичное сообщение не может быть получено приложением. Столбец status для частичного сообщения имеет 2 значение (отключено). Это значение также используется для сообщений, полученных вне порядка.

Подтверждение сообщения

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

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

Если подтверждение потеряно или отложено, получатель может получать повторяющиеся сообщения. В этом случае получатель подтверждает получение повторяющегося сообщения, но не доставляет повторяющееся сообщение в очередь.

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

Проверка целостности сообщений

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

Для проверки целостности сообщения служит подпись MD5 содержимого этого сообщения. SQL Server шифрует подпись сообщения ключом сеанса и включает ее в заголовок сообщения.

Место назначения для сообщения расшифровывает сообщение, а затем сравнивает подпись в сообщении с новой сигнатурой, вычисленной по факту полученного содержимого. Если подписи не соответствуют, сообщение повреждено или изменено во время передачи. Сообщение не проходит проверку целостности. SQL Server удаляет сообщение и не подтверждает сообщение отправителю. Класс события Broker:Corrupted Message оповещает, если сообщение не прошло проверку целостности.

Объекты передачи Service Broker

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

Диалоговое окно запрашивает объект передачи при выполнении следующих действий:

  • Отправляет сообщение через очередь передачи. Это включает следующее:

    • Все сообщения, отправленные в удаленный экземпляр компонента ядра СУБД.

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

  • Получает удаленное сообщение или сообщение, которое поступает из локальной очереди передачи.

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

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

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

Поток сетевого обмена данными

На следующем рисунке изображено высокоуровневое представление сетевого обмена данными с помощью компонента Service Broker между двумя экземплярами SQL Server.

Схема сетевого взаимодействия брокера между двумя экземплярами.

Беседа — это постоянное логическое соединение. Беседа может происходить в течение любого периода времени, и в течение этого периода беседа может использовать любое количество сетевых подключений.

Сетевое подключение осуществляется между двумя конечными точками компонента Service Broker. Эти подключения используют TCP/IP. Если сетевое подключение на протяжении короткого времени не проявляет активности, SQL Server закрывает его.

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