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

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

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

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

37
задан Jim Ferrans 2 July 2014 в 02:42
поделиться

2 ответа

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

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

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

16
ответ дан 27 November 2019 в 04:53
поделиться

Попробую ответить на свой вопрос (Kyro еще очень новый!).

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

Обновление (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
23
ответ дан 27 November 2019 в 04:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: