Распределенные вычисления - давняя мечта компьютерного сообщества. Объединив несколько компьютеров в единую систему, можно добиться увеличения производительности и надежности вычислений. Однако пока еще не удалось разработать механизмы, которые позволяли бы объединить несколько компьютеров различных типов. Использование Java-технологии может решить эту проблему. Понимая это, компания JavaSoft создала специальную группу распределенных систем, которая уже разработала механизмы удаленного запуска методов и преобразования объектов в последовательность битов для передачи по сети. Сейчас эта группа работает над проектом JavaSpaces, который позволит строить распределенные системы хранения и обработки данных.

Следует отметить, что разработка распределенных систем является достаточно сложной задачей, поскольку связана с проблемой синхронизации нескольких компьютеров. Для такой синхронизации прежде всего необходимо: предусмотреть выход из строя одного из компьютеров системы, учесть различия во времени доступа к различным компьютерам распределенной системы и сделать программы переносимыми с одного компьютера на другой. Язык Java, дополненный механизмом удаленного запуска методов (RMI), позволяет решить проблему переносимости программ с одной платформы на другую. Механизм же преобразования объектов в последовательность битов (Serialization) дает серверам возможность обмениваться объектами для их исполнения или хранения. Таким образом, Java обеспечивает основу для построения распределенных вычислительных сред. Однако сами эти механизмы еще не являются полноценной распределенной системой, которую можно легко расширить, - они просто дают инструмент для ее построения. Следующим шагом к созданию распределенной системы является модель JavaSpace, которая построена на основе этих механизмов и предназначена для решения двух взаимосвязанных проблем: распределенного хранения объектов и разработки алгоритмов их распределения.

Модель JavaSpace

JavaSpace - это хранилище объектов-сущностей (entry), которые могут быть записаны или считаны с удаленного клиента. Причем клиентов, которые подключаются к одному хранилищу, может быть несколько, и выполнять они могут несколько различных операций по работе с объектами. Объекты, записываемые в хранилище, являются наследниками класса jive.javaSpace.Entry и объединяют группы объектов, каждый из которых должен реализовать интерфейс java.io.Serializable. Записанный в хранилище объект может быть потом найден с помощью объектов-шаблонов, значения полей которых используются как маски для поиска нужного объекта. Незаполненные поля шаблонов (имеющие значение NULL) в поиске не участвуют.

Интерфейс с JavaSpaces (см. врезку "Интерфейс JavaSpaces") предусматривает два типа операций поиска: прочитать объект (read) или взять его (take). При чтении объекта с помощью метода read хранилище JavaSpace возвращает соответствующий шаблону объект или сообщение о том, что он не найден. Аналогично работает и метод take (взять), но если он завершился удачно, то объект изымается из хранилища. С помощью же метода notify можно запросить у JavaSpaces информацию о хранимом объекте.

Следует отметить, что JavaSpace гарантирует завершение транзакции, которая указана как параметр в вызове методов write, read, take и notify. То есть если операция записи возвратит код успешного завершения, то объект, участвующий в этой транзакции, будет однозначно записан в хранилище. То же относится и к методу take - если он извлек объект из хранилища, то он однозначно будет из него удален. Другими словами, каждый объект может быть взят из JavaSpace только один раз, за исключением того случая, когда в хранилище есть несколько копий одного и того же объекта. JavaSpaces поддерживает механизм транзакций, который позволяет успешно завершать сложные операции. Это сделано с помощью модели транзакции Jive, определенной в пакете jive.transactions.

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

Фактически JavaSpaces представляет собой механизм хранения группы взаимосвязанных объектов и поиска их по значениям некоторых полей. Это позволяет строить на основе JavaSpace распределенные хранилища объектов, которые могут восстанавливать объекты с удаленной системы в случае выхода из строя одного из компонентов системы. Такая возможность может понадобиться для построения отказоустойчивых систем типа кластеров.

Потоки объектов между JavaSpaces

Большинство алгоритмов распределения объектов могут быть описаны как потоки объектов. Такая концепция алгоритмов распределенных вычислений отличается от классической, где в качестве распределенного вычисления рассматриваются протоколы удаленного запуска процедур. В JavaSpaces концепция "потока объектов" представляет собой движение объектов между хранилищем и клиентами.

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

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

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

Особенности JavaSpaces

