2010-04-27 6 views
35

Kryo ist eine sehr neue und interessante Java-Serialisierungsbibliothek und eine der schnellsten im thrift-protobuf Benchmark. Wenn du Kryo benutzt hast, hat es bereits genug Reife erreicht, um es im Produktionscode auszuprobieren?Kryo Serialisierungsbibliothek: Wird es in der Produktion verwendet?

Update (27.10.2010): Wir verwenden Kryo, obwohl noch nicht in Produktion. Siehe meine Antwort unten für Details.

Update (09.03.2011): Die Aktualisierung auf die neuesten Jackson und Kryo-Bibliotheken zeigt, dass Jacksons binäre Smile-Serialisierung ziemlich wettbewerbsfähig ist.

+0

In Bezug auf "Smile/Jackson-Handbuch", wahr, dass es im Stadion mit Kryo Geschwindigkeit ist. Natürlich ist Kryo, binär, kleiner. Der große Unterschied liegt im Serialisierungscode: [smile/jackson-manual] (https://github.com/eishay/jvm-serializers/blob/kannan/tpc/src/serializers/JsonJacksonManual.java) und [Kryo] (https : //github.com/eishay/jvm-serializers/blob/kannan/tpc/src/serializers/Kryo.java#L57).Kryo ist nur ~ 3 Zeilen Code, während Handbuch Jackson viele Seiten enthält. Andere JSON-Benchmarks wie "smile/jackson-databind", die nicht manuell sind, sind auch nur ein paar Zeilen Code, sind aber ~ 2x langsamer. – NateS

+0

NateS - wahr, Vergleiche mit "manueller" Sorte sind nicht ganz Äpfel mit Äpfeln; aber ich denke, dass sie theoretische Grenzen von Formaten in Frage stellen (Kryo-Datenbindung ist mehr optimiert als jackson one, gute Arbeit dort!). Eine Klarstellung: Smile ist auch ein binäres Format; Der Unterschied liegt darin, dass die 1-zu-1-JSON-Serialisierung Feldnamen enthält. – StaxMan

Antwort

16

Es gibt ein bug report ist und ein discussion thread. Der mit Kryo gelieferte DateSerializer ist in Bezug auf die Größe etwas effizienter als die SimpleSerializer-Implementierung, die in SO veröffentlicht wurde, da er LongSerializer verwendet, der für positive Werte optimiert ist.

Edit: Ich habe vergessen, die ursprüngliche Frage zu beantworten. Ich glaube, dass Kryo in mindestens einigen Produktionssystemen verwendet wird. Es gibt eine Erwähnung in diesem Artikel, Jive SBS cache redesign: Part 3. Im Projekt Destroy All Humans wird Kryo verwendet, um mit einem Android-Telefon zu kommunizieren, das als Robotergehirn dient (video here).

Keine direkte Antwort, aber Sie können die Kryo source und/oder javadocs durchsuchen. Sehen Sie sich die read * - und write * -Methoden der Kryo-Klasse an und schauen Sie sich dann die Serializer-Klasse an. Dies ist wirklich der Kern der Bibliothek.

+0

Ich habe die angenommene Antwort auf Sie übertragen. –

+1

+1: Und upvoted. Danke Nate, dass du Kryo gemacht hast, es ist wirklich großartig! –

22

Ich werde versuchen, meine eigene Frage zu beantworten (Kyro ist immer noch sehr neu!).

Wir haben eine Reihe von etwa 120 verschiedenen Web-Services implementiert mit der Restlet framework. Diese werden von Web-Service-Clients verbraucht, die in der Regel auf einer Restlet-basierten Client-Bibliothek basieren. Die zwischen Server und Client hin- und hergesendeten Darstellungen umfassen XML (unter Verwendung der XStream serialization library), JSON (unter Verwendung von Jackson), XHTML, Java Object Serialization und seit gestern Kryo. Wir sind also in der Lage, einige solide Seite-an-Seite-Vergleiche zu machen.

Kryo 1.0.1 scheint einigermaßen stabil. Sobald ich tatsächlich gelesen habe, wie man die API benutzt, war das einzige wirkliche Problem, das ich fand, dass der standardmäßige java.util.Date Serializer Daten ein paar Monate in die Vergangenheit zu verdrehen schien. Ich musste nur meine eigene Überschreibung zur Verfügung stellen:

Aber das war das einzige mögliche Problem, das ich bis jetzt gefunden habe. Wir haben eine Reihe von JavaBeans mit den Feldern String, Float, Integer, Long, Date, Boolean und List.

Hier sind einige grobe Benchmarks. Zuerst habe ich 100.000 Serialisierungen und Deserialisierungen einer Objekthierarchie durchgeführt, die ein TV-Programm beschreibt (dh 100 000 Kopien davon gemacht). Die Geschwindigkeiten waren:

XStream XML:     360/sec 
Java Object Serialization: 1,570/sec 
Jackson JSON:    5,000/sec 
Kryo:      8,100/sec 

Als nächstes ich serialisiert auch einen Katalog von 2000 TV-Programmbeschreibungen und gezählt Bytes:

XStream XML:   6,837,851 bytes 
Jackson JSON:  3,656,654 bytes 
Kryo:    1,124,048 bytes 

Ich fand auch, dass Serializer Registrierung war sehr wichtig:

kryo.register(List.class); 
kryo.register(ArrayList.class); 
// ... 
kryo.register(Program.class); 
kryo.register(Catalog.class); 
// ... 

Wenn ich das nicht machte, waren die Serialisierungen fast doppelt so groß und die Geschwindigkeit war vielleicht 40% langsamer.

Wir haben auch komplette Ende-zu-Ende-Tests von mehreren Web-Services mit jeder dieser vier Serialisierungsmethoden durchgeführt, und sie zeigten auch, dass Kryo schneller lief als die anderen.

Also zusammenfassend scheint Kryo ziemlich robust. Ich werde die Unterstützung dafür in unserer Code-Basis beibehalten und wenn wir Erfahrungen damit sammeln, hoffe ich, dass ich sie an mehr Orten einsetzen kann. Ein großes Lob an das Kryo-Team!

Update (3/9/2011): Endlich kam ich zu @ StaxMan's Vorschlag, Jackson 1.6's binären "Smile" Serializer auszuprobieren. Mit Jackson 1.6 und Kryo 1.04, habe ich 100.000 tiefe Kopien (Serialisierung/deserialiations) eine etwas anderen TV-Sendungen Objekthierarchie:

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 

Dieser Test nicht mit einem Makro-Level-Testnetz hat, wo ich verschiedene Serializer in einem REST Web versuchte Service, der viele dieser Objekte liefert. Dort wird der Gesamtsystemdurchsatz unterstützt @ StaxMan Intuition über die Leistung:

Jackson JSON:  92 requests/sec 
Jackson Smile  97 requests/sec 
Kryo:   108 requests/sec 
+0

Haben Sie einen Fehler bei der Datumsserialisierung festgestellt? Ich habe keine relevanten Probleme in kryo issue tracker gefunden. –

+0

@Petr, ich wollte einen isolierten Testfall erstellen und sicherstellen, dass es sich tatsächlich um einen Kryo-Fehler handelt, obwohl ich noch keine Chance hatte. :-( –

+1

Gute Sachen, danke für das Teilen! Eine Sache, die interessant und relativ einfach zu testen ist, ist zu sehen, wie "Smile" -Format (binäre JSON-kompatible Variante, siehe http://wiki.fasterxml.com/ JacksonBinaryFormat) würde sich sehen lassen, da es (a) mit Jackson gebündelt ist und (b) eine API hat, die mit Jacksons JSON-Handhabung identisch ist.Leistung und Größe sollte es schneller sein als Jackson/JSON, aber wie nah an Kryo es wäre schwer zu sagen - wahrscheinlich auf halbem Weg zwischen JSON und Kryo, vielleicht näher bei Kryo. – StaxMan

3

Kryo ist Teil von Yahoos S4 (Simple Scalable Streaming System) Projekt. S4 ist noch nicht soweit ich weiß.

0

Die neueste Version von Kryo hat ein paar Race-Bedingungen in einigen extremen Fällen, läuft auf einer Simulator-Schnittstelle zu ns-3 von Java. Könnte den Entwickler bitten, einige meiner Änderungen rückgängig zu machen, wenn sie problemfrei sind.

+1

Ja, ich bin mir sicher, dass sie Ihre Korrekturen gerne sehen würden. –

+2

Kryo v2 versucht nicht mehr, threadsicher zu sein. Von Apps wird erwartet, dass sie eine Kryo-Instanz pro Thread verwenden. – NateS

1

Apache Sturm es für serialization verwendet wird, bevor Nachrichten von einer Aufgabe zur anderen vorbei.

Also ja muss es ziemlich stabil sein, da Storm von several huge companies, d. H. Twitter und Spotify verwendet wird.

0

Kryo 2.x wird auch von Mule ESB verwendet und ist daher in der Produktion weit verbreitet.