Протоколы обмена данными компонента Service Broker

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

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

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

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

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

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

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

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

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

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

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

Каждое сетевое подключение компонента 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 (Transact-SQL).

Обработка сообщений компонентом 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 — это находящийся в памяти объект, который управляет и записывает состояние передачи сообщений для диалога. Каждая конечная точка диалога имеет один объект передачи.

Объект передачи необходим диалогу при выполнении следующих операций.

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

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

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

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

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

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

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

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

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

Сетевое взаимодействие между двумя экземплярами через компонент Service Broker

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

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

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

См. также

Основные понятия