Хранилища JavaSpaces - это инструмент для создания распределенных протоколов. Они предназначены для программ, которые используют потоки объектов через несколько хранилищ. Если приложение реализуется с помощью модели потока объектов, то JavaSpaces можно рассматривать как основу таких приложений.

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

В принципе, настройку системы должны выполнять серверы, которые, взаимодействуя через своих клиентов в других хранилищах, образовали бы распределенное хранилище объектов. Для такой системы необходимо разработать и реализовать надежную стратегию хранения объектов, которая гарантировала бы полную сохранность и доступность записанных в хранилище объектов. Серверы JavaSpaces управляют параллельным доступом нескольких клиентов, сохраняют и возвращают объекты, поддерживают работу стандартного для Java механизма распределенных транзакций. JavaSpace позволяет решить многие общие проблемы на одной платформе, поэтому эта технология устроена достаточно просто и понятно. Технология JavaSpaces дает разработчикам основу для построения распределенных операционных систем.

JavaSpaces также помогает работать с данными, записанными в традиционной файловой системе, такими как файлы настройки пользователей, сообщения электронной почты, изображения и другие. Фактически, для JavaSpaces формы хранения информации не важны (в оперативной памяти, на диске или еще как-нибудь). В принципе, файловая система может рассматриваться как среда передачи объекта от программы источника (например графического редактора) к программе получателя (оконной системе, которая использует изображение как фон). Преимущества технологии JavaSpaces состоит в том, что она позволяет хранить не просто данные, а объекты, с которыми могут быть связаны определенные операции.

JavaSpace обеспечивает распределенное хранение объектов в Java-форме. Поскольку Java-программы загружаются и используются в любой операционной системе, то хранилища JavaSpaces могут содержать объекты, чье поведение можно передать на удаленную машину по протоколу RMI. Объект JavaSpace при необходимости выполняет активные действия на машине клиента, получившего сообщение. Эта особенность объектов позволяет создавать на основе JavaSpaces общедоступные репозитарии для распределенных кооперативных вычислений.

JavaSpaces и базы данных

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

В реляционных БД информация записывается и обрабатывается с помощью языка запросов, например SQL. Что касается хранящихся в JavaSpace объектов, они преобразованы в простую последовательность битов, и хранилища знают только их тип. Объектные БД привязывают к объектно-ориентированным изображениям определенные данные, которые могут быть впоследствии считаны так, как будто находились в промежуточной памяти. JavaSpaces - это не прозрачный промежуточный слой, необходимый для ускорения поиска информации, а хранилище разнообразных объектов.

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

* * *

JavaSpaces объединяет три основных компонента распределенной системы: удаленный запуск процедур, возможность передачи объектов по сети (с помощью механизма преобразования объектов в последовательность битов) и монитор транзакций. Собранные вместе, эти компоненты дают разработчикам возможность строить распределенные системы, решая проблемы распространения объектов по сети и их удаленного исполнения. Таким образом, JavaSpaces является серьезным шагом на пути к распределенным вычислениям.


Дополнительная информация о JavaSpaces

www.sun.com/sunworldonline/swol-08-1997/swol-08-javaspaces.html - статья Роба Гаса "Sun's JavaSpaces is foundation for future distributed systems" в журнале SunWorld On-line.

chatsubo.javasoft.com - сервер группы распределенных систем компании JavaSoft, которая разрабатывает JavaSpaces.

chatsubo.javasoft.com/javaspaces/js-spec/index.html - предварительная спецификация JavaSpaces.


Интерфейс JavaSpaces для операций с объектами

import java.rmi.*;
import jive.events.*;
import jive.transactions.*;
public interface JavaSpace extends Remote,
 Transaction Participant, TransactionMgr
{
void write(EntryRep rep, Transaction txn, Identity who)
   throws RemoteException,
TransactionException, SecurityException;
EntryRep read(EntryRep tmpl, Transaction txn, Identity who)
   throws RemoteException, TransactionException, SecurityException;
EntryRep take(EntryRep tmpl, Transaction txn, Identity who)
   throws RemoteException, TransactionException, SecurityException;
EventRegID notify(EntryRep tmpl, EventCatcher catcher,
Transaction txn, Identity ident, int lease)
   throws RemoteException, TransactionException, SecurityException;
long renew(long cookie, long extension)
   throws RemoteException, NotRegisteredException;
void cancel(long cookie)
   throws RemoteException, NotRegisteredException;
}