Разработчики часто находятся между Сциллой и Харибдой: «не улучшай то, что работает» и «можно ли сделать лучше то, что и так работает отлично?». Применительно к облачной архитектуре пространство для манёвра сужается: каждое изменение может повлиять на бизнес тысяч клиентов.
Сегодня наша тема — повод задуматься и подискутировать. Мы затронем аспект облака, о котором обычно не говорят — JSON. Объекты JSON используют для разных задач. В основном это обмен данными между серверами и веб-приложениями. Формат также применяют для управления облачной инфраструктурой, интеграции с кастомными скриптами и сервисами. Есть и экзотические кейсы вроде хранения в файлах JSON записей базы данных.
Однако некоторые специалисты отмечают большое количество «синтаксического мусора», другие — ограниченную поддержку инструментов разработки. Поэтому появляются альтернативы, о которых мы и поговорим в сегодняшнем материале.
Как обеспечить масштабируемость облака
По оценкам аналитического ресурса builtwith.com, JSON используют более 180 000 сайтов. Они принадлежат не только крупным телекомам, игровым платформам и ретейлерам, но и локальным тематическим площадкам.
В то же время с JSON работают облачные провайдеры — например, задействуют его для поддержания связи между клиентскими приложениями и сервером.
Виртуальная инфраструктура может автоматизировать масштабирование сервисов через запросы API, например, с помощью Terraform. Таким образом, можно быстрее предоставлять ИТ-ресурсы с учетом пиковых периодов спроса и обеспечивать сотрудникам (или клиентам) доступ из любой точки мира.
Широкий спектр применимости ведет и к более активной критике формата со стороны специалистов. Часть неудобств связана с синтаксисом — например, всего одна лишняя запятая приводит к сбою в JSON-файле.
Нюансы JSON формата
Головную боль у разработчиков вызывают и мелкие нюансы в вопросах функциональности. Так, формат не поддерживает комментарии, его спецификация излишне строгая, а сам он плохо подходит для работы с числами в шестнадцатеричном представлении.
Для решения этих и других проблем существуют различные инструменты, в том числе открытые. Например, библиотека RapidJSON упрощает парсинг данных, а процессор jq их структуризацию.
С другой стороны, консольная утилита dasel позволяет редактировать данные в разных форматах (JSON, TOML, YAML, XML и CSV) и поддерживает их конвертацию.
Но один разработчик решил пересмотреть подход и представил альтернативу JSON — язык UCL. В теории он должен исправить некоторые проблемы «классического» формата обмена данными.
Что предлагает UCL
Его задача — сделать работу с файлами конфигураций JSON более удобной. Чтобы достигнуть этой цели, автор внес множество синтаксических изменений. Например, в UCL не нужны фигурные скобки для описания верхних объектов — можно прописать «key»: «value» вместо {«key»: «value»}.
Также необязательно использовать двойные кавычки для строк и ключей, а вместо двоеточия при их декларации ставится равно:
key = value;
section {
key = value;
}
По сути, запись выше равнозначна следующей конструкции:
{
"key": "value",
"section": {
"key": "value"
}
}
По умолчанию классический JSON поддерживает только значения в десятичной системе счисления. В UCL добавили шестнадцатеричные целые (префикс 0x), а также булевы переменные — true, yes, on и соответствующие им false, no, off. В то же время UCL поддерживает автоматическое создание массивов и комментирование — знак # для одной строки и конструкцию /*… */ для нескольких. Так, можно быстро активировать и отключать части кода.
В язык встроен макрос include для загрузки контента из других файлов в UCL-объект. В качестве атрибута макрос принимает или путь к директории, или URL:
.include "./relative/path.conf"
.include "http://example.com/file.conf"
UCL позволяет проводить валидацию объектов по схеме JSON-schema v4. Однако не поддерживает remote references. Если говорить о производительности, то автор утверждает, что UCL примерно в два раза быстрее jansson на задачах парсинга.
Что думает сообщество
В свое время проект UCL привлек внимание резидентов Hacker News. Многие встретили разработку с теплотой и положительно оценили работу с элементами так называемого «синтаксического сахара». И вокруг инструмента уже сформировалось сообщество энтузиастов — его репозиторий собрал больше 1,5 тыс. звезд.
Однако нашлись и те, кто встретил разработку с долей скептицизма, указав на ряд ограничений. Например, в формат XML инструмент переводит только собственные файлы конфигурации. Среди проблем UCL также отметили отсутствие подробной документации.
Возможно, что простой переделки кавычек и скобочек недостаточно, чтобы переманить аудиторию. Проблемы с файлами конфигураций редко связаны с синтаксическими особенностями. Чаще всего их вызывают проверки на соответствие схеме — опечатки в названии или дубли ключей. Чтобы у библиотеки было будущее, она должна решить именно эту проблему.
Если вы хотите поближе познакомиться с UCL и самостоятельно оценить его сильные и слабые стороны, то репозиторий на GitHub будет неплохой точкой для старта. В целом библиотеку можно использовать как в собственных, так и коммерческих проектах, так как она распространяется по лицензии BSD 2-Clause.
Какие есть альтернативы: HOCON и Augeas
Разумеется, UCL не единственный формат, предлагающий альтернативу и упрощающий работу с JSON. Примером может быть инструмент HOCON. Он похож на UCL, но поддерживает работу с API от Java и C#. Ориентирован на борьбу с дублированием данных и использует собственные функции «слияния» для объединения объектов или файлов, а также «подстановки» — для ссылок на другие части конфигурации или переменные среды.
Другой пример — утилита Augeas. Это — C-библиотека, которая парсит конфигурационные файлы и представляет их содержимое в виде древовидной структуры. Утилита помогает разработчикам автоматизировать взаимодействие с разными конфигурационными файлами и решает проблему несогласованности. Впрочем, инструмент официально поддерживает далеко не все виды конфигураций.
А какие альтернативы и аналоги JSON знаете вы?
Больше о возможностях масштабирования инфраструктуры:
- Virtual Infrastructure для разработчиков и сисадминов: обзор сервиса #CloudMTS
- Джентльменский набор IaaS: считаем преимущества, составляем план, используем бонусы для запуска ИТ-инфраструктуры
- Как вырасти с двух десятков до 700+ виртуальных машин в облаке и научиться выдерживать мощные нагрузки: опыт BelkaCar
Комментарии (15)
kotan-11
00.00.0000 00:00Текстовый формат, как JSON или UCL, но:
гораздо меньше синтаксического мусора
не мапы ключ-значение, а объекты с типами, именами и полями
не только деревья, но произвольные стркутуры данных с перекрестными сылками между объектами
можно включать бинарные данные
импорты/экспорты позволяют объединять контент нескольких файлов в один DOM
поддержка C/C++ (DOM/StAX) / Java (DOM/StAX/Сериализация) / JS (Сериализация).
Akina
00.00.0000 00:00+3Что предлагает UCL
Прочитал тут. Поискал, почитал в Инете. Но так и не понял, как различать "булевы переменные — true, yes, on и соответствующие им false, no, off" и аналогичные по написанию, но строковые по типу данных значения. То же самое и относительно шестнадцатеричных целых и соответствующего строкового значения. А ведь тип значения может быть важным, и даже определяющим...
В теории он должен исправить некоторые проблемы «классического» формата обмена данными.
Если на предыдущий вопрос не найдётся вменяемого ответа, то, как по мне, исправление в общем не сильно критичных проблем ТАКОЙ ценой - не оправдано.
roqin
00.00.0000 00:00Предполагаю, что как-то так:
booleanVariable = true; stringVariable = "true";
It is still possible to treat numbers and booleans as strings by enclosing them in double quotes.
https://github.com/vstakhov/libucl#convenient-numbers-and-booleans
Но не знаю как это сделали.
Akina
00.00.0000 00:00+1Можно - не значит обязательно. То есть потенция неоднозначности имеется, и в рамках допустимого синтаксиса она неразрешима. Что ставит всю разработку под сомнение. Поступил тебе сторонний документ, в нём имеется no - и попробуй угадай, это такое значение или это маркер его отсутствия...
А NULL и/или его аналоги-алиасы я там вообще не нашёл.
Stingray42
00.00.0000 00:00+715_конкурирующих_стандартов.jpg
krulod
00.00.0000 00:00Ой-вей, вы не туда ответили! Заголовок статьи намекает, что авторы хотят найти 16й стандарт.
gpaw
00.00.0000 00:00статья довольно невнятная, если не вредная. какое предназначение у этого синтаксического сахара? удобство/читаемость? тогда почему в этом контексте упомянут обмен данными между серверами, где это вредно (вот тут можно рассказать про msgpack).
AVX
00.00.0000 00:00Где-то была уже статья про JSON/YAML/... Там предлагали использовать JSON5 - я почитал, и мне в целом понравилось. Почему-то тут его не упомянули.
zartdinov
00.00.0000 00:00Мне больше нравится JSON Lines для потоковой обработки.
https://jsonlines.org/
SWATOPLUS
00.00.0000 00:00-1Конфигурация должна быть кодом на Typescript, который json. И все становится хорошо. Вместо ts, можно использовать любой другой статически типизируемый язык. Ныть про то, что нужно таскать с собой node-runtime не нужно, пару сотен мегабайт, это не много. Зато написание конфигурации превращается в кайф.
Levitanus
https://msgpack.org/
frozendog
https://github.com/FasterXML/smile-format-specification
shai_hulud
Вроде обсуждение идёт про форматы конфигурации. Их пишут руками. Это бинарный формат.
Levitanus
Для человеко-читаемого формата мне очень понравился toml. Но, Я всё-таки, понял, что речь идёт больше про API. И про накладные расходы на лишний синтаксис. В этом отношении msgpack лучше.
И в целом, читаемый. Я вот более-менее бегло могу читать формат миди-файлов, хотя он тоже вполне так себе бинарный, да ещё и последовательный.
P.S. но вообще JSON хорош тем, что он простой как палка, и даже если ты никогда не видел JSON - ты всё равно его понимаешь.
Для того, чтобы читать а тем более, писать XML, cml, yaml, toml - надо хоть немного разобраться. А лучше иметь под рукой шпаргалку