Abstract Syntax Notation One Состоит из двух разных частей: первая определяет стандарт записи сообщений, вторая - стандарт кодирования и декодирования.
Ниже приводится пример протокола (лист.2), описанного с помощью этого стандарта.Work DEFINITIONS ::= BEGIN
Human ::= SEQUENCE {
name IA5String,
age INTEGER
}
Person ::= SEQUENCE {
hasWork BOOLEAN
}
END
Листинг 2. Пример сообщений в ASN.1
Из данного примера видно, что дизайн языка не является правильным, поскольку сильно отличается от описания структур и классов в популярных современных языках программирования, таких как C#, Java, C++, Objective C, Java. Также он является избыточным.
В данном стандарте содержится несколько видов кодирования.
Формат CER , DER - кодирования очень близкие к Hessian. Являются избыточными, хранят в себе описание типов. Отличаются друг от друга правилами хранения длины: CER хранит завершающий октет, DER хранит длину.
Формат BER – отличается от CER и DER тем, что может поддерживать внутри себя несколько типов кодирования. (хранение длины может быть разным)
Формат XER – кодирование с помощью XML, нужно для возможности чтения сообщений людьми, неоптимальное.
Формат PER (Packed Encoding Rule) – для этого кодирования важно знать структуру передаваемых сообщений. Является компактным. Поддерживает два режима: с выравниванием по байтам и без. Умеет кодировать информацию в битовые массивы.
В данной технологии описаны только стандарты. Стандарт же отображения на конкретный язык программирования не стандартизирован. Стандарт является сложным и для его использования требуется приобретение ASN.1 компилятора. Если же есть отображение в несколько языков, то требуется несколько компиляторов. Таким образом, эта технология является слишком сложной для собственной реализации, покупка же не целесообразна.
Etch Является независимым от платформы и языка, свободнорасширяемым решением. В данный момент существуют отображения в языки Java, C, C#, Go, JavaScript, Python. Позволяет определять сервисы, сообщения, создавать простые и быстрые приложения.
Для описания сервисов был создан специальный язык. Пример сервиса из такого языка приведен в листинге (лист.3).
module org.apache.etch.examples.helloworld service HelloWorld {
struct User (
int id,
string name
) exception UserUnknownException (
string mes
) @Direction(Server)
string sayHello(User toWhom) throws UserUnknownException }
Листинг 3. Пример сервиса в Etch Из примера видно, что синтаксис языка очень похоже на синтаксис языка Java. Кроме того, разработчики проводят тестирование производительности и сравнение именно на Java. В данный момент поддержка языка Objective C не реализована и её нет в планах на ближайшее будущее, что является проблемой при разработке приложений под платформу iOS.
Разработчики добились ускорения почти в 2 раза по сравнению с RMI и более чем в 5 раз по сравнению с Corba. Для тестирования был выбран сервис складывающий два числа.
Таким образом, данное решение является хорошим, поскольку обеспечивает должную простоту при нужных возможностях, но пока что является неполным и незавершенным. В данный момент реализованными протоколами являются бинарный и xml. Однако, как и некоторые упомянутые выше форматы, бинарный формат etch является избыточным, потому что хранит в себе теги, определяющие тип содержимого, что можно избежать, если заранее знать структуру. Имена структур передаются не строкой, а 32битным хешем от строки, поэтому достигается большая компактность, но отсутствует возможность переименования.
Thrift Предлагает решение для таких языков, как C++, C#, Java, Python, Php, Ruby, Erlang, Perl, Haskell, Objective C, JavaScript, SmallTalk, OCaml, AS3.
В данном решении присутствует ряд возможностей, которые не поддержаны: наследование, циклические структуры, null как результат вызова, то есть если пользователь хочет вернуть null метода, то он должен сделать обёртку, некий маркер, который будет означать пустой результат.
Поддержано три основных метода кодирования: JSON, binary и compact. Однако компактный метод кодирования в данный момент реализован лишь для нескольких платформ и не имеет стандарта, на сайте разработчиков можно предложить свою версию алгоритма, который сможет уменьшить размер сообщений.
В примере (лист.4) приведен пример описания структуры.
struct Work {
1: i32 num1 = 0,
2: i32 num2,
3: Operation op,
4: optional string comment,
}
Листинг 4. Пример структуры в Thrift
Из данного примера видно, что возможны опциональные поля. Также можно указывать номера полей, чтобы в дальнейшем при добавлении новых не происходило ошибок. Данный момент является очень тонким: сохранение номеров позволяет добиться версионирования, но заметно увеличивает размер передаваемых сообщений, так как при кодировании также нужно закодировать номер. Заметим, что при удалении поля устаревшие клиенты чаще всего будут выдавать ошибку, если им необходимо это поле. При добавлении же нового поля в конец структуры ошибок не будет, так как на устаревших клиентах процесс разбора сообщения может просто пропустить лишние поля. Поэтому в данной работе было решено не передавать дополнительную информацию, как это делает Thrift.
Как было описано во введении, в рамках данного проекта важна возможность интеграции с GWT. В данный момент уже существует возможность добиться интеграции двух этих технологий, однако, это сложная задача и предлагаемые решения не являются универсальными, также нет гарантии качества, поэтому при изменении одной из технологий может оказаться, что существующая интеграция больше не работает.
Thrift мог бы являться одним из лучших решений поставленной задачи, поскольку он обладает простым интерфейсом, не осложнен избыточным функционалом, быстрый и легковесный, поддерживает большое число платформ.
Однако его использование неудобно в рамках данного проекта, поскольку в нём нет циклических структур, существуют ограничения на возвращаемые значения, решение является не расширяемым.
|