Вадим Федоров, зам. директора компании InterTrust: "Change Pump помогает легко и изящно решать проблемы, на которые уходит до 80% времени разработчика"
Причина популярности модульной технологии среди разработчиков в том, что фрагменты программного обеспечения, построенного по модульному принципу, можно использовать и в других продуктах. В системах документооборота одним из таких модульных решений является Change Pump - продукт, разработанный российской компанией InterTrust. Эта компания известна своими разработками сложных систем на основе технологий Lotus Development.

Применение Lotus Notes и Domino позволяет быстро создать и внедрить сложное приложение, работающее на различных платформах. Операционная среда Notes имеет также удобный графический интерфейс для организации документооборота и подготовки документов. Кроме того, для Notes разработаны некоторые средства интеграции с системами БД, редактирования документов и других элементов. Однако средства программирования Notes - встроенный язык LotusScript и Java - имеют ряд ограничений, которые проявляются, как правило, в крупных системах документооборота. Так, вследствие значительной доли интерпретируемого кода работа приложений замедляется. Кроме того, чем больше система, тем медленнее работают приложения, поскольку при редактировании одного документа необходимо изменение всех с ним связанных. Например, изменение даты проведения совещания должно автоматически изменить дату во всех документах, подготовленных к этому совещанию. Взаимоувязывание документов затрудняет не только разработку системы, но и ее сопровождение и доработку, особенно настройку силами заказчика.

Осознав эти проблемы, в InterTrust взялись за создание собственного инструментария.

Технология Change Pump

Change Pump представляет собой систему внесения изменений в сложную структуру документов с помощью специального сервера, реализованного на языке Java.

Сейчас система уже работает в проекте, реализованном InterTrust для Российского гуманитарного научного фонда (РГНФ). Собственно, и сама технология появилась в результате обобщения опыта по созданию сложных систем комплексной автоматизации документооборота на основе Notes/Domino в РГНФ.

Чтобы исключить тотальную связанность приложений друг с другом и разложить их на отдельные модули, было решено разработать универсального посредника между всеми элементами системы. Так и родилась идея Change Pump - сервера, который управляет переносом изменений в различные части сложной системы. Изменения, внесенные в один документ, передаются всем зависимым документам не напрямую, а через универсальный посредник (диспетчер), отвечающий за доведение изменений до всех остальных частей системы. Для упрощения управления передачей изменений все взаимосвязи между документами записаны в виде метаданных в отдельном документе.

Реализована такая идея на основе модели "Издатель - диспетчер - подписчик" (рис. 1). Издателем является система редактирования документа. Она передает посреднику событие с указанием измененной информации в редактируемом документе. Диспетчер, получив сообщение о случившемся событии, передает подписчикам, указанным в метаданных, соответствующие сигналы. Подписчик также может отреагировать порождением вторичного события, которое будет обслуживаться по уже описанной схеме. Вся деятельность диспетчера протоколируется в специальном журнале. В системе предусмотрены проверяющие подписчики, которые могут отменить изменения, произошедшие в издателе.

Следует отметить, что структуру события определяет не издатель, а метаданные. Когда издатель сообщает диспетчеру, что произошли какие-либо изменения, диспетчер передает издателю информацию, в каком виде ему следует передавать изменения. После этого издатель заполняет соответствующие поля измененной информацией и пересылает полученный объект диспетчеру. Диспетчер в соответствии с метаданными подготавливает сигналы для подписчиков и ставит их в очереди, отдельные для каждого подписчика. В событии содержится безадресная информация об изменении ресурса: его начальное и конечное состояние, а также метод изменения (insert, edit или другие). Сигналы доставляются сначала проверяющим подписчикам, которые могут отменить изменения, а затем и всем остальным. Причем до завершения опроса всех проверяющих подписчиков транзакция с издателем не завершается. Подписчикам, которые не являются проверяющими, сигналы могут быть переданы в асинхронном режиме.

Основу Change Pump представляет многопоточный сервер, реализованный на Java. Метаданные определяют информацию о всех связях в системе и позволяют системному администратору управлять созданием событий, распространением и обработкой сигналов, а также задавать внутреннюю структуру событий и сигналов. Одновременно метаданные, по сути, служат документацией системы и моделью предметной области.

