...

воскресенье, 22 февраля 2015 г.

MessagePack аналог JSON, но быстрее и меньше

MessagePack это эффективный сериализатор данных в бинарное представление.


Используя данную библиотеку вы можете обмениваться сообщениями между вашими компонентами системы подобно тому, как вы это делаете с помощью формата JSON. Интерпретация библиотеки существует для 44 языков программирования (!)



Несколько простых наглядных примеров на PHP:



php -r 'echo strlen(json_encode(array("Hello World!")));' // 16
php -r 'echo strlen(msgpack_pack(array("Hello World!")));' // 14



php -r 'echo strlen(msgpack_pack(array("Hello World!", "Hello World!")));' // 27
php -r 'echo strlen(json_encode(array("Hello World!", "Hellow World!")));' // 32



php -r 'echo strlen(json_encode(array("Hello World!" => "Hello World!")));' // 31
php -r 'echo strlen(msgpack_pack(array("Hello World!" => "Hello World!")));' // 27




На данных синтетических примерах видно, что MessagePack упаковывает данные на 15-20% эффективнее чем JSON. В нагруженном проекте обмен сообщениями между компонентами системы насчитывает 100 тысяч в день и более. Экономя 15-20% трафика вы сможете обслуживать больше сообщений на одной ноде за тот же период времени.

Библиотека полностью совместима с JSON, но все же стоит знать некоторые ограничения:



  • Значение Integer ограничено от -(2^63) до (2^64)-1;

  • Значение Float представлено стандартом IEEE 754 с одинарной или двойной точностью;

  • Максимальная длина бинарного объекта (2^32)-1;

  • Максимальный размер байт строки (2^32)-1;

  • Строка может содержать недопустимую последовательность байтов. В этой ситуации поведение десериализатора зависит от фактической реализации, когда он получит недопустимую последовательность байтов.

    Из этого следует, что в каждом из языков будет свое поведение. Например, в случае, если вы распаковываете данные на PHP будет автоматически сгенерировано:

    Warning: [msgpack] (php_msgpack_unserialize) %s %d в ваш STDERR


    Но его можно отключить используя php.ini через флаг msgpack.error_display=0 (по умолчанию 1);



  • Максимальное количество элементов в массиве может быть не больше чем (2^32)-1;

  • Максимальное количество элементов в ассоциативном массиве (ключ=>значение) может быть не больше чем (2^32)-1;




Подробно со спецификацией упаковки данных вы можете ознакомится по адресу http://ift.tt/1CY92Ol

Установка и настройка библиотеки весьма тривиальна и разработчики заботятся о том, чтобы не создавать трудности на этом этапе. Так в случае использования PHP все сводится к знакомой конструкции:



pecl install msgpack

Пример, для Python:

pip install u-msgpack-python //либо easy_install u-msgpack-python

Для Ruby:

gem install msgpack



Возраст библиотеки уже более 3 лет.

Последняя актуальная версии расширения для PHP на текущий момент — 0.5.5.

В ней было замечено, что кроме стандартных функций msgpack_pack и msgpack_unpack (которые являются алиасами к msgpack_serialize и msgpack_unserialize) есть ещё два undocument класса MessagePack и MessagePackUnpacker. Они имеют следующие интерфейсы:


MessagePack



MessagePack::__construct(boolean $opt = null); // $opt - управление поведением флага php.ini msgpack.php_only внутри класса
MessagePack::setOption(integer $option, boolean $value); // поддерживает только опцию MSGPACK_CLASS_OPT_PHPONLY
MessagePack::pack(mixed $value); // упаковывает данные и возвращает строку
MessagePack::unpack(string $str, $object = null); // распаковывает строку. Вторым параметром можно передать строку, объект, массив, который следует заполнить распакованными данными и вернуть в результате выполнения функции.
MessagePack::unpacker(); // возвращает объект класса MessagePackUnpacker. Обратите внимание, что в текущей реализации библиотеки при каждом обращении создается новый экземпляр класса.




MessagePackUnpacker

MessagePackUnpacker::__construct(boolean $opt = null); // $opt - управление поведением флага php.ini msgpack.php_only внутри класса
MessagePackUnpacker::__destruct();
MessagePackUnpacker::setOption(integer $option, boolean $value); // поддерживает только опцию MSGPACK_CLASS_OPT_PHPONLY
MessagePackUnpacker::feed(string $str); // Добавляет указанную строку к общему буферу. Возвращает true либо false.
MessagePackUnpacker::execute(string $str = null, integer &$offset = null); // Распаковывает данные. Возвращает true либо false.
MessagePackUnpacker::data(mixed $object = null); // В случае, если данные не были распакованы через метод execute возвращает false. В случае, если данные были распакованы и не был передан параметр $object - возвращает распакованную строку и вызывает метод reset. В случае, если данные были распакованы и был передан параметр $object работает по принципу MessagePack::unpack и вызывает метод reset.
MessagePackUnpacker::reset(); // очищает текущий буфер;




Официальный сайт разработчиков msgpack.org/

P.S.: к разработчикам библиотеки не отношусь. Использую её в работе 4 месяца.

This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Комментариев нет:

Отправить комментарий