Статьи

Использование YAML по сети

обзор

Существует ряд популярных текстовых протоколов для обмена данными по сети. К ним относятся XML, FIX и JSON. Chronicle Engine использует YAML, который имеет некоторые преимущества и недостатки.

Разве текст не медленнее двоичного?

Текстовые протоколы медленнее, чем двоичные протоколы. Стоимость кодирования чисел и даже строк в Юникоде увеличивает нагрузку на процессор.

Хотя текст медленнее, у него есть одно важное преимущество перед двоичным, которое заключается в удобочитаемости человеком. Это значительно упрощает описание протокола и реализацию решения для интерфейса без использования инфраструктуры.

Хотя двоичный файл быстрее, чем текст, вы можете обнаружить, что текст достаточно быстрый, и в этом случае вы хотите, чтобы формат с ним был как можно проще для работы.

Ниже перечислены задержки для сериализации и десериализации объекта с 6 полями различных типов. TextWire имеет формат YAML, BinaryWire — это двоичная форма, а RawWire и SBE — другие двоичные форматы.

Для получения более подробной информации см. Chronicle-Wire / microbenchmarks

Время указано в микросекундах:

Формат провода
Б
99,9% плитки
99,99% плитки
99,999% плитки
YAML (TextWire)
91
2,81
4,94
8,62
YAML (TextWire)
91
2,59
4,70
8,58
JSONWire
100
3,11
5,56
10,62
Текстовые поля BinaryWire
70
1,57
3,42
7,14
Числовые поля BinaryWire
44
0,67
2,44
5,93
Поле BinaryWire меньше
32
0,65
2,42
5,53
RawWire UTF-8
43
0,49
2,07
4,87
RawWire 8-битный
43
0,40
0,57
2,90
BytesMarshallable
39
0,17
0,21
2,13
BytesMarshallable + стоп-бит кодирования
28
0,21
0,25
2,40

Обычно в этих высоких процентилях общие библиотеки Java показывают гораздо более высокие результаты, обычно из-за пауз GC. Даже при скромной пропускной способности этот джиттер задержки начинает иметь значение, например, если вы обрабатываете 10000 сообщений в секунду, следующий джиттер задержит 14-15 сообщений, а не только одно.

Формат Размер в байтах 99,99% задержки плитки
Джексон 100 8,3 мкс
BSON + C-байты 96 15,1 мкс
Змея ЯМЛ 88 4,067 мкс
Бун JSON 99 32,5 мкс
Externalizable 197 29,3 мкс

«+ C-байты» означает, когда используется с байтами хроники для перезапуска буфера.

В то время как у Джексона был хороший результат на 99,99%, у 99,999% было 1405 мкс.

Как выглядят эти форматы?

TextWire

Этот формат имеет префикс размера 4 байта, который декодируется в первой строке:

1
2
3
4
5
6
7
--- !!data
price: 1234
flag: true
text: Hello World!
side: Sell
smallInt: 123
longInt: 1234567890

BinaryWire с текстовыми полями

Так выглядят данные при автоматическом переводе в текст.

1
2
3
4
5
6
7
--- !!data #binary
price: 1234
flag: true
text: Hello World!
side: Sell
smallInt: 123
longInt: 1234567890

BinaryWire с числовыми полями

Так выглядят данные при автоматическом переводе в текст.

1
2
3
4
5
6
7
--- !!data #binary
3: 1234
4: true
5: Hello World!
6: Sell
1: 123
2: 1234567890

RawWire без метаданных

1
2
3
00000000 27 00 00 00 00 00 00 00  00 48 93 40 B1 0C 48 65 '······· ·H·@··He
00000010 6C 6C 6F 20 57 6F 72 6C  64 21 04 53 65 6C 6C 7B llo Worl d!·Sell{
00000020 00 00 00 D2 02 96 49 00  00 00 00                ······I· ···

BytesMarshallable со стоп-битовой кодировкой

1
2
00000000 18 00 00 00 A0 A4 69 D2  85 D8 CC 04 7B 59 00 0C ······i· ····{Y··
00000010 48 65 6C 6C 6F 20 57 6F  72 6C 64 21             Hello Wo rld!

Простое двоичное кодирование

1
2
3
00000000 29 00 7B 00 00 00 D2 02  96 49 00 00 00 00 00 00 )·{····· ·I······
00000010 00 00 00 48 93 40 01 0C  48 65 6C 6C 6F 20 57 6F ···H·@·· Hello Wo
00000020 72 6C 64 21 00 00 00 00  01 00 00                rld!···· ···

Человек читаемый

XML и JSON являются производными текстовыми форматами. Это сокращенные формы SGML и Javascript. Это означает, что он может быть прочитан людьми, но не предназначен для этой цели. Как мы увидим, не то, чтобы быть специально разработанным для удобства чтения, имеет некоторые преимущества.

YAML: формат, разработанный для удобства чтения.

Преимущество YAML, как мы видим, заключается в том, что он был специально разработан для удобства чтения. Это означает, что он менее многословен и имеет более богатый набор конструкций.

Основным недостатком является то, что он был разработан для удобочитаемости человеком (а не машиночитаемости). Более богатый набор конструкций означает, что вы можете упорядочить данные по вкусу, хотя написать программу для упорядочения данных со вкусом гораздо сложнее.

Связанный недостаток заключается в том, что различные реализации могут быть несовместимы друг с другом, поскольку существует больше опций для поддержки, некоторые из которых оставлены для интерпретации. Например, символы должны быть помещены в кавычки, если это необходимо, и разные библиотеки имеют разное представление о том, должен ли такой символ заключаться в кавычки. В спецификации есть примеры, когда строки с кавычками в них не заключены в кавычки. Также есть две кавычки, одинарные и двойные.

Так зачем использовать YAML?

Преимущество YAML в том, что он по крайней мере предназначен для чтения людьми. Это не самый быстрый формат, хотя он может быть более чем быстрым и очень читабельным. Если вы сравните это с XML, JSON или FIX, они не рассчитаны на скорость и не особенно удобочитаемы.

Протоколная документация

Использование YAML упрощает документирование того, что необходимо отправить по проводам. У нас есть модульные тесты для различной функциональности, где мы регистрируем то, что отправлено и получено в тексте. Мы добавляем некоторые метаданные вокруг этих сообщений и получаем вывод, который может быть непосредственно включен в нашу документацию . Это означает, что мы уверены, что это правильно.

В качестве текста мы можем указать, когда ожидается, что сообщение будет выглядеть, и определить, когда даже незначительные изменения легко изменили содержимое сообщения. Это так же просто, как проверка соответствия строк. Затем среда IDE может показать многострочное сравнение, чтобы вы могли увидеть точное поле, которое было изменено.

Что мы можем сделать, если YAML будет медленным?

Мы используем высокоуровневый API Chronicle Wire, в котором вы можете выбрать точный формат проводки, как для независимых компаний. Это означает, что мы можем перейти на использование двоичного протокола, как только мы проверим, работает ли текстовый протокол. Мы используем двоичный перевод YAML, но мы также можем использовать формат данных RAW, который удаляет все метаданные для максимальной скорости.

У нас также есть инструменты для автоматического преобразования «двоичного YAML» в YAML для целей регистрации и отладки.

Вывод

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

Ссылка: Использование YAML по сети от нашего партнера по JCG Питера Лоури из блога Vanilla Java .