Alex Chernyshev @alex0x08
Немного понимаю в компьютерах
Information
- Rating
- 24-th
- Location
- Москва, Москва и Московская обл., Россия
- Registered
- Activity
Specialization
Fullstack Developer, Chief Technology Officer (CTO)
Lead
Java
Java Spring Framework
Java EE
Scala
C++
C
Software development
а вы статью точно прочитали?
Ссылка на википедию после всего описанного? Серьезно?
Вам правда что-ли какие-то там лайки важнее общения по делу?
Если уж в описании самого протокола (цитату из которого я приводил выше) написано, что для запроса и ответа нужно формирование ID - тут никаких споров быть не может.
Вот для примера реализация JSON‑RPC на Java, в этом месте происходит чтение ID запроса, вот тут и ниже по коду он используется для формирования ответа.
Разумеется за все это отвечает фреймворк с реализацией JSON-RPC а не клиентский код, так что "Вручную не надо ничего парсить и хранить айди" действительно не надо - это сделают за вас и в обязательном порядке.
Объясняю: две разных версии DirectX это две разных не связанных между собой сущности - две физически разных и независимых друг от друга библиотеки. Т.е одну версию можно удалить и другая от этого не сломается.
Две версии API вебсервиса это на самом деле одна сущность — одна программа (если так будет понятней), внутри которой на одном из уровней обязательно происходит смешение.
Даже если за разные версии API отвечают физически разные сервисы — данные у них все равно будут общие: общая база, общие сервисы, общее файловое хранилище и тд.
Полное разделение версий одного сервиса вплоть до данных я на практике не видел ни разу.
Так что две версии API это на самом деле две головы одной и той же гидры, только вместо отрастания по-новой (как в сказке), отрубание одной приведет к падению всего сервиса.
Не хочу уподобляться местным обитателям и придираться к точности терминов, но полагаю что под сериализацией/десериализацией XML подразумевалось использование как минимум DOM и какого-то механизма связывания с объектами языка - DTO, POJO и так далее.
Так вот всего этого тут нет, один только потоковый парсер.
"Массивы и массивы структур" были в тестах, но поскольку никаких проблем замечено не было — убрал.
Для C/C++ версий код был сильно объемнее, по очевидным причинам.
Двунаправленный потоковый вызов процедур? Вы фактически превратили атомарную по своей сути систему вызовов во что-то вроде видеострима. Полагаю следующим этапом придется добавлять какой-то контроль целостности данных, повторную отправку, докачку при обрыве и все прочие подобные радости.
Не очень понимаю зачем все это было делать в рамках RPC протокола.
Если возникает большой объем передаваемых данных - существует вполне стандартный механизм для их передачи: через отдельную ссылку на скачивание.
В передаваемом ответе фигурирует лишь ссылка на скачивание, само скачивание клиент осуществляет отдельным запросом вне логики RPC.
Это вообщем-то стандартная практика даже для SOAP и REST.
Опять же не зная задачи могу ошибиться, но есть банальный работающий способ для такого: формируется текстовый файл с такими массивами чисел, который затем сжимается в архив и передается в виде бинарного файла.
Цифры сжимаются очень хорошо, на больших объемах будет существенный выигрыш.
С другой стороны происходит распаковка и чтение.
Если данных много то лучше формировать CSV с построчной разбивкой а не пытаться "сериализовать" все сразу и целиком.
В смысле что такое состояние нестыковки клиентского и сервисного интерфейсов в рамках одной системы (те когда вы контролируете и клиентскую и серверную сторону) должно трактоваться как серьезный системный сбой.
На практике это чаще всего будет означать что кто-то из участников процесса выложил не ту сборку или релиз оказался битым, а значит несовпадение сигнатуры вызова лишь последствия а не причина.
Если кратко любые версии интерфейсов не более чем иллюзия, не дающая никакой защиты от внутренних изменений.
Если длинно то вот моя статья на эту тему.
Скорее всего вы описываете Web Services Discovery — это такая попытка создания «DNS для вебсервисов», с моей точки зрения не очень удачная.
Куда чаще проблема заключается не в устаревании списка методов, а в изменении их сигнатуры без предупреждения.
Разумеется только техническими средствами это не решить, такое считается за ошибку и работа останавливается.
Я вообще не понимаю причем тут сериализация, ее если что нет ни в моей реализации ни в большинстве использованных клиентских библиотек.
Там просто парсер XML-запроса и генерация ответа в виде строки.
И то и другое отлично ограничивается по используемым ресурсам.
Не знаю что у вас за случай, но очень сомневаюсь что причина лишь в одном только протоколе.
Вы бы тогда скорее снижением объема трафика хвастались - размеры передаваемых данных по бинарному протоколу разумеется заметно меньше.
Вот вам несколько выдержек из официальной спецификации на JSON, вдруг решите свой парсер написать.
Про юникод:
Про цифры:
Про совместимость:
Так что JSON сложнее и объемнее чем кажется, причем любая его реализация фактически подразумевает undefined behavior, поскольку стандарт описывает и гарантирует лишь синтаксис.
Что касается упомянутого протокола JSON-RPC, то помимо описанных выше проблем есть еще вот такое:
И ниже про обработку ответа:
Получается что никакая реализация JSON-RPC не может быть stateless, поскольку эти самые id нужно где-то хранить.
Эта на первый взгляд мелочь обязательно всплывет при попытке масштабирования такого сервиса.
Тогда тем более - столь великому мастеру не стоит отвлекаться на пустопорожнюю переписку, пусть занимается делом и пишет еще статьи )
В чем сложность вызова удаленных процедур?
Сейчас расскажу.
Допустим у вас клиент и сервер, с которого вызываются процедуры написаны на разных технологиях, что чаще всего и бывает.
Один умеет работать с Unicode, другой нет.
В этом месте JSON по-хорошему заканчивается, поскольку по стандарту любая клиентская реализация JSON должна поддерживать юникод.
А еще есть различия в типах данных, когда у вас один технологический стек считает что строка это набор символов, а другой что строка это массив байт. Где-то есть отдельный булевый тип, где-то его нет и нужно передавать 1\0. Есть отличия в трактовке дат, меток времени и длинных чисел.
Именно из‑за такого количества сложностей большинство RPC фреймворков объемные и сложные — они скрывают все эти детали под капотом и вы просто не задумываетесь о них при работе.
До судного дня Х, когда они вылезают на поверхность.
Фишка XML-RPC как протокола как раз и заключается в том что он не пытается скрывать всю эту сложность, четко обозначая минимально поддерживаемый набор типов.
Поэтому он до сих пор жив и используется, хотя огромная корпорация пытается его задушить с 1998го года.
Как-то так.
Уважаемый ptr128, в интернете давно существует большая проблема с валидацией публикуемых данных, тем более когда речь заходит о сложных технических вещах.
То что вы «нагуглили» это разумеется замечательно, но это не истина в первой инстанции.
Если вы заметили, половина данной статьи состоит из конкретных примеров реально работающего кода на разных языках — все это я на самом деле собрал и запустил.
По этой причине могу подтвердить что оно действительно работает на момент написания статьи.
Если вы в силах повторить подобное для gRPC — пишите статью, коллеги оценят.
P.S.
Я не выступаю против gRPC, да и против вас лично ничего не имею, просто не хочу скатывания разумной технической дискуссии в очередной бессмысленный срач.
Навскидку:
Lisp, TCL, окружения Linux старше 15 лет, практически все коммерческие Unix, промавтоматика, встраиваемые системы, где как раз имеет смысл миниатюризация всех используемых библиотек. Устаревшие Windows.
Разумеется там будет компилятор, но только устаревший, у которого проблемы компиляции даже не находятся поисковиками.
Ну покажите как ваш gRPC работает на десяти разных ОС, включая сильно устаревшие, из разных диких языков а не только там где есть готовая реализация.
Ладно, подскажу что будет дальше: я продолжу писать интересные статьи и общаться с умными и интересными читателями, а вас и все ваши сообщения буду просто игнорировать.
Жаль что на Хабре еще не приделали бан-листы, но что поделать.
Так что все чего вы добились это игнора, вне зависимости от вашего уровня профессонализма и талантов.
Всего хорошего.
Ну понятно, дискуссии не получится в очередной раз.
Не пробовали оценить свое поведение со стороны? К чему оно приведет и что по-вашему будет дальше?
У собранного бинарника на Go действительно нет внешних зависимостей, поэтому он такой большой. Или вы что-то другое имели ввиду?
Да, ну потому что оно красивое, хотя-бы за счет динамической типизации.
Механизм импортов разумеется используется в нативных библиотеках, которые затем динамически загружаются в Go.
Если что в Go только такая загрузка и есть, что скорее хорошо чем наоборот, поскольку позволяет отлавливать ошибки и вообще как-то реагировать, например показать пользователю сообщение что "Библиотека не найдена".
Что касается "магических констант", то сие не более чем дело лично вашего вкуса, который навязывать окружающим (тем более так настойчиво) является плохим тоном.
Автор был недостаточно идейным видимо.
Если серьезно, то я бы радовался что такое вообще есть в природе — невероятная удача сделать такой эмулятор для машины из 1970х, беклог с описанием шагов и процесса создания автор не выкладывал, но я видел подобное для станции Xerox, так что представляю сколько там было сложной работы.