Apache Thrift

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 16:14, 21 декабря 2017.
Apache Thrift
Apache logo.png
Apache Thrift Logo
Парадигма Протокол коммуникаций, описывающий
Спроектировано Facebook
Разработчики Apache Software Foundation
Первый   появившийся April 2007; 13 years ago (2007-04)
Стабильная версия 0.10.0 / 1 March 2017 года; 4 years ago (2017-03-01)
Язык физической реализации C++
Платформа Кросс-платформенное
Лицензия Apache License 2.0
Портал: thrift.apache.org

Thrift - это язык описания интерфейсов и двоичный протокол коммуникации, который используется для описания и создания сервисов для различных языков программирования. Он используется в качестве удаленного вызова процедур (RPC). Основу и разработан компанией Facebook для "масштабируемых кросс-языковых служб развития".Он сочетает в себе программный стек с ядром генерации кода для построения кросс-платформенных служб, которые могут подключать приложения и сервисы, написанных на различных языках и платформах, таких как ActionScript, C, C++, C#, Cappuccino, Cocoa, Delphi, Erlang, Go, Haskell, Java, Node.js, Objective-C, OCaml, Perl, PHP, Python, Ruby and Smalltalk. Проще говоря, Thrift является двоичным протоколом связи. Сейчас компания Facebook разрабатывает Apache Thrift как open source проект с открытым исходным кодом. Реализация состоялась в апреле 2007 года, технический документ, выпущенная на сайте Facebook, теперь размещается на сайте Apache Software Foundation.[Источник 1].

Архитектура

Thrift включает в себя полный стек для создания клиентов и серверов. Верхняя часть генерируется кодом из Thrift. Из этого файла службы генерируют клиентский и процессорный код. В отличие от встроенных типов, созданные структуры данных отправляются в результате генерируемого кода. Протокол и транспортный слой являются частью библиотеки времени выполнения. Протокольный и транспортный уровень - часть библиотеки времени выполнения. С Thrift возможно определить службу или протокол после чего транспортировать/изменить их, не перекомпилировав код. Помимо клиентской части, Thrift включает инфраструктуру сервера, чтобы связать протоколы, как блокированные, неблокированные и многопоточные серверы. Базовая часть ввода-вывода стека реализована под различные языки.

Thrift поддерживает множество протоколов:

  • TBinaryProtocol - прямой двоичный формат, простой, но не оптимизированный для экономии пространства. Быстрее обрабатывает текстовый протокол, но дольше отлаживает;
  • TCompactProtocol - более компактный двоичный формат; как правило, более эффективен;
  • TDebugProtocol - удобный для чтения текстовый формат для облегчения отладки;
  • TDenseProtocol - похож на TCompactProtocol, но имеет более подробную метаинформацию, что обеспечивается её передачей;
  • TJSONProtocol - использует JSON для кодирования данных;
  • TSimpleJSONProtocol - протокол только для записи, который не может быть проанализирован Thrift, поскольку он шифрует метаданные с помощью JSON. Подходит для синтаксического анализа на скриптовых языках;

Поддерживаемые транспортировщики:

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

Thrift также предоставляет несколько серверов, такие как:

  • TNonblockingServer - многопоточный сервер, использующий неблокирующий ввод-вывод (реализация Java использует каналы NIO). TFramedTransport должен использоваться с этим сервером;
  • TSimpleServer - однопоточный сервер с использованием стандартного блокировщика ввода-вывода. Используется для тестирования;
  • TThreadPoolServer - многопоточный сервер, использующий стандартный блокировщик ввода/вывода;

Преимущества

Apache Thrift имеет ряд преимуществ такие как:

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

Сравнение с 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 и C# обсуждаются)
Исходящие форматы 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 используется для генерации вашего файла Thrift в исходный код, который используется разными клиентскими библиотеками и сервером, который вы пишете. Чтобы сгенерировать источник Thrift выполните следующее действие:[Источник 3].

 thrift --gen <language> <Thrift filename> 

Чтобы рекурсивно генерировать исходный код из файла Thrift и всех других файлов Thrift, включенных в него, выполните:

 thrift -r --gen <language> <Thrift filename> 

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

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

 enum ComType {
  PUB,
  WORK,
  CLUB,
  HOME
}

struct Com {
  1: i32 id,
  2: string number,
  3: ComType type
}

service ComSvc {
  Com findById(1: i32 id),
  list<Com> findAll()
} 

Thrift генерирует код из этой описательной информации. Например, в Java, ComType будет простым перечислением внутри класса Com.

Источники

  1. Apache Thrift // Wikipedia. [2012-2017]. Дата обновления: 30.11.2017. URL: https://en.wikipedia.org/wiki/Apache_Thrift (дата обращения: 01.12.2017)
  2. Apache Thrift // Wikipedia. [2013-2017]. Дата обновления: 28.09.2017. URL: https://ru.wikipedia.org/wiki/Apache_Thrift (дата обращения: 01.12.2017)
  3. Apache Thrift Tutorial // Thrift apache. [2007-2017]. Дата обновления: 28.09.2017. URL: http://thrift.apache.org/tutorial/ (дата обращения: 01.12.2017)