Apache Thrift

Apache Thrift
Логотип программы Apache Thrift
Тип RPC framework
Разработчик Apache Software Foundation
Написана на C++
Операционная система Кроссплатформенное программное обеспечение
Первый выпуск 14 апреля 2012[1]
Последняя версия 0.16.0 (9 февраля 2022; 2 года назад (2022-02-09))
Репозиторий git-wip-us.apache.org/re…
github.com/apache/thrift…
Лицензия Apache License 2.0
Сайт thrift.apache.org
Логотип Викисклада Медиафайлы на Викискладе

Thrift (с англ. — «бережливость», произносится как [θrift]) — язык описания интерфейсов, который используется для определения и создания служб под разные языки программирования. Является фреймворком к удалённому вызову процедур (RPC). Используется компанией Facebook в качестве масштабируемого кросс-языкового сервиса по разработке. Сочетает в себе программный конвейер с движком генерации кода для разработки служб, в той или иной степени эффективно и легко работающих между такими языками как[2] C#, C++, Cappuccino, Cocoa, Delphi, Erlang, Go, Haskell, Java, OCaml, Perl, PHP, Python, Ruby, Rust, Smalltalk и JavaScript[3]. Проще говоря, 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

[4]

Apache Thrift Protocol Buffers
Разработчик Facebook, Apache Google
Поддерживаемые языки C++, C#, Dart, D, Go, Haskell, Java, JavaScript, Python, PHP, XSD, Ruby, Perl, Objective C,

Erlang, Ruby, Smalltalk, OCaml, Haskell

C++, C#, Dart, Go, Java, JavaScript, Python, PHP, Objective C, Ruby
Исходящие форматы 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
повторные свойства работают как списки
Константы Да Нет
Составной тип struct message
Исключения Да Нет
Документация Проблематично Хорошая
Лицензия Apache BSD-style
Расширения составных типов Нет Да

Создание Thrift службы

Логотип Викиучебника Имеется викиучебник по теме «Apache 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.

Примечания

  1. https://projects.apache.org/json/projects/thrift.json
  2. Apache Thrift - Language and Feature Matrix  (неопр.). Дата обращения: 11 марта 2019. Архивировано 8 марта 2019 года.
  3. Apache Thrift - Javascript  (неопр.). thrift.apache.org. Дата обращения: 13 октября 2016. Архивировано 9 октября 2016 года.
  4. Thrift vs Protocol Bufffers vs JSON Архивная копия от 7 ноября 2015 на Wayback Machine, MirthLab LLC, 2009

Литература

  • Randy Abernethy. The Programmer's Guide to Apache Thrift. — Manning Publications Company, 2015. — ISBN 978-1-61729-181-4.

Ссылки

  • thrift.apache.org — официальный сайт Apache Thrift
  • Thrift: The Missing Guide Архивная копия от 23 февраля 2013 на Wayback Machine
  • Thrift Ant task
  • Thrift tutorial Архивная копия от 8 февраля 2016 на Wayback Machine
  • Thrift Installation Tutorial Spanish-Español
Перейти к шаблону «Apache»
Проекты верхнего уровня
Подпроекты
Apache Commons
Lucene
DB[вд]
  • Derby
  • Torque[англ.]
  • DdlUtils[англ.]
  • OJB[англ.]
  • JDO[англ.]
Apache Web Services[англ.]
  • Axis[англ.]
  • Axis2[англ.]
  • CXF
  • WS-Commons[англ.]
  • EWS[англ.]
  • JaxMe[англ.]
  • jUDDI[англ.]
  • Kandula[англ.]
  • Mirae[англ.]
  • Muse[англ.]
  • Pubscribe[англ.]
  • Sandesha[англ.]
  • Scout[англ.]
  • SOAP[англ.]
  • Synapse[англ.]
  • TSIK[англ.]
  • Tuscany[англ.]
  • Woden[англ.]
  • WSIF[англ.]
  • WSRF[англ.]
  • WSS4J[англ.]
  • XML-RPC[англ.]
Другие проекты
Развивающиеся проекты (Incubator)
  • XAP[англ.]
  • River[англ.]
  • OpenEJB[англ.]
  • OpenJPA[англ.]
  • Graffito[англ.]
  • Tuscany[англ.]
  • Log4Net[англ.]
  • Roller
  • Felix
  • Abdera[англ.]
  • CeltiXfire[англ.]
  • FtpServer[англ.]
  • Heraldry[англ.]
  • Ivy[англ.]
  • JuiCE[англ.]
  • Kabuki[англ.]
  • Lokahi[англ.]
  • Lucene.Net[англ.]
  • mod_ftp[англ.]
  • NMaven[англ.]
  • Ode[англ.]
  • stdcxx[англ.]
  • Woden[англ.]
  • WSRP4J[англ.]
  • Yoko[англ.]
  • WADI[англ.]
  • Qpid
  • TripleSoup[англ.]
  • UIMA[англ.]
  • Adobe Flex
Списанные проекты (Attic)
  • AxKit[англ.]
  • Beehive[англ.]
  • Cactus[англ.]
  • ECS[англ.]
  • Excalibur[англ.]
  • Harmony
  • HiveMind[англ.]
  • iBATIS[англ.]
  • Jakarta
  • ORO[англ.]
  • Regexp[англ.]
  • Shale
  • Slide[англ.]
  • Taglibs[англ.]
Перейти к шаблону «Facebook navbox»
Сервисы
Facebook
Другие
Meta Quest
Закрытые
Люди
Основатели
Совет директоров
Руководство
Текущее
  • Марк Цукерберг (генеральный директор)
  • Крис Кокс[англ.] (вице-президент по продуктам)
  • Шерил Сэндберг (COO)
  • Эллиот Шрадж[англ.] (вице-президент по глобальным коммуникациям, маркетингу и публичной политике)
  • Майк Шрепфер (CTO)
  • Тед Улиот[англ.] (вице-президент и генеральный советник)
Бывшее
  • Шон Паркер (президент)
  • Оуэн Ван Натта[англ.] (COO)
  • Гидеон Ю[англ.] (финансовый директор)
  • Адам д'Анджело[англ.] (CTO)
  • Крис Келли[англ.] (директор по конфиденциальности)
  • Мэтт Коулер[англ.] (вице-президент по управлению продуктами)
  • Брет Тейлор[англ.] (CTO)
Известные
сотрудники
Текущие
  • Рэнди Цукерберг[англ.] (директор по маркетингу)
Бывшие
ПО
СМИ
Концепции
Бизнес
  • История Facebook[англ.]
  • Список слияний и поглощений Meta Platforms[англ.]
  • Facebook F8[англ.]
  • Первичное публичное размещение акций Facebook[англ.]
  • Цензура Facebook[англ.]
  • Критика Facebook
    • Скандал с Facebook и Cambridge Analytica[англ.]
    • Facebook Papers[англ.]
    • Вопросы конфиденциальности Facebook[англ.]
  • Иски с участием Meta Platforms[англ.]
Связанное