Направете място за JavaSpaces, част 1

Тази статия започва втора нишка от поредицата Jiniology . През юни Бил Венърс стартира Jiniology с преглед на технологията Jini - мощна нова инфраструктура за изграждане и внедряване на разпределени системи, които са организирани като федерации на услугите. Тази нишка, която ще бъде представена през месец в тази колона, се фокусира върху JavaSpaces,основна услуга Jini от Sun Microsystems, която предоставя високо ниво на средства за създаване на съвместни и разпределени приложения. Ако изграждате приложения с Jini, ще искате да знаете как да използвате JavaSpaces за координиране на участниците в Jini федерация. Но също така е важно да запомните, че можете да използвате JavaSpaces отделно от Jini, като инструмент за изграждане на общо разпределени системи в Java. И в двата случая JavaSpaces си заслужава да бъде разгледан, защото може значително да улесни дизайна и кодирането на разпределените приложения.

Направете място за JavaSpaces: Прочетете цялата поредица!

  • Част 1. Улеснете разработването на разпределени приложения с JavaSpaces
  • Част 2. Изграждане на изчислителен сървър с JavaSpaces
  • Част 3. Координирайте вашите Jini приложения с JavaSpaces
  • Част 4. Разгледайте транзакциите на Jini с JavaSpaces
  • Част 5. Направете вашия изчислителен сървър стабилен и мащабируем

В тази серия ще започнем, като ви запознаем с уникалния модел за програмиране JavaSpaces, който е доста различен от другите мрежови и разпределени инструменти, с които може да сте запознати. В следващите статии ще разгледаме подробностите за API на JavaSpaces и как можете да го използвате, за да слепите процесите в разпределено приложение, и ще опишем как JavaSpaces взаимодейства с други компоненти на Jini. В цялата поредица ще видите, че JavaSpaces е прост (API се състои само от няколко операции), изразителен (голям брой проблеми могат да бъдат решени с помощта на JavaSpaces) и мощен (можете да изграждате сложни разпределени системи с малки количества на кода JavaSpaces).

Да започваме.

Нов разпределен изчислителен модел

Изграждането на разпределени приложения с конвенционални мрежови инструменти обикновено включва предаване на съобщения между процеси или извикване на методи за отдалечени обекти. В приложенията JavaSpaces, за разлика от това, процесите не комуникират директно, а вместо това координират своите дейности, като обменят обекти през пространство или споделена памет. Процесът може writeнови обекти в пространство, takeобекти от пространство илиread(направете копие на) обекти в пространство; Фигура 1 изобразява няколко процеса (представени от Dukes), взаимодействащи с пространства, използващи тези операции. Когато вземат или четат обекти, процесите използват просто съвпадение, базирано на стойностите на полетата, за да намерят важните за тях обекти. Ако съвпадащ обект не бъде намерен веднага, тогава процесът може да изчака, докато пристигне. В JavaSpaces, за разлика от конвенционалните обектни хранилища, процесите не модифицират обекти в пространството или извикват техните методи директно - докато там обектите са просто пасивни данни. За да модифицира обект, процесът трябва изрично да го премахне, актуализира и постави отново в пространството.

Spaces са хранилища на обекти с няколко важни свойства, които допринасят за превръщането на JavaSpaces в мощен, изразителен инструмент. Нека разгледаме по-отблизо:

  • Пространства се споделят: Много отдалечени процеси могат да взаимодействат едновременно с пространство - самото пространство обработва подробностите за едновременния достъп, оставяйки ви да се съсредоточите върху дизайна на протоколите на високо ниво между вашите процеси.

  • Пространствата са постоянни: Пространствата осигуряват надеждно съхранение на обекти. Когато съхранявате обект в пространство, той ще остане там за неопределено време, докато бъде премахнат. Можете също така да поискате време за наем, през което даден обект трябва да се съхранява. Веднъж съхранен в пространството, обектът ще остане там, докато изтече времето за наемане (което може да бъде подновено), или докато процесът изрично го премахне. Ще обсъдим по-задълбочено договорите за наем по-късно в тази поредица.

  • Пространствата са асоциативни: Обектите в дадено пространство се намират чрез асоциативно търсене, а не чрез местоположение в паметта или чрез идентификатор. Асоциативното търсене предоставя просто средство за намиране на обектите, които ви интересуват, според тяхното съдържание, без да се налага да знаете как се нарича обектът, кой го е създал или къде се съхранява. За да търсите обект, създавате шаблон (обект с някои или всички негови полета, зададени на определени стойности, а останалите остават nullда действат като заместващи символи). Обект в пространството съответства на шаблон, ако съвпада точно с посочените в шаблона полета. Ще видите, че с асоциативно търсене можете лесно да изразявате заявки за обекти като „Има ли някакви задачи за изчисляване?“ или "Има ли отговори на основния фактор, който поисках? "

  • Пространствата са транзакционно защитени: JavaSpaces използва услугата за транзакции на Jini, за да гарантира, че операцията в дадено пространство е атомна (или операцията е приложена, или не е). Транзакциите се поддържат за единични операции в едно пространство, както и множество операции над едно или повече пространства (или всички операции са приложени, или нито една не е). Както ще видите по-късно в поредицата, транзакциите са важен начин за справяне с частичен провал.

  • Spaces ви позволяват да обменяте изпълнимо съдържание: Докато са в пространство, обектите са само пасивни данни - не можете да ги модифицирате или да извиквате техните методи. Когато обаче четете или вземате обект от пространство, се създава локално копие на обекта. Както при всеки друг локален обект, можете да модифицирате неговите публични полета и да извиквате неговите методи, дори ако никога преди не сте виждали обект като него. Тази възможност ви дава мощен механизъм за разширяване на поведението на вашите приложения през пространство.

