MessagePack: Когда JSON становится слишком тяжелым

JSON — не лучшее решение, когда надо передать бинарные данные в нем. Обычно приходится их кодировать в Base64, что раздувает JSON и увеличивает нагрузку на сеть, а также увеличивает время парсинга и генерации JSON, что в совокупности создает большие задержки. Я нашел решение этой проблемы — библиотеку MessagePack. На больших структурах данных и при наличии бинарных полей MessagePack эффективнее JSON примерно на 15–20% по объему и в 1.5–2 раза быстрее по скорости парсинга. Реализаций библиотеки существует для 44 языков программирования.

MessagePack — это бинарный формат сериализации данных, аналогичный JSON, но значительно более компактный и быстрый. Процесс включает сериализацию (преобразование объектов приложения в байтовый массив) и десериализацию (обратное преобразование). Система типов Операция оперирует следующими типами: • Integer (Целое число): Диапазон от -2^63 до 2^64-1. • Nil (Нуль): Однобайтовый тип 0xc0. • Boolean (Логическое): true (0xc3) или false (0xc2). • Float (Число с плавающей точкой): IEEE 754 (32-бит или 64-бит). • Raw (Сырые данные): o String: UTF-8 строки (до 2^32−1 байт). o Binary: Произвольные байтовые массивы (до 2^32−1 байт). • Array (Массив): Последовательность объектов. • Map (Карта): Пары «ключ-значение». • Extension (Расширение): Кортеж из целого числа (типа) и байтового массива. o Значения 0–127: Пользовательские типы. o Значения -128 – -1: Зарезервированы для будущих стандартов (например, -1 зарезервирован для Timestamp). Форматы кодирования (Formats) MessagePack использует переменное количество байт для оптимизации размера: 1. Fixint / Fixstr / Fixarray / Fixmap: Предварительно закодированные типы для маленьких значений, занимающие минимум места (1 байт заголовка + данные). 2. Явные заголовки: Для больших значений используются префиксы (0xcc…0xcf для uint/int, 0xd9…0xdb для str, 0xc4…0xc6 для bin), которые указывают размер последующих данных (8, 16 или 32 бита). 3. Ext formats: Аналогично, для расширений есть фиксированные размеры (fixext 1, 2, 4, 8, 16) и динамические (ext 8, 16, 32). Важное правило сериализации: При возможности следует выбирать формат, занимающий минимальное количество байт. Расширение Timestamp (Тип -1) Предназначено для хранения моментов времени (UTC), начиная с эпохи Unix (1970-01-01). Поддерживает три формата: • 32-bit: Только секунды. Диапазон: с 1970 по 2106 год. • 64-bit: Секунды (34 бита) и наносекунды (30 бит). Диапазон: до 2514 года. • 96-bit: 64-битные секунды (signed) и 32-битные наносекунды (unsigned). Огромный диапазон временных меток. Десериализация Десериализатор преобразует байтовые форматы обратно в типовые объекты. Если получено неизвестное расширение, реализация может либо отклонить его, либо сохранить как непрозрачные данные.

Таким образом, я вижу полный переход от JSON в MessagePack по крайней мере там, где не требуется чтение сырых данных людьми. Ведь формат очень универсальный и простой сам по себе.