© Ренделл Л. Мерилетт (Randall L. Merilatt)
Главный системный проектировщик
Birdstep Technology
Переведено БНТП по заказу Interface Ltd.
RDM Server предоставляет мощные средства создания собственного многопоточного сервера, ориентированного на конкретное приложение. На рисунке 1, приведенном ниже, иллюстрируется архитектура типичного приложения клиент-сервер на основе RDM Server. Затененные области представляют компоненты RDM Server.
Рисунок 1. RDM Server: архитектура типа клиент-сервер.
Пробное приложение состоит из следующих компонентов:
Обмен данными в RDM Server обеспечивается интерфейсом Multiple Network Control Processor (MNCP).
В классической архитектуре обмен данными с RDM Server ограничен отдельным системным процессом. Такой процесс использует интерфейс Remote Procedure Call (RPC)/MNCP. RDM Server продолжает поддерживать эту архитектуру. Однако теперь имеется мощная альтернатива, обеспечивающая большую гибкость при использовании RDM Server в качестве встроенной базы данных. В рамках этой расширенной архитектуры можно напрямую связать приложение с процессором RDM Server, который позволяет приложению превратиться в сервер баз данных. Некоторые детали представлены на рисунке 2.
Рисунок 2. Архитектура сервера приложений
Для работы сервера баз данных, ориентированного на конкретное приложение, необходимо выбрать тип протокола удаленного обмена данными, поддержка которого будет осуществляться в дальнейшем. В частности, можно использовать протокол, предоставляемый операционной системой или сторонними поставщиками, например, JAVA или COM/DCOM на базе Windows NT. Обмен данными может контролироваться приложением совершенно независимо от RDM Server. Для полного использования преимуществ многопоточной среды RDM Server приложение может запускать собственные потоки и управлять ими, каждый из которых контролирует один или несколько сеансов работы с RDM Server.
При обращении приложения к системе RDM Server (с помощью функции s_startup), она может запустить свои RPC/MNCP-потоки (представленные на рисунке 2 прямоугольниками со штрихованными границами). Таким образом осуществляется доступ к базе данных RDM Server любыми стандартными клиентскими программами, основанными на этой среде (например, сторонние инструменты ODBC).
Автономные (не типа клиент-сервер) приложения, требующие мощности и производительности полноценного многопоточного процессора баз данных, получат преимущества за счет отсутствия проблем с производительностью и памятью, которые связаны с доступом к отдельному процессу (например, к программе, использующей RDM Server), осуществляемым посредством протокола сетевого обмена данными (NCP) с совместным использованием памяти.
Интересный пример этого включает в себя поддержку баз данных для web-серверных приложений. На рисунке 3 приведена соответствующая блок-схема, на которой затененные прямоугольники представляют характерные ресурсы, используемые прикладными расширениями. С помощью большинства инструментальных наборов разработки программного обеспечения для web-серверов (например, такие инструменты как Internet Information Server от Microsoft или Netscape Server) можно разработать серверные расширения, подобные тем, что создаются на базе RDM Server. Для осуществления доступа к типичному серверу СУБД расширение web-сервера должно соединиться с сервером баз данных и получить доступ к необходимой информации с помощью сетевых протоколов, поддерживаемых этой базой данных. RDM Server позволяет процессору баз данных напрямую связаться с web-сервером, что обеспечивает более эффективный и быстрый доступ к информации базы данных. Реализованная в RDM Server технология встраиваемых многопоточных баз данных позволяет создавать очень мощные web-приложения, поддерживающие доступ к базам данных.
Рисунок 3. Архитектура Веб-сервера
Команды s_startup и s_terminate – административные функции, контролирующие запуск и завершение работы процессора баз данных RDM Server.
После запуска RDM Server путем вызова s_startup можно инициировать любое число сеансов работы с помощью функции s_login. (Примечание: параметр имени сервера в команде s_login не используется, если эта функция вызывается сервером приложений). Использование многопоточности увеличит масштабируемость и системную производительность. Каждый поток осуществляет свой собственный вызов функции s_login. Необходимо отметить, что обращения к функциям RDM Server реализуются последовательно для отдельного сеанса работы. Этого можно достигнуть, реализуя все обращения для данного сеанса работы из одного и того же потока. Хотя можно напрямую обращаться к функциям управления потоками, предоставляемым операционной системой, также есть возможность использовать функции диспетчера RDM Server Resource Manager, обеспечивающие преимущества независимости от платформ.
После завершения всех сеансов работы (s_logout) вызывается функция s_terminate для остановки процессора баз данных RDM Server.
Это и в самом деле просто. Кроме обращений к s_startup и s_terminate, все остальное работает точно так же, как в архитектуре клиент-сервер, за исключением того, что в целом приложение функционирует подобно модулю расширения без необходимости быть доступным по RPC-интерфейсу среды RDM Server. Конечно, сервер приложений также отвечает за управление обменом с любым клиентским компьютером.
Если нужны стандартные клиентские приложения на базе RDM Server и сторонний ODBC-доступ к процессору баз данных, работающему под управлением сервера приложений, необходимо использовать две дополнительные функции. Инициализация RPC-подсистемы RDM Server осуществляется посредством вызова функции s_startRPCThreads (после s_startup). Этой функции необходимо передать имя сервера; число сеансовых потоков, занятых в поддержке клиентских сеансов работы; и адреса переменных типа short, используемых для индикации запросов о закрытии системы. Закрытие RPC-подсистемы производится вызовом функции s_endRPCThreads. Она должна вызываться до обращения к s_terminate.
Краткая сводка и описание этих функций представлены в следующей таблице.
Таблица 1. Функции управления средой RDM Server
Функция | Описание |
s_startup | Запуск процессора баз данных RDM Server. |
s_startRPCThreads | Старт RPC/NCP-подсистемы RDM Server и запуск сеансовых потоков. |
s_endRPCThreads | Остановка RPC-подсистемы RDM Server. |
s_terminate | Остановка процессора баз данных RDM Server. |
Простой учебный код, приведенный ниже, иллюстрирует использование этих функций. В нем описан запуск основного сервера среды RDM Server.
#include "velocis.h"
static RDSLOGFCN MessageConsole;
static short shutdown_flag;
/* Основной сервер баз данных RDM Server
*/
void main(
int argc,
char *argv[])
{ short stat;
char *catpath = NULL;
char *server = "RDM Server";
if ( argc > 1 ) {
/* первый аргумент – имя сервера, по умолчанию это "RDM Server" */
server = argv[1];
if ( argc > 2 ) {
/* второй аргумент – путь к альтернативному каталогу */
catpath = argv[2];
}
}
stat = s_startup(catpath, MessageConsole, LOG_ALL);
if ( stat != S_OKAY ) {
printf("Unable to start RDM Server engine, status = %d\n", stat);
exit(1);
}
rm_interrupt(&shutdown_flag);
stat = s_startRPCThreads(server, noSessionThreads, &shutdown_flag);
if ( stat != S_OKAY ) {
printf("Unable to start RDM Server RPC server, status = %d\n", stat);
exit(1);
}
while ( ! shutdown_flag )
rm_sleep(5000L);
s_endRPCThreads();
s_terminate();
}
Программа получает из командной строки два аргумента. Первый – имя сервера. Вторым аргументом (если он указан) является путь к системному каталогу RDM Server.
При вызове функции s_startup ей могут передаваться три параметра.
Первый имеет тип строки и содержит путь к системному каталогу. Если этот параметр не указан, RDM Server будет использовать переменную окружения CATPATH или текущую директорию. Если каталог не найден, то будет выдано сообщение об ошибке.
Вторым параметром является адрес собственной функции журнала регистрации событий RDM Server. Эта функция вызывается для обработки каждой ошибки или информационного сообщения, сгенерированного процессором баз данных RDM Server. Если параметр не задан, то по умолчанию каждое сообщение передается команде stdout и записывается в файл rds.log.
Третий параметр указывает, какой класс сообщений будет регистрироваться. В приведенном примере задана регистрация любых сообщений (для получения списка всех типов сообщений следует обратиться к описанию функции s_startup). Следует заметить, что если команда s_startup возвращает ошибку, то связанное с этим сообщение уже будет зарегистрировано.
Представленной ниже функции журнала регистрации можно передавать три параметра.
Первый указывает, будет ли функция обрабатывать зарегистрированные сообщения, только регистрировать их или же закроет журнал регистрации сообщений. Эти опции задаются константами RDSLOG_OPEN, RDSLOG_MESSAGE и RDSLOG_CLOSE.
Второй параметр определяет тип сообщений, таких, как сообщение об ошибке, предупреждающее или информационное сообщение.
Третий параметр – строка сообщения. Приведенный ниже пример, несмотря на тривиальность, иллюстрирует основные конструкции.
/* Log RDM Server console message
*/
void MessageConsole(
RDSLOG_CTRL fcn, /* тип вызова: открыть, закрыть, отправить сообщение */
short type, /* тип сообщения */
char *msg) /* сообщение, которое должно быть зарегистрировано */
{
static FILE *errlog;
switch ( fcn ) {
case RDSLOG_OPEN:
errlog = fopen("RDM Server.log", "w");
break;
case RDSLOG_MESSAGE:
if ( type == LOG_ERROR ) {
/* убедитесь, что это было принято во внимание */
fprintf(errlog, "******* ERROR! ******* ");
printf("******* ERROR! ******* ");
}
fprintf(errlog, "%s\n", msg);
printf("%s\n", msg);
break;
case RDSLOG_CLOSE:
fclose(errlog);
break;
}
}
После успешного запуска процессора RDM Server вызывается функция rm_interrupt для обеспечения возможности перехвата программных прерываний, инициированных пользователем. Ее единственный параметр задает адрес переменной типа short (shutdown_flag), которой будет присвоено значение 1 в случае пользовательского прерывания.
Обращение к функции s_startRPCThreads активизирует RPC/NCP-подсистему RDM Server, задавая имя сервера и число запускаемых сеансовых потоков, которые образуют множество потоков, обеспечивающих выполнение одного или нескольких сеансов работы пользователей. Система спроектирована так, чтобы все активные сеансы работы могли обслуживаться фиксированным числом сеансовых потоков, которое меньше, чем фактическое количество активных сеансов работы. Если число потоков равно нулю, то оно по умолчанию будет взято из файла rdm server.ini. Третий параметр является указателем на переменную типа short (опять используется shutdown_flag), которой будет присвоено значение 1 в случае, если пользователь с правами администратора запросил остановку системы.
Теперь система начинает бесконечную серию пятисекундных циклов, которая заканчивается только после присваивания флагу shutdown_flag единицы либо в результате пользовательского прерывания, либо вследствие запроса администратора на закрытие системы. После фиксации значения флага shutdown_flag программа обращается к s_endRPCThreads, чтобы закрыть RPC/NCP-подсистему, а затем вызывает функцию s_terminate, чтобы остановить процессор баз данных RDM Server.
Этим завершается обсуждение использования среды RDM Server для создания сервера баз данных, ориентированного на конкретное приложение. Помимо поддержки "спящего" режима программа может содержать пользовательский интерфейс, который, например, может выполнять различную административную работу с помощью утилит admin или dram. Также возможна поддержка других характерных для конкретных приложений возможностей администрирования, которые по желанию могут быть ограничены самим сервером. Описанная технология идеально подходит для любого отдельного программного приложения, требующего высокопроизводительного процессора баз данных. Примеры подобного применения включают в себя системы резервного копирования на магнитную ленту, мониторинг событий в режиме реального времени и телефонные коммутационные системы.
Способность напрямую связывать полнофункциональный, высокопроизводительный процессор баз данных с конкретным приложением – одна из уникальных черт продукта RDM Server компании Birdstep, что делает его лучшим выбором среди доступных на текущий момент коммерческих встраиваемых СУБД.
Дополнительная информация
За дополнительной информацией обращайтесь в компанию Interface Ltd.
INTERFACE Ltd. |
|