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