О замене Service Broker при помощи Digital Q.DataBase

О замене Service Broker при помощи Digital Q.DataBase



Для начала напомню о том, что это за механизм:

В оригинальном MS SQL Server есть возможность работать в нескольких базах данных или даже на нескольких серверах в режиме асинхронной отправки/получения сообщений. Можно организовать диалог между двумя БД (даже на разных серверах), передавая информацию о тех или иных событиях, при этом отправитель не обязан ждать доставки сообщения и реакции получателя. Многие крупные информационные системы, работавшие на MS SQL Server использовали и по сей день продолжают использовать эту функциональность. Похожие механизмы есть и в СУБД Oracle, а вот в классическом PostgreSQL ничего подобного нет, а потому и заменить эту функциональность при переходе на многие из отечественных СУБД просто нечем.


Развивая функциональность Digital Q.DataBase, мы пошли по пути максимально точного воспроизведения функциональных возможностей MS SQL Server и Oracle Database. Наша СУБД-полиглот поддерживает как синтаксис SQL-диалектов этих СУБД, так и то, что за ним стоит. И, разумеется, мы не могли пройти мимо такого важного блока функциональности MS SQL Server.


В диалекте T-SQL в нашей СУБД Digital Q.DataBase, начиная с версии 18, появились новые команды:

ALTER DATABASE <db> SET ENABLE_BROKER - Включает эмуляцию Service Broker в указанной БД;

ALTER DATABASE <db> SET DISABLE_BROKER - Отключает эмуляцию Service Broker в указанной БД;

CREATE MESSAGE TYPE - Создаёт тип сообщения;

DROP MESSAGE TYPE - Удаляет тип сообщения;

CREATE CONTRACT - Создаёт контракт информационного обмена и задает набор разрешённых типов сообщений;

DROP CONTRACT - Удаляет контракт информационного обмена;

CREATE QUEUE - Создаёт очередь сообщений;

DROP QUEUE - Удаляет очередь сообщений;

CREATE SERVICE ... ON QUEUE ... - Создаёт службу Service Broker и привязывает её к очереди и к контрактам;

DROP SERVICE - Удаляет службу;

CREATE ROUTE ... WITH SERVICE_NAME = ..., ADDRESS = ... - Создаёт маршрут для межбазовой доставки сообщений;

DROP ROUTE - Удаляет маршрут;

BEGIN DIALOG  - Открывает новый диалог;

SEND ON CONVERSATION - Отправляет сообщение в открытый диалог;

RECEIVE - Читает сообщение из очереди;

WAITFOR (RECEIVE ...) - Ждёт сообщение из очереди;

END CONVERSATION - Завершает диалог;

END CONVERSATION ... WITH CLEANUP - Принудительно завершает диалог;

GRANT SEND ON SERVICE::... - Выдаёт право на отправку в службу;

REVOKE SEND ON SERVICE::... - Забирает право на отправку в службу;

GRANT RECEIVE ON QUEUE::... - Выдаёт право на чтение из очереди;

REVOKE RECEIVE ON QUEUE::... - Забирает право на чтение из очереди.


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


Важно отметить, что данные команды позволяют наладить информационный обмен не только локально, внутри одной или нескольких БД на одном сервере Digital Q.DataBase, но и между несколькими серверами. Причем поддерживается возможность двустороннего информационного обмена между серверами Digital Q.DataBase и оригинальными серверами Microsoft SQL Server. Мы аккуратно воспроизвели в своей СУБД соответствующий транспортный протокол.


Также поддержана эмуляция системных представлений sys.routes, sys.databases, sys.conversation_endpoints и sys.transmission_queue.


Как и в оригинальном MS SQL Server обеспечивается гарантированная доставка сообщений. Это очень похоже на использование Kafka, но работает в разы быстрее,т надежнее и не требует установки какого-либо дополнительного ПО, так как это встроенная в саму СУБД функциональная возможность.


Поддержка функциональности Service Broker позволила нам стать еще ближе к выполнению нашей главной задачи - беспроблемной замены MS SQL Server его российским аналогом в лице нашей СУБД.


Не требуется менять хранимые процедуры, переписывать прикладной софт, перестраивать информационный обмен.


Просто ставим сервер Digital Q.DataBase вместо MS SQL Server, переносим в него нужные базы нашим Мастером переноса БД и продолжаем работать как раньше.


Мы надеемся, что с нашей помощью задача импортозамещения СУБД превратится в рутинную задачку на пару дней для одного системного администратора, а не будет большим и малопредсказуемым проектом с огромным числом участников и тысячами задач для прикладных разработчиков, как это выглядит сейчас при переходе на некоторые из российских СУБД!



Report Page