Библиотека сериализации Kryo: используется ли она в производстве?
Kryo - это очень новая и интересная библиотека сериализации Java и одна из самых быстрых в thrift-protobuf. Если вы использовали Kryo, он уже достиг достаточно зрелости, чтобы попробовать его в производственном коде?
Обновление (10/27/2010): Мы используем Kryo, хотя еще не в производстве. Подробнее см. Мой ответ ниже.
Обновление (3/9/2011): Обновление до последних библиотек Jackson и Kryo показывает, что сериализация Jackson для двоичной Smile довольно конкурентоспособна.
Ответы
Ответ 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());
Я надеюсь, что это может помочь другим.
Ответ 5
На сайте Kryo есть раздел о проектах в производстве с использованием Kryo
Ответ 6
Apache Storm использует его для serialization перед передачей сообщений из одной задачи в другую.
Итак, да, он должен быть довольно стабильным, поскольку Storm используется несколькими огромными компаниями, т.е. Twitter и Spotify.
Ответ 7
Последняя версия Kryo имеет несколько условий гонки в некоторых крайних случаях, работающих на интерфейсе симулятора с ns-3 с Java. Могу попросить разработчика внести некоторые из моих изменений обратно, если они свободны от проблем.
Ответ 8
Kryo 2.x также используется Mule ESB и так широко используется в производстве.
Ответ 9
2017 обновление:
Kryo используется Флинком.
Таким образом, практически все, что использует инфраструктуру Flink, опирается на Kryo.
Ссылка: https://ci.apache.org/projects/flink/flink-docs-release-0.8/programming_guide.html#specifying-keys