Назначение компонента Service Broker
Компонент Service Broker помогает создавать асинхронные слабосвязанные приложения, в которых независимые компоненты совместно выполняют ту или иную задачу. Эти компоненты обмениваются сообщениями, которые содержат данные, необходимые для выполнения задачи. В этом разделе описываются следующие аспекты компонента Service Broker:
диалоги;
упорядочение и координация сообщений;
асинхронное программирование на основе транзакций;
поддержка слабосвязанных приложений;
составные части компонента 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. Как правило, администратору не приходится выполнять обыденные задачи сопровождения, связанные с компонентом Service Broker.
Система компонента Service Broker предоставляет простой интерфейс языка Transact-SQL для отправки и приема сообщений, а также гарантирует доставку и обработку сообщений. Компонент Service Broker гарантирует, что программа получит каждое сообщение диалога только один раз в том порядке, в котором сообщения были отправлены, а не помещены в очередь. Традиционные системы управления очередями предоставляют сообщения в том порядке, в котором они были помещены в очередь. Вследствие этого, приложение должно определять порядок сообщений и группировать их должным образом. Компонент Service Broker гарантирует, что две сущности, извлекающие сообщения из очереди, не смогут одновременно обрабатывать сообщения одного диалога или одной группы связанных диалогов.
У каждого диалога компонента Service Broker есть две стороны. Сторона, которая начинает диалог, называется инициатором; другая сторона называется целью. У каждой стороны есть своя служба — вызывающая и целевая службы. Каждая служба имеет связанную с ней очередь сообщений.
Далее показывается обмен сообщениями в обычном диалоге.
На стороне инициатора.
Программа начинает диалог.
Программа создает сообщение, содержащее данные, необходимые для выполнения задачи.
Компонент отправляет сообщение целевой службе.
На стороне цели.
Сообщение помещается в очередь, связанную с целевой службой.
Программа получает сообщение из очереди и обрабатывает данные.
Программа отвечает, отправляя сообщение вызывающей службе.
На стороне инициатора.
Ответное сообщение помещается в очередь, связанную с вызывающей службой.
Программа получает ответ и обрабатывает его.
Этот цикл повторяется, пока инициатор не завершит диалог, когда у него больше не останется запросов для цели.
Компонент Service Broker поддерживает задание приоритета для каждого диалога от 10 (самый высокий) до 1 (самый низкий). Это гарантирует, что работа с низким приоритетом не помешает работе с высоким приоритетом. Системы компонента Service Broker могут быть настроены для обеспечения разных уровней обслуживания. Дополнительные сведения см. в разделе Приоритеты диалогов.
Компонент Service Broker берет на себя самые сложные задачи, связанные с написанием систем обмена сообщениями. В эти задачи входит координация сообщений, обеспечение надежности доставки сообщений, блокировка и активация сущностей, извлекающих сообщения из очереди. Благодаря этому разработчики могут сосредоточиться на решении проблем бизнеса.
Асинхронное программирование на основе транзакций
В инфраструктуре компонента Service Broker доставка сообщений приложениям основана на транзакциях и осуществляется асинхронно. Поскольку обмен сообщениями компонента Service Broker основан на транзакциях, при произведении отката в транзакции происходит откат всех операций компонента Service Broker в транзакции. Это справедливо и для операций отправки и получения. Суть асинхронной доставки сообщений состоит в том, что когда компонент Database Engine осуществляет доставку, работа приложения не прерывается. Чтобы повысить масштабируемость в компоненте Service Broker, реализованы механизмы, которые автоматически запускают программы, обрабатывающие очередь при необходимости. Дополнительные сведения см. в разделе Активация компонента Service Broker.
Асинхронный подход помогает разработчикам писать приложения, работающие с очередями. Многие приложения, работающие с базами данных, включают таблицы, которые, по сути, являются очередями заданий, подлежащих выполнению по мере освобождения требуемых ресурсов. Использование очередей обеспечивает приложениям баз данных два преимущества.
Приложение может ответить текущему пользователю немедленно, после помещения рабочего запроса в очередь. Приложение не должно ожидать выполнения всей работы, связанной с запросом, чтобы ответить. Запрос, помещенный в очередь, будет обработан, когда появятся ресурсы. Это позволяет поддерживать краткое время отклика базы данных на запросы текущих пользователей и вместе с тем эффективно использовать доступные ресурсы.
Работа, связанная с одним запросом, в некоторых случаях, может быть разделена на несколько блоков работы, которые будут обрабатываться как отдельные транзакции. В такой ситуации приложение базы данных может запускать каждый блок работы, помещая запрос в очередь. Компонент Service Broker расширяет эту идею, позволяя приложениям распределять работу по нескольким экземплярам компонента Service Broker, расположенным на отдельных компьютерах.
Создание приложений, которые могут правильно устанавливать последовательность и обрабатывать элементы в очередях часто является очень сложным процессом. Разработчики могут использовать функциональные возможности компонента Service Broker, встроенные в компонент Database Engine, чтобы упростить код, необходимый для успешной реализации очередей баз данных.
Поддержка слабосвязанных приложений
Компонент Service Broker поддерживает слабосвязанные приложения. Такие приложения состоят из нескольких программ, отправляющих и принимающих сообщения независимо друг от друга. Эти приложения должны содержать одинаковые определения передаваемых сообщений и определять одинаковую общую структуру взаимодействия между службами. Однако нет необходимости, чтобы приложения выполнялись одновременно, работали в одном экземпляре SQL Server или имели общие детали реализации. Приложение не нуждается в сведениях о физическом расположении или реализации другого участника диалога.
Компоненты Service Broker
Компонент Service Broker включает компоненты трех типов.
Компоненты диалогов. В период выполнения структуру приложения, работающего с компонентом Service Broker, формируют группы сообщений, диалоги и сообщения. В процессе диалога приложения обмениваются сообщениями. Каждый диалог является элементом одной группы сообщений; группа сообщений может включать несколько диалогов. Каждый диалог компонента Service Broker — это диалог. В процессе диалога ровно два участника обмениваются сообщениями. Дополнительные сведения о компонентах диалогов см. в разделе Архитектура диалога.
Компоненты определения служб. К этой категории относятся компоненты времени проектирования, определяющие базовую структуру диалогов, в которых приложение может принимать участие. Они определяют для приложения типы сообщений, поток передачи сообщений и базу данных, в которой будут храниться сообщения. Дополнительные сведения о компонентах определения служб см. в разделе Архитектура служб.
Сетевые компоненты и компоненты обеспечения безопасности. Эти компоненты определяют инфраструктуру обмена сообщениями между экземплярами компонента Database Engine. Чтобы администраторам СУБД было легче управлять изменяющимися средами, компонент Service Broker позволяет конфигурировать эти компоненты независимо от кода приложений. Дополнительные сведения о сетевых компонентах и компонентах обеспечения безопасности см. в разделе Работа в сети и удаленное обеспечение безопасности.
Компоненты определения служб, сетевые компоненты и компоненты обеспечения безопасности входят в метаданные базы данных и экземпляра SQL Server. Группы диалогов, диалоги и сообщения входят в данные, хранимые в базе данных.