serialization - buffers - protobuf vs json
¿Las mayores diferencias entre Thrift y Protocol Buffers? (13)
Ambos ofrecen muchas de las mismas características; sin embargo, hay algunas diferencias:
- Thrift soporta ''excepciones''
- Protocol Buffers tienen mucho mejor documentación / ejemplos
- Thrift tiene un tipo de
Set
incorporado - Los búferes de protocolo permiten "extensiones": puede extender un protocolo externo para agregar campos adicionales, al tiempo que permite que un código externo funcione en los valores. No hay manera de hacer esto en Thrift
- Encuentro Protocol Buffers mucho más fácil de leer
Básicamente, son bastante equivalentes (con Protocol Buffers un poco más eficientes de lo que he leído).
¿Cuáles son los mayores pros y los contras de Apache Thrift contra los Protocol Buffers de Google ?
Como he dicho en el tema "Thrift vs Protocol buffers" :
Refiriéndose a la comparación de Thrift vs Protobuf vs JSON :
- Thrift es compatible con AS3, C ++, C #, D, Delphi, Go, Graphviz, Haxe, Haskell, Java, Javascript, Node.js, OCaml, Smalltalk, Typescript, Perl, PHP, Python, Ruby, ...
- C ++, Python, Java - soporte en caja en Protobuf
- code.google.com/p/protobuf/wiki/ThirdPartyAddOns (por cierto, aquí está el soporte SWI-Prolog ).
- Protobuf tiene mucha mejor documentación y muchos ejemplos.
- Thrift viene con un buen tutorial
- Los objetos de protobuf son más pequeños.
- Protobuf es más rápido cuando muestra "Optimize_for = SPEED"
- Thrift ha integrado la implementación de RPC, mientras que para code.google.com/p/protobuf/wiki/ThirdPartyAddOns (como Zeroc ICE ).
- Protobuf se lanza bajo licencia de estilo BSD
- Thrift se lanza bajo la licencia Apache 2
Además, hay muchas herramientas adicionales interesantes disponibles para esas soluciones, que pueden decidir. Aquí hay ejemplos para Protobuf: Protobuf-wireshark , protobufeditor .
Creo que la mayoría de estos puntos han pasado por alto el hecho básico de que Thrift es un marco RPC, que tiene la capacidad de serializar datos utilizando una variedad de métodos (binarios, XML, etc.)
Los búferes de protocolo están diseñados exclusivamente para la serialización, no es un marco como Thrift.
Hay algunos puntos excelentes aquí y voy a agregar otro en caso de que el camino de alguien se cruce aquí.
Thrift le da la opción de elegir entre thrift-binary y thrift-compact (des) serializador, thrift-binary tendrá un excelente rendimiento pero un tamaño de paquete más grande, mientras que thrift-compact le dará una buena compresión, pero necesita más capacidad de procesamiento. Esto es útil porque siempre puedes cambiar entre estos dos modos tan fácilmente como cambiar una línea de código (diablos, incluso configurarlo). Por lo tanto, si no está seguro de cuánto debe optimizarse su aplicación para el tamaño del paquete o en la potencia de procesamiento, el ahorro puede ser una opción interesante.
PD: vea este excelente proyecto de referencia de thekvs
que compara muchos serializadores incluyendo thrift-binary, thrift-compact y protobuf: https://github.com/thekvs/cpp-serializers
PD: hay otro serializador llamado YAS
que también ofrece esta opción pero no tiene esquema, vea el enlace de arriba.
Otra diferencia importante son los idiomas soportados por defecto.
- Protocol Buffers: Java, Android Java, C ++, Python, Ruby, C #, Go, Objective-C, Node.js
- Thrift: Java, C ++, Python, Ruby, C #, Go, Objective-C, JavaScript, Node.js, Erlang, PHP, Perl, Haskell, Smalltalk, OCaml, Delphi, D, Haxe
Ambos podrían extenderse a otras plataformas, pero estos son los enlaces de idiomas disponibles de manera inmediata.
Por un lado, protobuf no es una implementación RPC completa. Requiere algo como gRPC para ir con él.
gPRC es muy lento en comparación con Thrift:
Protocol Buffers parece tener una representación más compacta, pero eso es solo una impresión que obtengo al leer el libro blanco de Thrift. En sus propias palabras:
Decidimos no realizar algunas optimizaciones de almacenamiento extremas (es decir, empaquetar enteros pequeños en ASCII o utilizar un formato de continuación de 7 bits) por motivos de simplicidad y claridad en el código. Estas alteraciones se pueden hacer fácilmente cuando nos encontramos con un caso de uso crítico para el rendimiento que lo exige.
Además, puede que solo sea mi impresión, pero los búferes de protocolo parecen tener algunas abstracciones más gruesas en cuanto al versionamiento de estructuras. Thrift tiene cierto soporte de versiones, pero requiere un poco de esfuerzo para que esto suceda.
ProtocolBuffers es más rápido.
Hay un buen punto de referencia aquí:
http://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking
También es posible que desee ver Avro, ya que Avro es aún más rápido.
Microsoft tiene un paquete aquí:
http://www.nuget.org/packages/Microsoft.Hadoop.Avro
Por cierto, el más rápido que he visto es Cap''nProto ;
La implementación de AC # se puede encontrar en el repositorio de Github de Marc Gravell .
Pude obtener un mejor rendimiento con un protocolo basado en texto en comparación con protobuff en python. Sin embargo, no hay comprobación de tipos u otras conversiones de lujo, etc. que ofrece protobuff.
Por lo tanto, si todo lo que necesita es serialización / deserialización, entonces probablemente pueda usar otra cosa.
http://dhruvbird.blogspot.com/2010/05/protocol-buffers-vs-http.html
RPC es otra diferencia clave. Thrift genera código para implementar clientes y servidores RPC donde los Buffers de protocolo parecen diseñados principalmente como un formato de intercambio de datos solo.
Una cosa obvia que aún no se ha mencionado es que puede ser tanto un pro como un con (y es el mismo para ambos) es que son protocolos binarios. Esto permite una representación más compacta y posiblemente más rendimiento (pros), pero con una legibilidad reducida (o más bien, debuggability), una estafa.
Además, ambos tienen poco menos soporte para herramientas que los formatos estándar como xml (y quizás incluso json).
(EDIT) Aquí hay una comparación interesante que aborda las diferencias de tamaño y rendimiento, e incluye números para otros formatos (xml, json) también.
Y de acuerdo con la wiki el tiempo de ejecución de Thrift no se ejecuta en Windows.
- Los objetos serializados de Protobuf son aproximadamente un 30% más pequeños que Thrift.
- La mayoría de las acciones que puede hacer con los objetos protobuf (crear, serializar, deserializar) son mucho más lentas que el ahorro a menos que active la
option optimize_for = SPEED
. - Thrift tiene estructuras de datos más ricas (Mapa, Conjunto)
- La API de Protobuf se ve más limpia, aunque las clases generadas están todas empaquetadas como clases internas, lo que no es tan bueno.
- Los enums de Thrift no son enums reales de Java, es decir, son solo ints. Protobuf tiene verdaderas enumeraciones de Java.
Para ver más de cerca las diferencias, echa un vistazo a las diferencias de código fuente en este proyecto de código abierto .