Диалоги
Все сообщения, отправляемые компонентом Service Broker, входят в состав диалога. Диалог — обмен данными между двумя службами. Диалог — это надежный, постоянный двунаправленный поток сообщений между двумя службами.
Диалоги обеспечивают однократную доставку сообщений с соблюдением порядка. Для идентификации связанных сообщений и доставки сообщений в правильном порядке используются идентификаторы диалогов и последовательные номера, содержащиеся в каждом сообщении. Диалог — это надежный постоянный поток сообщений между двумя службами.
В диалоге участвуют две стороны: Инициатор начинает диалог. цель принимает диалог, начатый инициатором. От роли участника диалога зависит то, какие сообщения он может отправлять, это определяется в контракте диалога. Поток сообщений в ходе диалога показан на следующем рисунке:
В процессе диалога приложения обмениваются сообщениями. Когда SQL Server принимает сообщение, SQL Server помещает его в очередь диалога. Приложение получает сообщение из очереди и обрабатывает его в соответствии с требованиями. В ходе обработки приложение может отправлять сообщения другому участнику диалога.
Надежная доставка сообщений
Диалоги автоматически подтверждают сообщения, чтобы обеспечить надежную доставку. Компонент Service Broker хранит каждое исходящее сообщение в очереди передаваемых сообщений до тех пор, пока удаленная служба не подтвердит его получение. Автоматическое подтверждение получения сообщений экономит время и ресурсы, позволяя приложениям не подтверждать получение каждого сообщения явно. Если такое возможно, подтверждения содержатся в тексте возвращаемых сообщений.
Примечание |
---|
При обработке подтверждений компонент Service Broker не задействует никакие внешние механизмы. Подтверждения не заносятся в очередь и не доставляются приложению. |
Недоступность удаленной службы не рассматривается компонентом Service Broker как ошибка. Если удаленная служба недоступна, компонент Service Broker хранит адресованные этой службе сообщения до тех пор, пока служба не станет доступна или не истечет срок поддержания диалога.
Срок поддержания диалога
Приложения могут обмениваться сообщениями в течение срока поддержания диалога. Срок поддержания диалога длится с момента создания диалога локальным экземпляром SQL Server до тех пор, пока приложение или явно не завершит диалог, или не получит связанное с диалогом сообщение об ошибке. Каждый участник диалога отвечает за явное его завершение при получении приложением сообщения, свидетельствующего об ошибке или завершении диалога. Как правило, один участник дает знать, что диалог успешно завершен, заканчивая его без формирования сообщений об ошибках. Это может сделать как цель, так и инициатор — выбор стороны, завершающей диалог, зависит от цели диалога.
Локальный компонент Service Broker приложения-инициатора создает конечную точку диалога, когда приложение начинает диалог. Локальный компонент Service Broker приложения-цели создает конечную точку диалога при получении экземпляром первого сообщения диалога.
Кроме того, диалоги гарантируют, что срок поддержания диалога не превысит заданный предел. Для этого приложение-инициатор может задать максимальный срок поддержания диалога. За сроком поддержания диалога следят как локальный, так и удаленный экземпляры компонента Service Broker. Если срок поддержания диалога достигает максимума, оба участника диалога помещают в очередь службы соответствующее сообщение об ошибке и перестают отправлять новые сообщения. Длительность диалога никогда не может превысить максимальный срок, заданный при инициации диалога. Обратите внимание, что после завершения диалога приложение все еще продолжает получать сообщения, однако новые сообщения для завершенного диалога не могут быть приняты, и приложение не может отправлять сообщения в рамках завершенного диалога.
После получения и отправления всех сообщений приложения должны явно завершить диалог. Компонент Service Broker никогда не завершает диалог автоматически. Диалог остается в базе данных до тех пор, пока приложение явно не завершит его. Таким образом, даже если истекает максимальный срок поддержания диалога или компонент Service Broker сообщает об ошибке, каждый участник диалога должен явно выполнить инструкцию END CONVERSATION.
Таймер диалога
Таймер диалога позволяет приложению отправить сообщение в конкретный момент времени. Когда заданный для таймера интервал времени истекает, экземпляр SQL Server вставляет сообщение в очередь диалога на стороне конечной точки, запустившей таймер диалога. Приложение может использовать таймер диалога с любой целью. Довольно часто таймер диалога применяется для реагирования на задержку ответа удаленной службы. Другой распространенный вариант — отправление сообщений удаленной службе через заданные интервалы времени. Например, таймер диалога можно использовать в службе для отправления данных о текущем состоянии SQL Server каждые несколько минут. Кроме того, таймер диалога позволяет приложению активировать хранимую процедуру в конкретный момент времени. Благодаря этому компонент Service Broker поддерживает выполнение действий по расписанию.
Каждый участник диалога может запустить один таймер для одного диалога. Таймер диалога не используется совместно с другими участниками и не влияет на срок поддержания диалога. Вместо этого при истечении интервала таймера локальный компонент Service Broker добавляет в очередь локальной службы сообщение о тайм-ауте. Сообщение о тайм-ауте имеет тип https://schemas.microsoft.com/SQL/ServiceBroker/DialogTimer