С напредването на тази серия ще ви покажем как тези свойства играят ключова роля за създаването на разпределени приложения, които работят добре в средата на Jini, където мрежите често са спонтанни и процесите се присъединяват и напускат изчислението динамично, понякога заради устройството или грешка в мрежата.

Произход на JavaSpaces

Описахме JavaSpaces като нов разпределен изчислителен модел, но произходът му може да бъде проследен до Йейлския университет в началото на 80-те години. Там д-р Дейвид Гелентер разработва инструмент, наречен Linda, за създаване на разпределени приложения. Линда се състои от малък брой операции, съчетани с постоянен магазин, наречен кортеж. Тези операции са ортогонални на всеки конкретен език за програмиране; те са част от координационен език, който може да бъде добавен към всеки друг изчислителен език.Резултатът от изследването на Linda беше изненадващ: използвайки обект за съхранение заедно с малък брой прости операции, можете лесно да приложите голям клас паралелни и разпределени проблеми, използвайки техники, които облекчават много от клопките на изграждането на мрежови системи. С други думи, космическите системи са не само прости (изискват само няколко операции), но и изразителни (поддават се добре на решаването на много разпределени проблеми).

Работата на д-р Гелентер вдъхновява услугата JavaSpaces на Sun, а също така влияе върху дизайна на компонентите за търсене и откриване на основната технология Jini (които ще видите с напредването на поредицата Jiniology ). Докато JavaSpaces наследи космическия модел от Linda, дизайнерите на JavaSpaces актуализираха модела по значими начини, използвайки силата на Java обектите, Jini, RMI и сериализацията на обекти.

JavaSpaces в контекст

Описанието ни досега беше малко абстрактно, така че нека разгледаме няколко примера за реални разпределени приложения, които можете да моделирате като процеси, обменящи обекти през интервали.

Чат системи

Помислете за обикновена многопотребителска чат система, в която пространство служи като зона за чат, която съдържа всички съобщения, съставляващи дискусия. За да говори, участник депозира в пространството обекти със съобщения. Всички членове на чата чакат да се появят нови обекти на съобщения, четат ги и показват съдържанието им. Късно пристигане може да разгледа съществуващите обекти на съобщението в пространството, за да прегледа предишната дискусия. Всъщност, тъй като пространството е постоянно, нов участник може да види дискусията дълго след като всички останали са изчезнали, а участниците дори могат да се върнат много по-късно, за да започнат разговора там, където са спрели. Списъкът с участниците в чата също може да се съхранява в пространството и да се актуализира, когато някой се присъедини или напусне разговора.

Изчисляване на сървъри

Сега помислете за анализ на данните от радиотелескопа в реално време за признаци на извънземен живот (точно както прави проектът SETI @ home). Такива данни са обемни и анализът им е изчислително интензивна работа, която е много подходяща за паралелни изчисления от мрежа от компютри - с други думи, „изчислителен сървър“. Използвайки технологията JavaSpaces, в пространството се записва поредица от задачи - например една задача на парче данни, които трябва да бъдат анализирани. Всеки участващ компютър търси в пространството задача, премахва я, изпълнява необходимата изчислителна работа, пуска резултата обратно в пространството и след това продължава да търси още задачи. Този подход се мащабира естествено: той работи по същия начин, независимо дали има 10 компютъра на разположение или 1000. Подходът също така осигурява естествено балансиране на товара, тъй като всеки работник поема точно толкова работа, колкото може да се справи за даден момент, като бавните компютри правят по-малко работа, а бързите компютри правят повече.

