В эпоху распределённых архитектур и микросервисов как никогда актуальными становятся вопросы — как эффективно сериализовать и передать данные. Большинство решает данный вопрос просто — используют стандартный, универсальный и всем понятный формат JSON. Другие же, ориентируясь на производительность, ищут в интернете бенчмарки и выбирают protobuf или msgpack.
Мы протестировали разные реализации статически (thrift, protocol buffers) и динамически (json, msgpack) типизированных протоколов для python; сравнили их производительность в разных сценариях, возможности, внутреннее устройство, удобство разработки.
Я расскажу о результатах нашего исследования, особенностях "приготовления" библиотек и выявленных подводных камнях.
29. Protobuf
✔ Старое проверенное решение
✔ Разработан Google
✔ Хорошие результаты в тестах в интернете
✔ Хорошая документация
30. Protobuf
✔ Старое проверенное решение
✔ Разработан Google
✔ Хорошие результаты в тестах в интернете
✔ Хорошая документация
✗ Не всё можно описать
– Список списков, map
32. Thrift
● Более новый формат
● Разработал Facebook, отдал в Apache
● Документация — справочник типов и BNF
● Есть “Thrift: The Missing Guide”
● RPC-клиент/сервер
46. Методика бенчмарка
Характерные объекты — строки, байты, словари разных
размеров, массивы
Замер времени на сериализацию и десериализацию каждой
библиотекой в python2 и python3
Сравнение данных до и после
Железо:
Intel(R) Xeon(R) CPU E5-2683 v4 @ 2.10GHz
64 Gb RAM
47. Без схемы
Поддержка Установка Реализация Генерация кода
uJSON 2, 3 pip C-ext ✗
BSON 2, 3 pip Python ✗
Msgpack 2, 3 pip C-ext ✗
48. Без схемы — затраченное время
msgpack
ujson
json
bson
encode py2.7
decode py2.7
encode py3.5
decode py3.5
49. Protobuf
Поддержка Установка Реализация Генерация кода
protobuf 2, 2to3 make + pip Python
✓
cprotobuf 3 protobuf + pip C-ext
✓
protobuf3 3 protobuf + pip Python
✓
65. Топ — затраченное время
pyavroc*
msgpack
cprotobuf*
thriftrw
ujson
fastavro
thriftpy+cython*
Py2.7 Py3.5
66. Общие рекомендации
● Следить за новыми разработками
● Рассматривать альтернативы
● Референсная библиотека — не всегда самая лучшая
● Альтернативные — бывают ещё хуже
● Не верить бенчмаркам в интернете (В том числе
этому)
● Кодогенерация только мешает