Из Википедии, бесплатной энциклопедии
  (Перенаправлено из Thrift (протокол) )
Перейти к навигации Перейти к поиску

Thrift - это язык определения интерфейса и протокол двоичной связи [1], используемый для определения и создания сервисов для множества языков программирования. [2] Он формирует структуру удаленного вызова процедур (RPC) и был разработан в Facebook для «разработки масштабируемых межъязыковых сервисов». Он сочетает в себе программный стек с механизмом генерации кода для создания кроссплатформенных сервисов, которые могут соединять приложения, написанные на различных языках и фреймворках, включая ActionScript , C , C ++ , [3] C # ,Cappuccino , [4] Какао , Delphi , Erlang , Go , Haskell , Java , JavaScript , Objective-C , OCaml , Perl , PHP , Python , Ruby , Elixir , [5] Rust , Scala , Smalltalk и Swift . [6] Он был разработан в Facebook, и теперь (2020) это проект с открытым исходным кодом в Apache Software Foundation.. Реализация была описана в техническом документе, выпущенном Facebook в апреле 2007 года, который теперь размещен на Apache. [7] [8]

Архитектура [ править ]

Клиент-серверная архитектура Apache Thrift API

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

Thrift поддерживает ряд протоколов: [9]

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

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

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

Thrift также предоставляет ряд серверов, которые

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

Преимущества [ править ]

Некоторые заявленные преимущества Thrift включают: [ необходима ссылка ]

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

Создание сберегательного сервиса [ править ]

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

enum PhoneType {   ГЛАВНАЯ , РАБОТА , МОБИЛЬНЫЙ , ДРУГИЕ}struct Phone {   1 : идентификатор i32 ,   2 : номер строки ,   3 : Тип PhoneType  }service PhoneService {   Телефон findById ( 1 : i32 id ),    list < Телефон > findAll ( ) }

Thrift сгенерирует код на основе этой описательной информации. Например, в Java это PhoneTypeбудет просто enumвнутри Phoneкласса.

См. Также [ править ]

  • Сравнение форматов сериализации данных
  • Apache Avro
  • Первая абстрактная синтаксическая нотация (ASN.1)
  • Гессен
  • Буферы протокола
  • Представление внешних данных (XDR)
  • Система Интернет-коммуникаций (Ice)
  • gRPC
  • SDXF

Ссылки [ править ]

  1. ^ «Установка и использование Apache Cassandra с Java, часть 4 (экономичный клиент)» . http://www.sodeso.nl/ : Sodeso - Решения для разработки программного обеспечения . Проверено 30 марта 2011 . Thrift - это отдельный проект Apache, который представляет собой двоичный протокол связи.
  2. ^ Эндрю Prunicki. «Apache Thrift: Введение» . http://www.ociweb.com/ : Object Computing Inc. - компания открытых решений . Проверено 11 апреля 2011 . Посредством простого и понятного языка определения интерфейса (IDL) Thrift позволяет [пользователям] определять и создавать сервисы, которые могут потребляться и обслуживаться множеством языков. Используя генерацию кода, Thrift создает набор файлов, которые затем можно использовать для создания клиентов и / или серверов. Помимо возможности взаимодействия, Thrift может быть очень эффективным благодаря уникальному механизму сериализации, который эффективен как во времени, так и в пространстве.
  3. ^ Требования к сбережению , см. Эту проблему для поддержки Windows
  4. Fred Potter, Using Thrift with Cappuccino Архивировано 12 августа 2011 г.в Wayback Machine , постер сочный блог parallel48, 10 июня 2010 г.
  5. ^ pinterest / elixir-thrift , Pinterest, 05.02.2020 , получено 06.02.2020
  6. ^ Эндрю Prunicki. «Экономичность Apache: создание кода» . http://www.ociweb.com/ : Object Computing Inc. - компания открытых решений . Проверено 12 апреля 2011 . Thrift поддерживает множество языков программирования тоже в разной степени. Полный список ниже. Будьте осторожны, прежде чем предполагать, что только потому, что ваш язык имеет некоторую поддержку, он поддерживает все функции Thrift. Например, Python поддерживает только TBinaryProtocol. Какао, C ++, C #, Erlang, Haskell, Java, OCaml, Perl, PHP, Python, Ruby и Smalltalk
  7. ^ Марк Slee, Адитья Агарвал, Марк Квятковский, бережливость: Реализация Scalable Cross-Language Services
  8. ^ «Особенности библиотеки - Thrift Wiki» . Проверено 21 апреля 2016 .
  9. ^ а б Эндрю Пруницкий. «Apache Thrift: Введение» . http://www.ociweb.com/ : Object Computing Inc. - компания открытых решений . Проверено 11 апреля 2011 .Верхняя часть стека - это сгенерированный код из вашего файла определения Thrift. В результате сберегательных услуг создается код клиента и процессора. На схеме они представлены коричневыми прямоугольниками. Отправляемые структуры данных (кроме встроенных типов) также приводят к сгенерированному коду. В результате появляются красные прямоугольники. Протокол и транспорт являются частью библиотеки времени выполнения Thrift. Поэтому с помощью Thrift вы можете определить службу и можете свободно изменять протокол и транспорт без повторной генерации кода. Thrift также включает в себя серверную инфраструктуру для объединения протоколов и транспорта. Доступны блокирующие, неблокирующие, однопоточные и многопоточные серверы. Часть стека «Базовый ввод-вывод» различается в зависимости от рассматриваемого языка. Для сетевого ввода-вывода Java и Pythonвстроенные библиотеки используются библиотекой Thrift, в то время как реализация C ++ использует свою собственную реализацию.
  10. ^ Скелтон, Стивен. «Ведение журнала запросов на сбережение, удобное для разработчиков» . Проверено 3 июля 2014 года .

Внешние ссылки [ править ]

  • Официальный веб-сайт