Recientemente encontré MessagePack , un formato de serialización binario alternativo a los Protocol Buffers de Google y JSON que también supera a ambos.
También está el formato de serialización BSON que utiliza MongoDB para almacenar datos.
¿Alguien puede elaborar las diferencias y las desventajas de BSON vs MessagePack ?
Solo para completar la lista de formatos de serialización binaria performantes: también hay Gobs que serán los sucesores de los Buffers de protocolo de Google . Sin embargo, en contraste con todos los otros formatos mencionados, estos no son independientes del lenguaje y dependen de la reflexión incorporada de Go, también hay bibliotecas de Gobs para al menos otro idioma que no sea Go.
Respuestas:
// Tenga en cuenta que soy autor de MessagePack. Esta respuesta puede ser parcial.
Diseño de formatos
Compatibilidad con JSON
A pesar de su nombre, la compatibilidad de BSON con JSON no es tan buena en comparación con MessagePack.
BSON tiene tipos especiales como "ObjectId", "Min key", "UUID" o "MD5" (creo que MongoDB requiere estos tipos). Estos tipos no son compatibles con JSON. Eso significa que parte de la información de tipo puede perderse cuando convierte objetos de BSON a JSON, pero por supuesto solo cuando estos tipos especiales están en la fuente BSON. Puede ser una desventaja usar JSON y BSON en un solo servicio.
MessagePack está diseñado para convertirse de forma transparente de / a JSON.
MessagePack es más pequeño que BSON
El formato de MessagePack es menos detallado que BSON. Como resultado, MessagePack puede serializar objetos más pequeños que BSON.
Por ejemplo, un mapa simple {"a": 1, "b": 2} se serializa en 7 bytes con MessagePack, mientras que BSON usa 19 bytes.
BSON admite la actualización en el lugar
Con BSON, puede modificar parte del objeto almacenado sin volver a serializar todo el objeto. Supongamos que un mapa {"a": 1, "b": 2} se almacena en un archivo y desea actualizar el valor de "a" de 1 a 2000.
Con MessagePack, 1 usa solo 1 byte pero 2000 usa 3 bytes. Por lo tanto, "b" debe moverse hacia atrás en 2 bytes, mientras que "b" no se modifica.
Con BSON, tanto 1 como 2000 usan 5 bytes. Debido a esta verbosidad, no tienes que mover "b".
MessagePack tiene RPC
MessagePack, Protocol Buffers, Thrift y Avro admiten RPC. Pero BSON no lo hace.
Estas diferencias implican que MessagePack está diseñado originalmente para la comunicación de red, mientras que BSON está diseñado para almacenamientos.
Implementación y diseño de API
MessagePack tiene API de verificación de tipos (Java, C ++ y D)
MessagePack admite la escritura estática.
La escritura dinámica utilizada con JSON o BSON es útil para lenguajes dinámicos como Ruby, Python o JavaScript. Pero problemático para los lenguajes estáticos. Debe escribir códigos de verificación de tipo aburridos.
MessagePack proporciona API de verificación de tipo. Convierte objetos de tipo dinámico en objetos de tipo estático. Aquí hay un ejemplo simple (C ++):
MessagePack tiene IDL
Está relacionado con la API de verificación de tipos, MessagePack admite IDL. (la especificación está disponible en: http://wiki.msgpack.org/display/MSGPACK/Design+of+IDL )
Protocol Buffers y Thrift requieren IDL (no soporta tipado dinámico) y proporcionan una implementación IDL más madura.
MessagePack tiene API de transmisión (Ruby, Python, Java, C ++, ...)
MessagePack admite deserializadores de transmisión. Esta característica es útil para la comunicación en red. Aquí hay un ejemplo (Ruby):
fuente
Sé que esta pregunta está un poco anticuada en este momento ... Creo que es muy importante mencionar que depende de cómo se vea su entorno cliente / servidor.
Si está pasando bytes varias veces sin inspección, como con un sistema de cola de mensajes o entradas de registro de transmisión al disco, entonces puede preferir una codificación binaria para enfatizar el tamaño compacto. De lo contrario, es un problema caso por caso con diferentes entornos.
Algunos entornos pueden tener una serialización y deserialización muy rápida hacia / desde msgpack / protobuf's, otros no tanto. En general, cuanto más bajo sea el lenguaje / entorno, mejor funcionará la serialización binaria. En los lenguajes de nivel superior (node.js, .Net, JVM), a menudo verá que la serialización JSON es realmente más rápida. Entonces, la pregunta es si su sobrecarga de red es más o menos limitada que su memoria / CPU.
Con respecto a los búferes msgpack vs bson vs protocolo ... msgpack es el mínimo de bytes del grupo, los búferes de protocolo son casi iguales. BSON define tipos nativos más amplios que los otros dos, y puede ser una mejor coincidencia con su modo de objeto, pero esto lo hace más detallado. Los buffers de protocolo tienen la ventaja de estar diseñados para transmitir ... lo que lo convierte en un formato más natural para un formato de transferencia / almacenamiento binario.
Personalmente, me inclinaría hacia la transparencia que JSON ofrece directamente, a menos que haya una clara necesidad de un tráfico más ligero. Sobre HTTP con datos comprimidos, la diferencia en la sobrecarga de la red es un problema aún menor entre los formatos.
fuente
La prueba rápida muestra que JSON minimizado se deserializa más rápido que MessagePack binario. En las pruebas, Article.json es un JSON minimizado de 550 kb, Article.mpack es una versión MP de 420 kb. Puede ser un problema de implementación, por supuesto.
MessagePack:
JSON
Entonces los tiempos son:
¿Entonces se ahorra espacio, pero más rápido? No.
Versiones probadas:
fuente
simplejson
2.6.2 toma 66.7 segundos ymsgpack
0.2.2 toma solo 28.8.Una diferencia clave aún no mencionada es que BSON contiene información de tamaño en bytes para todo el documento y otros subdocumentos anidados.
Esto tiene dos beneficios principales para entornos restringidos (por ejemplo, integrados) donde el tamaño y el rendimiento son importantes.
fuente
Hice un punto de referencia rápido para comparar la velocidad de codificación y decodificación de MessagePack vs BSON. BSON es más rápido al menos si tiene matrices binarias grandes:
Usando C # Newtonsoft.Json y MessagePack por neuecc:
fuente
Bueno, como dijo el autor, MessagePack está diseñado originalmente para la comunicación en red, mientras que BSON está diseñado para almacenamientos.
MessagePack es compacto, mientras que BSON es detallado. MessagePack está diseñado para ahorrar espacio, mientras que BSON está diseñado para CURD (tiempo eficiente).
Lo más importante, el sistema de tipos de MessagePack (prefijo) sigue la codificación de Huffman, aquí dibujé un árbol Huffman de MessagePack (haga clic en el enlace para ver la imagen):
fuente