Kryo est une toute nouvelle et intéressante bibliothèque de sérialisation Java, et l’une des plus rapides du thrift-protobuf . Si vous avez utilisé Kryo, at-il déjà atteint la maturité suffisante pour l’essayer dans le code de production?
Mise à jour (27/10/2010): Nous utilisons Kryo, mais pas encore en production. Voir ma réponse ci-dessous pour plus de détails.
Mise à jour (3/9/2011): La mise à jour des dernières bibliothèques de Jackson et Kryo montre que la sérialisation binaire Smile de Jackson est plutôt compétitive.
Il y a un rapport de bogue et un fil de discussion . Le DateSerializer fourni avec Kryo est légèrement plus efficace en taille que l’implémentation de SimpleSerializer publiée sur SO, car il utilise LongSerializer optimisé pour les valeurs positives.
Edit: j'ai oublié de répondre à la question d'origine. Je crois que le kryo est utilisé dans au moins quelques systèmes de production. Il en est fait mention dans cet article, Nouvelle conception du cache Jive SBS: Partie 3 . Dans le projet Destroy All Humans , Kryo est utilisé pour communiquer avec un téléphone Android servant de cerveau de robot ( video here ).
Pas une réponse directe, mais vous pouvez parcourir les sources Kryo et/ou javadocs . Découvrez les méthodes read * et write * sur la classe Kryo, puis la classe Serializer. C'est vraiment le noyau de la bibliothèque.
Je vais essayer de répondre à ma propre question (Kyro est encore très nouveau!).
Nous avons un ensemble d'environ 120 services Web différents mis en œuvre à l'aide du Restlet Framework . Celles-ci sont utilisées par les clients de services Web généralement construits sur une bibliothèque de clients basée sur Restlet. Les représentations échangées entre le serveur et le client incluent XML (à l’aide de la bibliothèque de sérialisation XStream ), JSON (avec Jackson ), XHTML, Sérialisation des objets Java et depuis hier, Kryo . Nous sommes donc en mesure de faire de solides comparaisons côte à côte.
Kryo 1.0.1 semble raisonnablement stable. Une fois que j’ai lu comment utiliser l’API, le seul problème que j’ai découvert était que le sérialiseur Java.util.Date par défaut semblait déformer les dates quelques mois plus tard. Je devais juste fournir mon propre remplacement:
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()); }
});
Mais c’était le seul problème possible que j’ai trouvé jusqu’à présent. Nous avons un ensemble de JavaBeans qui ont des champs String, Float, Integer, Long, Date, Boolean et List.
Voici quelques repères approximatifs. Tout d'abord, j'ai effectué 100 000 sérialisations et désérialisations d'une hiérarchie d'objets décrivant un programme télévisé (c.-à-d. 100 000 copies complètes de celui-ci). Les vitesses étaient:
XStream XML: 360/sec
Java Object Serialization: 1,570/sec
Jackson JSON: 5,000/sec
Kryo: 8,100/sec
Ensuite, j'ai également sérialisé un catalogue de 2 000 descriptions d'émissions télévisées et d'octets comptés:
XStream XML: 6,837,851 bytes
Jackson JSON: 3,656,654 bytes
Kryo: 1,124,048 bytes
J'ai aussi constaté que l'enregistrement de sérialiseurs était très important:
kryo.register(List.class);
kryo.register(ArrayList.class);
// ...
kryo.register(Program.class);
kryo.register(Catalog.class);
// ...
Si je ne le faisais pas, les sérialisations étaient presque le double de la taille et la vitesse était peut-être 40% plus lente.
Nous avons également effectué des tests complets de bout en bout de plusieurs services Web en utilisant chacune de ces quatre méthodes de sérialisation. Ils ont également montré que Kryo fonctionnait plus rapidement que les autres.
En résumé, le kryo semble raisonnablement robuste. Je vais garder le support pour cela dans notre base de code et au fur et à mesure que nous gagnerons en expérience, j'espère pouvoir l'utiliser dans plus d'endroits. Bravo à l'équipe de Kryo!
Mise à jour (3/9/2011): J'ai enfin compris la suggestion de @ StaxMan d'essayer le sérialiseur binaire "Smile" de Jackson 1.6. En utilisant Jackson 1.6 et Kryo 1.04, j'ai réalisé 100 000 copies complètes (sérialisation/désérialisation) d'une hiérarchie d'objet de programme télévisée quelque peu différente:
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
Ce test ne correspond pas à un test de niveau macro, où j'ai essayé différents sérialiseurs dans un service Web REST fournissant plusieurs de ces objets. Là, le débit global du système prend en charge l'intuition de @ StaxMan concernant les performances:
Jackson JSON: 92 requests/sec
Jackson Smile 97 requests/sec
Kryo: 108 requests/sec
Kryo fait partie du projet S4 (Simple Scalable Streaming System) de Yahoo. S4 n'est pas encore produit pour autant que je sache.
Avec l'aide de Jim Ferrans réponses et commentaires ci-dessus, j'ai trouvé sur cette page une explication plus détaillée du problème de sérialisation des dates avec Kryo: http://groups.google.com/group/kryo-users/browse_thread/ thread/91969c6f48a45bdf/ et aussi comment utiliser DateSerializer () de Kryo:
kryo.register (Date.class, nouveau DateSerializer ());
J'espère que cela pourrait aider les autres.
La dernière version de Kryo présente quelques conditions de concurrence extrêmes, fonctionnant sur une interface de simulateur pour ns-3 à partir de Java. Peut demander au développeur de renvoyer certaines de mes modifications si elles sont sans problème.
Apache Storm l'utilise pour sérialisation avant de transmettre des messages d'une tâche à une autre.
Donc oui, il doit être assez stable puisque Storm est utilisé par plusieurs grandes entreprises , c’est-à-dire Twitter et Spotify.
Le site Kryo contient une section sur des projets en production utilisant Kryo
Kryo 2.x est également utilisé par Mule ESB et est donc largement utilisé en production.
Mise à jour 2017:
Kryo est utilisé par Flink . Donc pratiquement tout ce qui utilise le framework Flink s’appuie sur Kryo . Référence: https://ci.Apache.org/projects/flink/flink-docs-release-0.8 /programming_guide.html#specifying-keys