Библиотека сериализации Kryo: используется ли она в производстве? - PullRequest
36 голосов
/ 28 апреля 2010

Kryo - это очень новая и интересная библиотека сериализации Java и одна из самых быстрых в тесте thrift-protobuf . Если вы использовали Kryo, то достиг ли он уже достаточной зрелости, чтобы опробовать его в рабочем коде?

Обновление (27.10.2010): Мы используем Kryo, хотя еще не в производстве. Смотрите мой ответ ниже для деталей.

Обновление (09.03.2011): Обновление до последних библиотек Джексона и Крио показывает, что двоичная сериализация Smile Джексона довольно конкурентоспособна.

Ответы [ 9 ]

23 голосов
/ 30 апреля 2010

Я постараюсь ответить на свой вопрос (Киро все еще очень новый!).

У нас есть набор из примерно 120 различных веб-сервисов, реализованных с использованием Restlet Framework . Они используются клиентами веб-служб, обычно построенными на основе клиентской библиотеки Restlet. Представления, отправляемые назад и вперед между сервером и клиентом, включают XML (с использованием библиотеки сериализации XStream ), JSON (с использованием Джексона ), XHTML, Сериализация объектов Java , и по состоянию на вчерашний день Kryo . Таким образом, мы можем провести несколько последовательных сравнений.

Kryo 1.0.1 кажется достаточно стабильным. Как только я действительно прочитал о том, как использовать API, единственной реальной проблемой, которую я обнаружил, было то, что сериализатор java.util.Date по умолчанию, казалось, искажал даты через несколько месяцев в прошлом. Я просто должен был предоставить свое собственное переопределение:

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()); }
  });

Но это была единственная возможная проблема, которую я нашел до сих пор. У нас есть набор JavaBeans с полями String, Float, Integer, Long, Date, Boolean и List.

Вот несколько грубых ориентиров. Во-первых, я выполнил 100 000 сериализаций и десериализаций иерархии объектов, которая описывает одну телевизионную программу (т.е. сделал 100 000 ее глубоких копий). Скорости были:

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

Затем я также сериализовал каталог из 2000 описаний телевизионных программ и подсчитанных байтов:

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

Я также обнаружил, что регистрация сериализаторов была очень важна:

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

Если бы я этого не сделал, сериализация была бы почти вдвое больше, а скорость была, возможно, на 40% медленнее.

Мы также провели полное сквозное тестирование нескольких веб-сервисов, используя каждый из этих четырех методов сериализации, и они также показали, что Kryo работает быстрее, чем другие.

Итак, в общем, Kryo кажется достаточно крепким. Я собираюсь сохранить его поддержку в нашей кодовой базе, и по мере накопления опыта я надеюсь использовать его в других местах. Слава команде Kryo!

Обновление (09.03.2011): Наконец-то я нашел предложение @ StaxMan попробовать двоичный сериализатор "Smile" Джексона 1.6. Используя Jackson 1.6 и Kryo 1.04, я сделал 100 000 глубоких копий (сериализация / десериализация) несколько иной иерархии объектов телепрограмм:

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

Этот тест не совмещался с тестом макроуровня, где я пробовал разные сериализаторы в веб-сервисе REST, который доставляет многие из этих объектов. Там общая пропускная способность системы поддерживает интуицию @ StaxMan о производительности:

Jackson JSON:     92 requests/sec
Jackson Smile     97 requests/sec
Kryo:            108 requests/sec
16 голосов
/ 04 августа 2010

Существует отчет об ошибке и ветка обсуждения . DateSerializer, который поставляется с Kryo, немного более эффективен по размеру, чем реализация SimpleSerializer, опубликованная в SO, поскольку он использует LongSerializer, оптимизированный для положительных значений.

Редактировать: я забыл ответить на оригинальный вопрос. Я считаю, что Kryo используется, по крайней мере, в нескольких производственных системах. В этой статье есть упоминание об этом: Редизайн кеша Jive SBS: Часть 3 . В проекте Destroy All Humans Kryo используется для связи с телефоном Android, который служит мозгом робота ( видео здесь ).

Не прямой ответ, но вы можете просмотреть источник Kryo и / или javadocs . Проверьте методы read * и write * в классе Kryo, затем посмотрите на класс Serializer. Это действительно ядро ​​библиотеки.

4 голосов
/ 23 марта 2011

Kryo является частью проекта Yahoo S4 (Simple Scalable Streaming System). Насколько я знаю, S4 пока не производится.

2 голосов
/ 06 марта 2012

С помощью Джима Ферранса ответов и комментариев, приведенных выше, я нашел более подробное объяснение проблемы выпуска сериализации с Kryo на этой странице: http://groups.google.com/group/kryo-users/browse_thread/thread/91969c6f48a45bdf/ а также как использовать DateSerializer () из Kryo:

kryo.register (Date.class, новый DateSerializer ());

Я надеюсь, что это может помочь другим.

1 голос
/ 21 июня 2014

Apache Storm использует его для сериализации перед передачей сообщений от одной задачи к другой.

Так что да, он должен быть достаточно стабильным, поскольку Storm используется несколькими крупными компаниями , т.е. Twitter и Spotify.

1 голос
/ 02 сентября 2013

На сайте Kryo есть раздел, посвященный проектам, работающим на Kryo

.
1 голос
/ 14 апреля 2011

Последняя версия Kryo имеет несколько условий гонки в некоторых крайних случаях, работающих на интерфейсе симулятора с ns-3 из Java. Могу попросить разработчика вернуть некоторые из моих изменений, если они без проблем.

0 голосов
/ 30 июля 2017

2017 обновление:

Крио используется Флинком. Так что практически все, что использует Flink Framework, зависит от Kryo Справка: https://ci.apache.org/projects/flink/flink-docs-release-0.8/programming_guide.html#specifying-keys

0 голосов
/ 20 февраля 2015

Kryo 2.x также используется Mule ESB и поэтому широко используется в производстве.

...