java - serializados - Biblioteca de serialización de Kryo: ¿se usa en producción?
serialización en java (9)
Kryo es una biblioteca de serialización de Java muy nueva e interesante, y una de las más rápidas en el benchmark de thrift-protobuf . Si usó Kryo, ¿ya alcanzó la madurez suficiente para probarlo en el código de producción?
Actualización (27/10/2010): estamos usando Kryo, aunque aún no está en producción. Ver mi respuesta a continuación para más detalles.
Actualización (9/9/2011): la actualización a las últimas bibliotecas de Jackson y Kryo muestra que la serialización binaria Smile de Jackson es bastante competitiva.
Actualización 2017:
Kryo es utilizado por Flink. Así que prácticamente cualquier cosa que esté usando el framework Flink depende de Kryo. Referencia: https://ci.apache.org/projects/flink/flink-docs-release-0.8/programming_guide.html#specifying-keys
Apache Storm lo usa para la serialization antes de pasar mensajes de una tarea a otra.
Entonces, sí, debe ser bastante estable, ya que Storm es utilizado por varias grandes empresas , es decir, Twitter y Spotify.
Con la ayuda de las respuestas y los comentarios anteriores de Jim Ferrans , encontré una explicación más detallada sobre la cuestión de la serialización de fechas con Kryo en esta página: http://groups.google.com/group/kryo-users/browse_thread/thread/91969c6f48a45bdf/ y también un cómo usar DateSerializer () de Kryo:
kryo.register (Date.class, new DateSerializer ());
Espero que esto pueda ayudar a otros.
El sitio de Kryo tiene una sección de proyectos en producción usando Kryo
Hay un informe de error y un hilo de discusión . El DateSerializer que viene con Kryo es ligeramente más eficiente en cuanto a tamaño que la implementación de SimpleSerializer publicada en SO porque usa LongSerializer optimizado para valores positivos.
Editar: Olvidé responder la pregunta original. Creo que Kryo se usa en al menos algunos sistemas de producción. Se menciona en este artículo, Jive SBS cache rediseño: Parte 3 . En el proyecto Destruir todos los seres humanos , Kryo se usa para comunicarse con un teléfono Android que funciona como cerebro de robot ( video aquí ).
No es una respuesta directa, pero puede navegar por la fuente Kryo y / o javadocs . Revisa los métodos de lectura * y escritura * en la clase Kryo, luego mira la clase Serializer. Este es realmente el núcleo de la biblioteca.
Intentaré responder a mi propia pregunta (¡Kyro todavía es muy nuevo!).
Tenemos un conjunto de aproximadamente 120 servicios web diferentes implementados utilizando el marco Restlet . Estos son consumidos por clientes de servicios web generalmente construidos sobre una biblioteca cliente basada en Restlet. Las representaciones enviadas entre el servidor y el cliente incluyen XML (usando la biblioteca de serialización XStream ), JSON (usando Jackson ), XHTML, serialización de objetos Java y, a partir de ayer, Kryo . Así que estamos en condiciones de hacer algunas comparaciones sólidas lado a lado.
Kryo 1.0.1 parece razonablemente estable. Una vez que realmente leí acerca de cómo usar la API, el único problema real que encontré fue que el serializador java.util.Date predeterminado parecía deformar las fechas hace unos meses. Solo tuve que proporcionar mi propia anulación:
kryo.register(Date.class,
new SimpleSerializer<Date>() {
@Override public void write (ByteBuffer b, Date d) { b.putLong(d.getTime()); }
@Override public Date read (ByteBuffer b) { return new Date(b.getLong()); }
});
Pero ese fue el único problema posible que he encontrado hasta ahora. Tenemos un conjunto de JavaBeans que tienen campos String, Float, Integer, Long, Date, Boolean y List.
Aquí hay algunos puntos de referencia aproximados. Primero, hice 100.000 serializaciones y deserializaciones de una jerarquía de objetos que describe un programa de TV (es decir, hizo 100.000 copias en profundidad). Las velocidades fueron:
XStream XML: 360/sec
Java Object Serialization: 1,570/sec
Jackson JSON: 5,000/sec
Kryo: 8,100/sec
A continuación, también serialé un catálogo de 2.000 descripciones de programas de TV y bytes contados:
XStream XML: 6,837,851 bytes
Jackson JSON: 3,656,654 bytes
Kryo: 1,124,048 bytes
También encontré que el registro de serializadores era muy importante:
kryo.register(List.class);
kryo.register(ArrayList.class);
// ...
kryo.register(Program.class);
kryo.register(Catalog.class);
// ...
Si no lo hice, las serializaciones fueron casi el doble del tamaño, y la velocidad fue quizás un 40% más lenta.
También realizamos pruebas completas de varios servicios web utilizando cada uno de estos cuatro métodos de serialización, y también mostraron que Kryo corría más rápido que los demás.
Entonces, en resumen, Kryo parece razonablemente robusto. Voy a mantener el soporte en nuestra base de código y, a medida que ganemos experiencia, espero usarlo en más lugares. Felicitaciones al equipo de Kryo!
Actualización (9/9/2011): finalmente logré la sugerencia de @ StaxMan de probar el serializador binario "Smile" de Jackson 1.6. Usando Jackson 1.6 y Kryo 1.04, hice 100.000 copias en profundidad (serialización / deserialización) de una jerarquía de objetos de programa de TV algo diferente:
XStream XML: 429/sec 5,189 bytes
Jackson JSON: 4,474/sec 2,657 bytes
Kryo: 4,539/sec 1,066 bytes
Jackson Smile: 5,040/sec 1,689 bytes
Esta prueba no combinó con una prueba de nivel macro, donde probé diferentes serializadores en un servicio web REST que entrega muchos de estos objetos. Allí, el rendimiento global del sistema es compatible con la intuición de @ StaxMan sobre el rendimiento:
Jackson JSON: 92 requests/sec
Jackson Smile 97 requests/sec
Kryo: 108 requests/sec
Kryo 2.x también es utilizado por Mule ESB, y es ampliamente utilizado en producción.
Kryo es parte del proyecto S4 (Simple Scalable Streaming System) de Yahoo. S4 aún no es producción, hasta donde yo sé.
La última versión de Kryo tiene algunas condiciones de carrera en algunos casos extremos, que se ejecuta en una interfaz de simulador para ns-3 de Java. Podría pedirle al desarrollador que confirme algunos de mis cambios si no tienen problemas.