Русская Википедия:Apache Thrift
Шаблон:Infobox software Thrift (Шаблон:Tr-en, произносится как Шаблон:IPA) — язык описания интерфейсов, который используется для определения и создания служб под разные языки программирования. Является фреймворком к удалённому вызову процедур (RPC). Используется компанией Facebook в качестве масштабируемого кросс-языкового сервиса по разработке. Сочетает в себе программный конвейер с движком генерации кода для разработки служб, в той или иной степени эффективно и легко работающих между такими языками как[1] C#, C++, Cappuccino, Cocoa, Delphi, Erlang, Go, Haskell, Java, OCaml, Perl, PHP, Python, Ruby, Rust, Smalltalk и JavaScript[2]. Проще говоря, 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, 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 службы
Шаблон:Викиучебник 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.
Примечания
Литература
Ссылки
- Шаблон:Official website
- Thrift: The Missing Guide Шаблон:Wayback
- Thrift Ant task
- Thrift tutorial Шаблон:Wayback
- Thrift Installation Tutorial Spanish-Español
Шаблон:Нет источников Шаблон:Rq
Шаблон:Apache Шаблон:Facebook navbox
- ↑ Шаблон:Cite web
- ↑ Шаблон:Cite web
- ↑ Thrift vs Protocol Bufffers vs JSON Шаблон:Wayback, MirthLab LLC, 2009
- Страницы, использующие устаревший тег source
- Русская Википедия
- Протоколы прикладного уровня
- Форматы данных
- Межпроцессное взаимодействие
- Удалённый вызов процедур
- Страницы, где используется шаблон "Навигационная таблица/Телепорт"
- Страницы с телепортом
- Википедия
- Статья из Википедии
- Статья из Русской Википедии