Знакомство с новым решением MessagePack.

Контур:

  • Что такое JSON
  • Что такое MessagePack
  • Заключение

Что такое JSON?

JSON (объектная нотация JavaScript) - один из наиболее распространенных форматов данных, которые мы используем для хранения и передачи данных. Две особенности JSON:

  • человек читаемый
  • машиночитаемый

Допустим, я хочу сохранить следующие слова в JSON.

Привет, меня зовут Крис. Мне 26 лет. Я люблю читать.

{
    "name": "Chris",
    "age": 26,
    "hobby": "read"
}

Как видите, мы помещаем данные в пары ключ-значение. Ключи здесь - имя, возраст, хобби, каждому ключу соответствует значение. И мы используем {}, чтобы обернуть их, и ,, чтобы разделить каждую пару "ключ-значение".

Привет, меня зовут Крис. Мне 26 лет. Я люблю читать и писать.

{
    "name": "Chris",
    "age": 26,
    "hobby": ["read", "write"]
}

Если ключ соответствует нескольким значениям, мы используем [], чтобы обернуть их.

[
    {
       "name": "Chris",
       "age": 26,
       "height": 183,
       "weight": 80,
       "hobby": ["read", "write"]
    },
    {
       "name": "Glenn",
       "age": 21,
       "height": 169,
       "weight": 87,
       "hobby": ["eat", "sleep"]
    },
    ...
]

Мы все еще сможем четко понять эти данные, если информация станет больше и сложнее. Гленн такой ленивый, правда?

JSON также машиночитаем. Мы можем использовать любой язык программирования, чтобы преобразовать его в Словарь. Как только мы превратим JSON в словарь, мы сможем выполнять с ним всевозможные манипуляции.

JSON ↔ Словарь

(Используйте JSON для хранения или передачи) JSON ↔ Словарь (Язык программирования может выполнять с ним все виды манипуляций. Чтение, вставка, редактирование, удаление…)

В качестве примера воспользуемся приведенным выше JSON:

<?php
$content = file_get_contents('simple.json');
//turn json into dictionary
$content_decode = json_decode($content);
//do all kinds of manipulation
foreach ($content_decode as $person) {
    print_r($person->name."\n");
}
// Chris
// Glenn
//turn dictionary back into json
$content = json_encode($content_decode);
file_put_contents('simple.json', $content);
?>

Что такое MessagePack

Это как JSON. Но быстро и мало.

Это цитата с сайта MessagePack. MessagePack похож на JSON, мы можем превратить MessagePack в словарь и наоборот.

MessagePack ↔ СЛОВАРЬ

(Используйте MessagePack для хранения или передачи) MessagePack ↔ Словарь

По сравнению с JSON. MessagePack меньше, когда мы конвертируем тот же словарь в MessagePack. MessagePack работает быстрее, когда мы конвертируем его в словарь или конвертируем обратно.

Почему MessagePack меньше? В JSON слишком много {}, :, пробелов или повторяющихся строк, которые не нужны машине. MessagePack убрал их и использовал свой уникальный способ упаковки этих данных в меньший размер.

MessagePack, как и JSON, поддерживается и может быть установлен на многих языках, php, python, javascript, swift… список можно продолжить. Позвольте мне показать вам, как это делается в php.

<?php
//dictionary
$data = array(
    'name'=>'chris', 
    'age'=>26,
    'hobby'=>['read', 'write']
);

//dictionary to MessagePack
$msg = msgpack_pack($data);
file_put_contents('msgpack.txt', $msg);
//output:
//ƒ¤name¥chris£age¥hobby’¤read¥write
//MessagePack back to dictionary
$data = msgpack_unpack($msg);
?>

Как видите, вывод не читается (даже не печатается), и это главный компромисс между объемом и скоростью. Особенности MessagePack:

  • h̶u̶m̶a̶n̶-̶r̶e̶a̶d̶a̶b̶l̶e̶
  • машиночитаемый
  • Быстрее
  • меньше

После нескольких тестов я обнаружил, что MessagePack примерно на 10% меньше, чем JSON. В 4 раза быстрее, чем JSON при преобразовании в словарь, в 6 раз быстрее при преобразовании из словаря (Если вам интересно, вы можете проверить мой Github, я использую php).

Заключение

Что мне использовать?

Чтобы ответить на этот вопрос, мы должны подумать с другой стороны:

  1. Читаемость

Действительно ли источник данных вашего проекта должен быть удобочитаемым? Я знаю, что удобочитаемость действительно важна при разработке или отладке. Но большая часть вашего кода имеет дело со словарем, а это означает, что мы можем легко переключиться с использования JSON на MessagePack, когда мы перейдем к этапу производства. Короче говоря, зависит от того, сколько вам нужно прочитать напрямую из источника данных.

2. Скорость кодирования / декодирования

Если вашему приложению очень часто требуется чтение и запись из источника данных, скорость определенно то, что вам нужно. Например, мобильная игра должна сохранять данные каждые полсекунды и передавать данные обратно на сервер. В этом случае мы можем выбрать MessagePack.

3. Хранение

MessagePack на 10% меньше, чем JSON, и эти 10% могут сэкономить вам приличную сумму денег.

4. Передача HTTP / HTTPS.

Когда мы используем HTTP / HTTPS для передачи данных, нам сначала нужно URL-кодировать данные. Например, пробел необходимо закодировать в %20. Хотя сам MessagePack меньше JSON, после кодирования URL он станет больше, чем JSON. Потому что в MessagePack нужно избегать большого количества символов. Некоторая плата за обслуживание зависит от того, сколько данных передается и отправляется, поэтому вам, возможно, придется подумать об использовании MessagePack.

В заключение MessagePack жертвует удобочитаемостью и дает мощное решение. Попробуйте!