Apache Thrift

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск
Apache Thrift
ASF-logo.svg
Тип

RPC framework

Разработчик

Apache Software Foundation

Написана на

C++

Операционная система

Кроссплатформенное программное обеспечение

Последняя версия

0.9.2 (07.11.2014)

Лицензия

Apache License 2.0

Сайт

thrift.apache.org

Thrift (англ. бережливость, произносится как θrɪft) — язык описания интерфейсов, который используется для определения и создания служб под разные языки программирования. Является фреймворком к удаленному вызову процедур (RPC). Используется компанией Facebook в качестве масштабируемого кросс-языкового сервиса по разработке. Сочетает в себе программный конвейер с движком генерации кода для разработки служб, в той или иной степени эффективно и легко работающих между такими языками как C#, C++, Cappuccino, Cocoa, Delphi, Erlang, Go, Haskell, Java, OCaml, Perl, PHP, Python, Ruby и Smalltalk. Проще говоря, Thrift является двоичным протоколом связи. С апреля 2007 разрабатывается как open source проект компанией Apache Software Foundation.

Архитектура[править | править вики-текст]

Thrift включает в себя готовый программный конвейер, состоящей из шести уровней, для работы с клиентской и серверной частью. Верхний уровень составляет сгенерированный код описания Thrift. Службы генерируют из него клиентский и серверный код. В отличие от встроенных типов, созданная структура данных возвращается как результат в сгенерированном коде. Уровни протокола и транспортировки являются частью runtime-библиотеки. В Thrift возможно выбрать службы и изменить протокол и транспортировку без перекомпиляции кода. Помимо клиентской части Thrift включает в себя серверную инфраструктуру для связи протокола и транспортировки в blocking, non-blocking и multi-threaded серверах. Основа уровня Ввода/Вывода по-разному реализована для различных языков.

Поддерживаемые протоколы[править | править вики-текст]

  • TBinaryProtocol — Несложный двоичный формат, простой, но не оптимизированный для экономии пространства.
  • TCompactProtocol — Более компактный двоичный формат, как правило более эффективен.
  • TDebugProtocol — Человечески понятный формат текста, помогающий в отладке.
  • TDenseProtocol — Как и в TCompactProtocol, получение мета информации из того, что было передано.
  • TJSONProtocol — Использование JSON’a для раскодировки данных.
  • TSimpleJSONProtocol — Протокол «только для записи», использующий JSON. Подходит для парсинга на скриптовых языках.

Поддерживаемые транспортировщики[править | править вики-текст]

  • TFileTransport — Этот транспортировщик записывает в файл.
  • TFramedTransport — Этот транспортировщик используется, когда применяются non-blocking сервера. Он отправляет данные во фреймах, где каждому фрейму предшествует длина информации.
  • TMemoryTransport — Использование памяти для ввода / вывода. Реализация Java использует простой встроенный ByteArrayOutputStream.
  • TSocket — Использует blocking socket ввода / вывода для транспортировки.
  • TZlibTransport — Выполняет сжатие с помощью zlib. Используется в сочетании с другим транспортом. Отсутствует в реализации Java.

Поддерживаемые сервера[править | править вики-текст]

  • TNonblockingServer — multi-threaded сервер, использующий non-blocking ввод / вывод (Java реализация использует NIO channels). На этих серверах должен использоваться TFramedTransport.
  • TSimpleServer — single-threaded, использующий std blocking ввод / вывод. Полезен для тестирования.
  • TThreadPoolServer — multi-threaded сервер, использующий std blocking ввод / вывод.

Преимущества[править | править вики-текст]

  • Кросс-языковая сериализация с более низкими накладными расходами, в отличие от таких альтернатив как SOAP, за счет использования двоичного формата.
  • Простая и чистая библиотека. Не нуждается в фреймворке для кода. Не использует XML-конфигурацию.
  • Языковые привязки ощущаются естественными. Например, Java использует ArrayList<String>. C++ использует std::vector<std::string>.
  • Формат связи уровня приложений и формат связи уровня сериализации строго разделены. Они могут быть изменены независимо друг от друга.
  • Встроенные типы сериализации включают в себя: двоичный, дружественный к HTTP и компактный двоичный.
  • Складывается, как кросс-языковой сериализованный файл.
  • Мягкие версии протокола. Thrift не требует централизованной и явный механизм, как major-version/minor-version. Слабосвязанные группы могут свободно переходить в RPC вызовы.
  • Независим от архитектуры или от нестандартного ПО. Нет несовместимых лицензий на ПО.

Сравнение с Protocol Buffers[править | править вики-текст]

Apache Thrift Protocol Buffers
Разработчик Facebook, Apache Google
Поддерживаемые языки C++, Java, JavaScript, Python, PHP, XSD, Ruby, C#, Perl, Objective C, Erlang, Smalltalk, OCaml, and Haskell C++, Java, Python (Perl, Ruby, and C# under discussion)
Исходящие форматы Binary, JSON Binary
Простые типы bool
byte
16/32/64-bit integers
double
string
byte sequence
map<t1,t2>
list<t>
set<t>
bool
32/64-bit integers
float
double
string
byte sequence
"repeated" properties act like lists
Константы Да Нет
Составной тип struct message
Исключения Да Нет
Документация Проблематично Хорошая
Лицензия Apache BSD-style
Композитные расширения типов Нет Да

Создание Thrift службы[править | править вики-текст]

Thrift написан на C++, однако код может быть написан на нескольких языках. Для создания Thrift службы для начала надо написать Thrift файлы, которые описывают его, затем сгенерировать код на выходном языке и указать команды запуска сервер, вызвав после чего их в клиенте. Вот пример файла описания:

enum PhoneType {
 HOME,
 WORK,
 MOBILE,
 OTHER
}
 
struct Phone {
 1: i32 id,
 2: string number,
 3: PhoneType type
}

Thrift сгенерирует код из этого файла описания, например, в Java. PhoneType будет простым перечислением (enum) внутри POJO для класса Phone.

Сайты, использующие Thrift[править | править вики-текст]

Facebook — социальная сеть и первый разработчик Thrift.
facebook.com
last.fm — веб-анализатор музыки.
last.fm
reCaptcha — самая популярная каптча.
recaptcha.com
RapLeaf
rapleaf.com
Evernote — онлайн-сервис и ряд приложений для различных платформ, предназначенные для сохранения, синхронизации и поиска заметок.
evernote.com
OpenX
openx.com
Mendeley — бесплатный онлайн-сервис для управления библиографической информацией, позволяющая хранить и просматривать исследовательские труды в формате PDF.
mendeley.com
ONEsite
onesite.com
api.2gis.ru
api.2gis.ru

Ссылки[править | править вики-текст]