Подтвердить что ты не робот

Библиотека сериализации Kryo: используется ли она в производстве?

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

Обновление (10/27/2010): Мы используем Kryo, хотя еще не в производстве. Подробнее см. Мой ответ ниже.

Обновление (3/9/2011): Обновление до последних библиотек Jackson и Kryo показывает, что сериализация Jackson для двоичной Smile довольно конкурентоспособна.

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

У нас есть набор из примерно 120 различных веб-сервисов, реализованных с помощью среды создания. Они расходуются клиентами веб-служб, обычно создаваемыми поверх клиентской библиотеки на основе Restlet. Представления, отправленные туда и обратно между сервером и клиентом, включают XML (с помощью библиотека сериализации XStream), JSON (с помощью Jackson), 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

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

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!

Обновление (3/9/2011): Я, наконец, обошел @StaxMan предложение попробовать Jackson 1.6 двоичный сериализатор Smile. Используя 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

Ответ 3

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

Ответ 4

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

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

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

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