Разделение единой системы на отдельные блоки, которые получают изменения через Change Pump, позволяет корректировать все части системы с сохранением целостности данных. Причем система с Change Pump действует надежнее, поскольку теперь работа одной части не будет блокироваться из-за временной недоступности другой. Это особенно важно для нашей страны, где телекоммуникационная инфраструктура не всегда позволяет поддерживать надежную постоянную связь между удаленными частями предприятия. Упрощается и разработка системы, поскольку разработчику достаточно создать блок связи с диспетчером системы, а вся остальная логика реализуется уже с помощью метаданных, которые можно изменять даже в процессе эксплуатации. Сама архитектура Change Pump подсказывает Lotus-программисту правильное взаимодействие элементов создаваемой системы.

Система, основанная на Change Pump, может легко расширяться с помощью специальных шлюзов. Один из таких шлюзов используется и в РГНФ: это шлюз между Change Pump и базами данных, поддерживающими JDBC (рис. 2). Change Pump передает шлюзу все необходимые сообщения, задаваемые метаданными. Шлюз в соответствии со своими метаданными преобразует сообщения в JDBC-запросы и передает их в базу данных. Полученные результаты расшифровываются и могут породить новые запросы к базе данных или новые события для Change Pump.

Рецепты Change Pump

Рассмотрим теперь некоторые типичные элементы системы документооборота, проблемы, связанные с ними, и возможные методы их решения с помощью Change Pump.

Справочники

Типичный документ для систем документооборота - справочники. В них содержится наиболее общая информация о системе, изменение которой влияет на многие документы системы. Причем с добавлением нового зависимого документа приходится изменять программу обновления справочника. А если таких справочников в системе несколько, то добавление очередного зависимого документа приводит к значительным затратам времени по обновлению программ справочников.

Change Pump помогает разработчику отделить документы, которые нужно изменить, от справочников, распространяющих изменения. Изменение справочника передается диспетчеру, который порождает соответствующие сигналы для всех связанных систем.

Сводные каталоги

Типичны для систем документооборота и сводные каталоги, куда собираются данные из различных документов. Сводные каталоги необходимы для создания отчетов и представляют собой основной элемент любой системы документооборота. При создании таких каталогов обычно требуется изменять уже проверенные блоки, причем с добавлением каждого нового каталога система замедляется, поскольку ей нужно передать данные всем остальным каталогам.

Change Pump упрощает создание и сопровождение каталогов; при добавлении нового каталога модули системы менять не нужно - достаточно изменить соответствующие записи в метаданных диспетчера. Кроме того, доставку изменений в каталоги можно реализовать асинхронно, что уменьшает требования к инфраструктуре системы. Следует отметить, что сводный каталог может быть представлен в виде хранилища данных.

Регуляторы

Процессы, которые происходят на предприятии, имеют очень сложную систему взаимосвязей. Иногда событие, произошедшее с одним бизнес-процессом, может повлиять на все остальные процессы. Например, если разорился какой-либо банк, через который организация переводит деньги, то ни один дальнейший платеж не должен пройти через такой банк. Запрограммировать подобную ситуацию достаточно тяжело, поскольку проверка на каждом этапе прохождения платежа истории всех других платежей - задача достаточно сложная. Change Pump позволяет решить проблему с помощью специальной конструкции, которая называется регулятором.

Регулятор представляет собой специальный документ, который хранит информацию о произошедших событиях. Как только в каком-либо процессе произошло определенное событие (в нашем примере - отказ от платежа), то процесс записывает данные о нем в регулятор и продолжает дальнейшую работу. Если же после этого какой-либо другой процесс захочет передать платеж через разорившийся банк и сообщит об этом регулятору, то последует запрет действий. Таким образом поддерживается независимость процессов друг от друга, но обеспечивается их взаимное влияние.

Change Pump помогает строить системы покомпонентно и постепенно. Многие накопленные модули можно интегрировать в неизменном виде в другие системы, при этом связи между ними вынесены за пределы модулей и допускают простую модификацию. Конечно, эти черты являются общими для модульных систем. Строгое следование им вместе с адекватной поддержкой в инструментарии помогает значительно упростить и ускорить создание и обслуживание сложных информационных систем.