Apache Thrift
| Apache Thrift | |
|---|---|
| | |
| Тип | RPC framework |
| Разработчик | Apache Software Foundation |
| Написана на | C++ |
| Операционная система | Кроссплатформенное программное обеспечение |
| Дата выпуска | 14 апреля 2012[1] |
| Последняя версия | 0.16.0 (9 февраля 2022) |
| Репозиторий |
git-wip-us.apache.org/re… github.com/apache/thrift… |
| Лицензия | Apache License 2.0 |
| Сайт | thrift.apache.org |
Thrift (с англ. — «бережливость», произносится как [θrift]) — язык описания интерфейсов, который используется для определения и создания служб под разные языки программирования. Является фреймворком к удалённому вызову процедур (RPC). Используется компанией Facebook в качестве масштабируемого кросс-языкового сервиса по разработке. Сочетает в себе программный конвейер с движком генерации кода для разработки служб, в той или иной степени эффективно и легко работающих между такими языками как[2] C#, C++, D, 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
| Apache Thrift | Protocol Buffers | |
|---|---|---|
| Разработчик | Facebook, Apache | |
| Поддерживаемые языки | C++, C#, Dart, D, Go, Haskell, Java, JavaScript, Python, PHP, XSD, Ruby, Perl, Objective C,
Erlang, 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 службы
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.
Примечания
- ↑ https://projects.apache.org/json/projects/thrift.json
- ↑ Apache Thrift - Language and Feature Matrix. Дата обращения: 11 марта 2019. Архивировано 8 марта 2019 года.
- ↑ Apache Thrift - Javascript. thrift.apache.org. Дата обращения: 13 октября 2016. Архивировано 9 октября 2016 года.
- ↑ 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
Content Disclaimer
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.
- The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
- There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
- It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
- Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.