Библиотека сериализации Kryo: используется ли она в производстве?
Kryo - очень новая и интересная библиотека сериализации Java и одна из самых быстрых в секонд-protobuf эталоном. Если вы использовали Kryo, он уже достиг достаточной зрелости, чтобы попробовать его в производство код?
обновление (10/27/2010): мы используем Kryo, хотя еще не в производстве. См. мой ответ ниже для деталей.
обновление (3/9/2011): обновление Джексон и библиотек Kryo показывает, что сериализация двоичной улыбки Джексона довольно конкурентоспособна.
9 ответов
есть сообщить об ошибке и обсуждение. DateSerializer, который поставляется с Kryo, немного более эффективен по размеру, чем реализация SimpleSerializer, размещенная на SO, потому что она использует LongSerializer, оптимизированный для положительных значений.
Edit: я забыл ответить на исходный вопрос. Я считаю, что Kryo используется, по крайней мере, в нескольких производственных системах. Есть упоминание об этом в этой статье, редизайн кэша Jive SBS: Часть 3. В Уничтожить Всех Людей проект, Kryo используется для связи с телефоном Android, который служит в качестве мозга робота (видео здесь).
не прямой ответ, но вы можете просмотреть источник Kryo и/или javadocs. Проверьте методы read* и write* в классе Kryo, затем посмотрите на класс сериализатора. Это действительно ядро библиотеки.
я постараюсь ответить на свой вопрос (Kyro все еще очень новый!).
у нас есть набор около 120 различных веб-сервисов, реализованных с помощью основы Restlet. Они поедаются клиентов веб-служб, как правило, построена на вершине Restlet-клиент библиотека. Представления, отправляемые между сервером и клиентом, включают XML (используя библиотека сериализации XStream), JSON (используя Джексон), XHTML,Java Сериализация Объектов, а со вчерашнего дня,Kryo. Таким образом, мы в состоянии сделать некоторые надежные параллельные сравнения.
Kryo 1.0.1 кажется достаточно стабильной. Как только я прочитал о том, как использовать API, единственной реальной проблемой, которую я нашел, была java по умолчанию.утиль.Сериализатор дат, казалось, исказил даты на несколько месяцев в прошлое. Я просто должен был предоставить свое собственное переопределение:
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, которые имеют строковые, Float, целочисленные, длинные, даты, логические и список полей.
вот некоторые приблизительные ориентиры. Во-первых, я сделал 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 кажется достаточно прочным. Я буду поддерживать его в нашей базе кода, и когда мы получим опыт работы с ним, я надеюсь используйте его в других местах. Слава команде крио!
обновление (3/9/2011): я, наконец, добрался до предложения @StaxMan попробовать бинарный сериализатор "улыбка" Джексона 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
Kryo является частью проекта S4 Yahoo (простая масштабируемая потоковая система). S4 еще не производство, насколько я знаю.
с помощью Джим Ferrans ответы и комментарии выше я нашел более подробное объяснение о проблеме сериализации даты с Kryo на этой странице:http://groups.google.com/group/kryo-users/browse_thread/thread/91969c6f48a45bdf/ а также как использовать DateSerializer () Kryo:
kryo.Регистрация(дата.class, new DateSerializer ());
Я надеюсь, что это может помочь другим.
последняя версия Kryo имеет несколько условий гонки в некоторых экстремальных случаях, работает на интерфейсе симулятора для ns-3 С Java. Может попросить разработчика зафиксировать некоторые из моих изменений, если они свободны от проблем.
в Apache Storm использует его для сериализация перед передачей сообщений от одной задачи к другой.
Так что да, он должен быть довольно стабильным, так как Storm используется несколько крупных компаний, т. е. Twitter и Spotify.
обновление 2017:
Kryo используется Flink. Поэтому практически все, что использует Flink framework, полагается на Kryo. Ссылка: https://ci.apache.org/projects/flink/flink-docs-release-0.8/programming_guide.html#specifying-keys