Thrift (, произносится как ) — язык описания интерфейсов, который используется для определения и создания служб под разные языки программирования. Является фреймворком к удалённому вызову процедур (RPC). Используется компанией Facebook в качестве масштабируемого кросс-языкового сервиса по разработке. Сочетает в себе программный конвейер с движком генерации кода для разработки служб, в той или иной степени эффективно и легко работающих между такими языками как C#, C++, D, Cappuccino, Cocoa, Delphi, Erlang, Go, Haskell, Java, OCaml, Perl, PHP, Python, Ruby, Rust, Smalltalk и JavaScript. Проще говоря, 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 Thrift vs Protocol Bufffers vs JSON , MirthLab LLC, 2009 Apache Thrift Protocol Buffers Разработчик Facebook, Apache Google Поддерживаемые языки 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 Простые типы boolbyte16/32/64-bit integersdoublestringbyte sequencemap<t1,t2>list<t>set<t> bool32/64-bit integersfloatdoublestringbyte 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.
Примечания
Литература
Ссылки
Thrift: The Missing Guide Thrift Ant task Thrift tutorial Thrift Installation Tutorial Spanish-Español
Категория:Протоколы прикладного уровня Категория:Форматы данных Категория:Facebook Категория:Межпроцессное взаимодействие Категория:Удалённый вызов процедур