Брокерски системи

Като трети пример да разгледаме система за онлайн търг, която обединява купувачи и продавачи на стоки и услуги. Да предположим, че вие ​​като потенциален купувач описвате артикула (например автомобил), който искате да купите, и цената, която сте готови да платите, обгръщате информацията в запис и пишете получената позиция, която искате да купите към пространство. В същото време потенциалните продавачи непрекъснато наблюдават пространството за пристигане на заявки за търсене, които съответстват на артикулите в техния инвентар. Например, дилърите на Mazda наблюдават пространството за записи, които описват Mazdas, докато търговците на употребявани автомобили наблюдават пространството за всички заявки за употребявани автомобили. Когато бъде намерена и прочетена съответстваща заявка, потенциалният продавач записва оферта в пространството, като посочва цена за предлагане. Като потенциален купувач, вие непрекъснато наблюдавате пространството за оферти за вашите неизпълнени заявки, и,когато намерите такъв, който е приемлив, премахвате офертите и се свързвате с продавача (евентуално през пространството чрез друг запис).

Кратък преглед на API

Сега е време да въведем JavaSpaces API. Както вече казахме, това е просто; всъщност в останалата част на тази статия ще разгледаме всичко, което трябва да знаете (с изключение на някои незначителни подробности) за него. Преди обаче да опишем JavaSpaceинтерфейса и неговите методи, първо трябва да поговорим за записи.

Записи

Обект, който се съхранява в пространство, се нарича

влизане.

За да бъде запис, обектът просто трябва да приложи

Entry

интерфейс. Като пример, нека дефинираме запис на съобщение, който можете да запишете в интервал:

импортиране net.jini.core.entry.Entry;

публичен клас Съобщение реализира Entry {public String content;

// обществено съобщение на конструктор no-arg () {}}

Тук дефинирахме Messageклас с низово поле, което ще съдържа съдържанието на съобщението. Тъй като искаме да използваме този клас с интервали, трябва да внедрим интерфейса net.jini.core.entry.Entry, който се намира в пакета net.jini.core.entry. Важно е да се отбележи, че това Entryе маркер интерфейс; с други думи, интерфейсът не съдържа константи или методи и следователно не изисква специална работа за изпълнение, освен добавяне implements Entryкъм дефиницията на вашия клас.

Освен прилагането на Entryинтерфейса, има и няколко други конвенции, които нашите записи трябва да следват. Ще имаме повече да кажем за причините в по-късните статии, но засега ще разгледаме само общите контури. Вписването трябва да има публичен конструктор, който не приема аргументи (така наречения конструктор no-arg ); това изискване произтича от основната сериализация, която възниква, когато записите се прехвърлят в и извън интервалите. Имайте предвид, че нашата дефиниция на Messageсъдържа конструктор no-arg. Друга конвенция е, че полетата на запис трябва да бъдат декларираниpublic; това позволява на други процеси да намират вашите записи в интервали чрез асоциативно търсене, въз основа на стойностите на тези полета. Трета конвенция е, че полетата на запис трябва да съдържат препратки към обекти, а не примитивни типове (т.е. ако трябва да дефинирате примитивно поле от тип, като вместо това intтрябва да използвате съответния клас обвивка Integer). За да сте сигурни, че покривате всичките си основи при дефинирането на записи, препоръчваме ви да се обърнете към JavaSpaces Principles, Patterns и Practice, или към спецификацията Java Microsystems SunSpace за подробности. Също така, както споменахме, ще засегнем някои от по-фините точки в следващите статии.

Освен тези изисквания, записът е като всеки друг Java клас; можете да го създадете, да извикате методите му и да присвоите стойности на неговите публични полета. Сега, когато дефинирахме Messageклас на влизане, нека видим какви операции са налични за взаимодействие с записи в интервали.

Интерфейсът JavaSpace

За да взаимодействате с пространство, трябва да получите достъп до обект, който реализира JavaSpaceинтерфейса. Има много начини за получаване на достъп до такъв обект (можете например да използвате справка Jini или регистъра RMI) и ние ще разгледаме подробностите за това в следващата статия. Засега ще се концентрираме върху самия JavaSpaceинтерфейс.