Thrift es un lenguaje de definición de interfaz y un protocolo de comunicación binaria [1] que se utiliza para definir y crear servicios para numerosos lenguajes de programación. [2] Forma un marco de llamada a procedimiento remoto (RPC) y fue desarrollado en Facebook para el "desarrollo escalable de servicios en varios idiomas". Combina una pila de software con un motor de generación de código para crear servicios multiplataforma que pueden conectar aplicaciones escritas en una variedad de lenguajes y marcos, incluidos ActionScript , C , C ++ , [3] C # ,Cappuccino , [4] Cocoa , Delphi , Erlang , Go , Haskell , Java , JavaScript , Objective-C , OCaml , Perl , PHP , Python , Ruby , Elixir , [5] Rust , Scala , Smalltalk y Swift . [6] Fue desarrollado en Facebook y ahora (2020) es un proyecto de código abierto en la Apache Software Foundation . La implementación se describió en un documento técnico de abril de 2007 publicado por Facebook, ahora alojado en Apache. [7] [8]
Autor (es) original (es) | |
---|---|
Desarrollador (es) | Fundación de software Apache |
Lanzamiento estable | 0.14.1 / 8 de marzo de 2021 |
Repositorio | Repositorio de segunda mano |
Escrito en | ActionScript , C , C # , C ++ , D , Dart , Delphi, Erlang , Go , Haskell , Haxe , Java , JavaScript , Node.js , OCaml , Perl , PHP , Python , Rust , Scala , SmallTalk |
Tipo | Marco de llamada a procedimiento remoto |
Licencia | Licencia Apache 2.0 |
Sitio web | ahorro .apache .org |
Arquitectura
Thrift incluye una pila completa para crear clientes y servidores. [9] La parte superior es un código generado a partir de la definición de Thrift. A partir de este archivo, los servicios generan código de cliente y procesador. A diferencia de los tipos integrados, las estructuras de datos creadas se envían como resultado del código generado. El protocolo y la capa de transporte son parte de la biblioteca en tiempo de ejecución . Con Thrift, es posible definir un servicio y cambiar el protocolo y el transporte sin volver a compilar el código. Además de la parte del cliente, Thrift incluye una infraestructura de servidor para unir protocolos y transportes, como servidores de bloqueo, no bloqueo y multiproceso. La parte de E / S subyacente de la pila se implementa de manera diferente para diferentes idiomas.
Thrift admite varios protocolos: [9]
- TBinaryProtocol: un formato binario sencillo, simple, pero no optimizado para la eficiencia del espacio . Más rápido de procesar que el protocolo de texto, pero más difícil de depurar .
- TCompactProtocol: formato binario más compacto; típicamente más eficiente de procesar también
- TJSONProtocol: utiliza JSON para la codificación de datos.
- TSimpleJSONProtocol: un protocolo de solo escritura que Thrift no puede analizar porque elimina metadatos mediante JSON. Adecuado para analizar mediante lenguajes de secuencias de comandos. [10]
Los transportes admitidos son:
- TSimpleFileTransport: este transporte escribe en un archivo.
- TFramedTransport: este transporte es necesario cuando se utiliza un servidor sin bloqueo. Envía datos en cuadros, donde cada cuadro está precedido por información de longitud.
- TMemoryTransport - Utiliza la memoria de E / S . La implementación de Java usa un simple
ByteArrayOutputStream
internamente. - TSocket: utiliza E / S de socket de bloqueo para el transporte.
- TZlibTransport: realiza la compresión mediante zlib . Utilizado junto con otro transporte.
Thrift también proporciona una serie de servidores, que son
- TNonblockingServer: un servidor de subprocesos múltiples que utiliza E / S sin bloqueo (la implementación de Java utiliza canales NIO ). TFramedTransport debe utilizarse con este servidor.
- TSimpleServer: un servidor de un solo subproceso que utiliza E / S de bloqueo estándar. Útil para realizar pruebas.
- TThreadedServer: un servidor de subprocesos múltiples que utiliza un subproceso por modelo de conexión y E / S de bloqueo estándar.
- TThreadPoolServer: un servidor de subprocesos múltiples que utiliza un grupo de subprocesos y E / S de bloqueo estándar.
Beneficios
Algunos beneficios declarados de Thrift incluyen: [ cita requerida ]
- Serialización en varios idiomas con una sobrecarga más baja que las alternativas como SOAP debido al uso de formato binario.
- No hay archivos de configuración XML .
- Las ataduras de idiomas se sienten naturales. Por ejemplo, Java usa
ArrayList
. Usos de C ++std::vector<:string>
. - El formato de conexión a nivel de aplicación y el formato de conexión a nivel de serialización están claramente separados. Se pueden modificar de forma independiente.
- Los estilos de serialización predefinidos incluyen: binario, binario compacto y compatible con HTTP.
- También funciona como serialización de archivos en varios idiomas .
- Versiones suaves [ aclarar ] del protocolo. Thrift no requiere un mecanismo centralizado y explícito como versión mayor / versión menor . Los equipos débilmente acoplados pueden evolucionar libremente las llamadas RPC.
- Sin dependencias de compilación ni software no estándar. Sin combinación de licencias de software incompatibles.
Creación de un servicio de ahorro
Thrift está escrito en C ++, pero puede crear código para varios lenguajes. Para crear un servicio Thrift, uno tiene que escribir archivos Thrift que lo describan, generar el código en el idioma de destino, escribir algún código para iniciar el servidor y llamarlo desde el cliente. Aquí hay un ejemplo de código de un archivo de descripción de este tipo:
enum PhoneType { INICIO , TRABAJAR , MÓVIL , OTRO}struct Phone { 1 : identificación i32 , 2 : número de cuerda , 3 : Tipo de tipo de teléfono }service PhoneService { FindById del teléfono ( 1 : i32 id ), list < Teléfono > findAll ( ) }
Thrift generará el código a partir de esta información descriptiva. Por ejemplo, en Java, PhoneType
será un simple enumdentro de la Phone
clase.
Ver también
- Comparación de formatos de serialización de datos
- Apache Avro
- Notación de sintaxis abstracta uno (ASN.1)
- arpillera
- Búferes de protocolo
- Representación de datos externos (XDR)
- Motor de comunicaciones de Internet (Ice)
- gRPC
- SDXF
Referencias
- ^ "Instalación y uso de Apache Cassandra con Java Part 4 (Thrift Client)" . http://www.sodeso.nl/ : Sodeso - Soluciones de desarrollo de software . Consultado el 30 de marzo de 2011 .
Thrift es un proyecto Apache separado que es un protocolo de comunicación binario
- ^ Andrew Prunicki. "Apache Thrift: Introducción" . http://www.ociweb.com/ : Object Computing Inc. - Una empresa de soluciones abiertas . Consultado el 11 de abril de 2011 .
A través de un lenguaje de definición de interfaz (IDL) simple y directo, Thrift permite a [los usuarios] definir y crear servicios que son consumibles y útiles para numerosos idiomas. Mediante la generación de código, Thrift crea un conjunto de archivos que luego se pueden usar para crear clientes y / o servidores. Además de la interoperabilidad, Thrift puede ser muy eficiente a través de un mecanismo de serialización único que es eficiente tanto en tiempo como en espacio.
- ^ Requisitos de ahorro , consulte este problema para soporte de Windows
- ↑ Fred Potter, Using Thrift with Cappuccino Archivado el12 de agosto de 2011en la Wayback Machine , el blog postrously delicioso de parallel48, 10 de junio de 2010.
- ^ pinterest / elixir-thrift , Pinterest, 2020-02-05 , recuperado 2020-02-06
- ^ Andrew Prunicki. "Apache Thrift: generación de código" . http://www.ociweb.com/ : Object Computing Inc. - Una empresa de soluciones abiertas . Consultado el 12 de abril de 2011 .
Thrift admite muchos lenguajes de programación en grados muy diversos. La lista completa está a continuación. Tenga cuidado antes de asumir que solo porque su idioma tiene algún soporte, es compatible con todas las funciones de Thrift. Python, por ejemplo, solo admite TBinaryProtocol. Cocoa, C ++, C #, Erlang, Haskell, Java, OCaml, Perl, PHP, Python, Ruby y Smalltalk
- ^ Mark Slee, Aditya Agarwal, Marc Kwiatkowski, Thrift: Implementación escalable de servicios multilingües
- ^ "LibraryFeatures - Thrift Wiki" . Consultado el 21 de abril de 2016 .
- ^ a b Andrew Prunicki. "Apache Thrift: Introducción" . http://www.ociweb.com/ : Object Computing Inc. - Una empresa de soluciones abiertas . Consultado el 11 de abril de 2011 .
La parte superior de la pila se genera código a partir de su archivo de definición de Thrift. Los servicios de ahorro dan como resultado un código de cliente y procesador generado. Estos están representados por los recuadros marrones en el diagrama. Las estructuras de datos que se envían (distintas de los tipos integrados) también dan como resultado código generado. Estos resultan en los recuadros rojos. El protocolo y el transporte son parte de la biblioteca en tiempo de ejecución de Thrift. Por lo tanto, con Thrift, puede definir un servicio y es libre de cambiar el protocolo y el transporte sin volver a generar su código. Thrift también incluye una infraestructura de servidor para unir los protocolos y los transportes. Hay disponibles servidores de bloqueo, no bloqueo, de uno o varios subprocesos. La parte de "E / S subyacente" de la pila difiere según el idioma en cuestión. Para la E / S de red de Java y Python, las bibliotecas integradas son aprovechadas por la biblioteca Thrift, mientras que la implementación de C ++ usa su propia implementación personalizada.
- ^ Skelton, Steven. "Registro de solicitudes de ahorro amigable para desarrolladores" . Consultado el 3 de julio de 2014 .
enlaces externos
- Página web oficial