Как стать автором
Обновить

Комментарии 43

Если убрать Protobuf и поддержку в веб-сервисах гугла — получатся обычные веб-сервисы. Поэтому перед тем, как использовать очередной нестандартный стандарт в своем проекте, я бы посоветовал вспомнить про WS и SOAP — если, конечно, серверная часть своя.
Можно отказаться от SOAP во пользу JSON-RPC. Меньше ненужного трафика, который есть в XML из-за тегов, ибо тег может быть огромным, а содержаться в нем может одна цифра. А вообще, мне уже давненько не нравится технология/архитектура RPC.
Мы тут с коллегой думали думали и придумали.

Гугл засчет написаного ими же бинарного транспорта для протобаф экономят трафик. Простой пример:

структура из 50 флагов. true это бит в бинарном транспорте, а в сжатом xml это все равно чуть больше потому что это в заголовке архива вся строка а дальше флаги по всему архиву.

учитывая что они посылают очень много таких структур в секунду… экономия трафика очевидна…

а морочиться с бинарным транспортом XML им просто не захотелось ну или они посчитали это костылем.

вот и изобрели свое… (это ж еще и маркетинг: «покупай мою шаверму»)

раньше у них не было самого RPC… и люди пользовались сомнительными решениями в своих протобаф-системах… ну теперь все будет энтерпразненько.
Точно, взяли и придумали протобаф, потому что им было лень «морочиться». Остаётся только вопрос, а что было лень делать фейсбуковцам, когда они придумывали трифт?
И ещё, так, для справки, RPC был с первой версии протобафа ещё…
Меня минусуют хипстеры =)
Докера вам с протобафом и шлюхами.
Я думаю вас минусуют потому, что вы пишете, во-первых, очевидные, а во-вторых, написанные во втором абзаце статьи вещи.
пришел Google и заявил что вот теперь наконец он создал ещё один, последний и самый правильный стандарт RPC

Видимо, то же самое произошло, когда Google не устроил стандарт OpenCL для Android и родился «самый правильный» стандарт RenderScript.
При том что под капотом используется OpenCL, но не выставляется как публичный API
странные SOAP и .NET Remoting
Один я пропустил букву т?
А есть ли возможность использовать другие варианты транспорта?
Меня, честно говоря, тоже сильно напрягает протокол HTTP/2. Да, я знаю, что за ним будущее. Но после поверхностной оценки RFC для него, мне стало не очень ясно, как впихнуть его поддержку во все популярные языки?
Скажем, для базового уровня поддержки HTTP/1.0 нужна лишь базовая поддержка TCP и работа со строками в минимальном варианте. Это позволяет реализовать его хоть в IoT. С другой стороны, множественные потоки, приоритеты и т.п. ввергают меня в пучину ужаса, при мысли о том, как все это впихнуть в 32КБ памяти. А тот-же gRPC в этой области избавил бы от множества проблем…

Поэтому, также прошу знающих людей разъяснить момент с альтернативным транспортом прикладного уровня.
Не так уж много нынче устройств с 32КБ на борту, в основном помощнее. А что касается поддержки в языках — понаписывают библиотек для всех. Да в принципе уже понаписывали. Ну, а то, что теперь телнетом к серверу не приконектишься запросик-другой написать, это да, слишком сложно теперь. Но это уж с любой технологией так — либо просто, либо эффективно.
В low latency мире выбор транспорта — решает многое! В grpc отличная реализация IDL сервисов и структур данных на основе protobuf
Ну, если из gRPC убрать транспорт — останется голый Protobuf, сериализуйте себе данные на здоровья и гоняйте как хотите.
если убрать транспорт остается еще IDL сервисов
Достаточно примитивненький.
И, кстати говоря, IDL сервисов — формально часть Protobuf
Спасибо! Не знал)
А что на счет отладки?
Сделать запрос из telnet?
Кинуть коллеге запрос «Copy-as-curl»?
Посмотреть сниффером что там ходит по сети?
Научным тыком исследовать плохо (не) документированное API?

Отдельным пунктом:
Одно API для браузера (JS) и всего остального?
Отладка чего именно? Гугловского транспорта? А как будто вы сейчас можете отладить, что, скажем внутри браузерного XMLHTTPRequest происходит. Вам приходит строка результата — вы её анализируете. А тут будет приходить сразу структура — отлаживайте себе.
Запрос из телнет — нет, никак. Наверняка будет что-то типа конструктора пакетов.

«Copy-as-curl» — я уверен, что в curl добавят поддержку HTTP/2. Ну или форк будет.
«Посмотреть сниффером что там ходит по сети? » — посмотрите на Wireshark c его системой плагинов — расшифровывает всё, что угодно. И для этого будет плагин.
«Научным тыком исследовать плохо (не) документированное API?» — а с протобафом не может быть «плохо документированного API». Если у вас есть proto-файл, то у вас есть все методы, параметры и ответы. Если у вас его нет — вы ничего не сделаете в любом случае.
«Одно API для браузера (JS) и всего остального?» — с приходом в EcmaScript полноценных классов, бинарных буферов, а в браузеры — HTTP/2, вскоре появится и поддержка gRPC.
А вы думаете, что методы, параметры и ответы — это документация? Нет, это всего лишь интерфейс (даже не контракт). И в вопросах исследования «методом тыка» текстовые протоколы легче бинарных.
Я не очень понимаю что такое «исследование методом тыка». Если это от начала до конца ваша система — вы сами себе проектируете и документируете интерфейсы как хотите. Если вы используете чей-то публичный API — у него будет описание, иначе это не публичный API, а хрень какая-то. Если вы реверсите чужой трафик между компонентами, куда в теории никто не должен вклиниваться — так это никогда не было простым делом и там всегда была нужна какая-то расшифровка, декомпрессия, дизасамблирование клиента или сервера и т.д.
К сожалению, все далеко не так прекрасно. Публичные API оказываются недодокументированными. От своих собственных API, разработанных год назад, документация утеряна, код нечитаем, разбирайся, как хочешь. Два ближайших интегратора не могут понять формализованное описание и просят примеры, которые они могут запустить через SoapUI/curl. Два других интегратора все «понимают», но шлют фигню, единственный способ разобраться с которой — это поймать ее на лету и посмотреть, что же в ней не так.
Надеюсь, вы сообщили об ошибках в документации авторам?
У них своё виденье «ошибок». К примеру, если C++ код собирается под gcc, но не собирается под винду — они это ошибкой не считают. Точно также не являются ошибкой по их мнению отсутствие в пошаговой инструкции пунктов, которые находятся в других документах (которые могут быть даже в других репозиториях) или пункты, которые написаны туманно, но объясняются в темах на форуме.
Мне кажется, что это неплохой аргумент против использования gRPC.
Ну, разобраться в принципе можно, ничего волшебного там нет.
Я про отношение основного поставщика.
Все эти игрушки тупо копируют друг друга вместо того чтобы предлагать киллер-фичи. Что это, что Thrift, что ещё куча rpc не умеют простую вещь — чтобы когда 2 проги соединялись друг с другом можно было дёргать функции и слать сообщения из одной в другую, и неважно, кто из них к кому подцепился — чтобы каждый был и клиентом и сервером. Сейчас такое можно только через гемор с программированием на сокетах иметь, либо AMQP. А вот чтобы both-direction RPC из коробки с сериализацией объектов между экосистемами (C#, Java, ObjC, Javascript, Python, Ruby, C) — есть ли где-то такое вообще?
Да, есть. SOAP over MQ. Или любая другая реализация RPC over MQ.
Киньте ссылкой, пожалуйста, на конкретную реализацию. Потому что тот же Thrift over MQ очень крутая затея, но требующая писать всю имплементацию ручками. Есть что-нибудь уже готовое, чтобы «взял и заюзал»?
У нас своя реализация. Из открытого — вот нашел только что.
gRPC это умеет: «gRPC supports streaming semantics, where either the client or the server (or both) send a stream of messages on a single RPC call. The most general case is Bidirectional Streaming where a single gRPC call establishes a stream where both the client and the server can send a stream of messages to each other. The streamed messages are delivered in the order they were sent.»
Тоже копал в эту сторону. В результате пока сделал обмен через стандартные пайпы ввода-вывода на Java/C++/Pascal Linux/Windows intel/ARM. Но у меня пока синхронный rpc. Делал для простого разделения на процессы, миграции по частям, заворачивания ненадёжных dll в перезапускаемые процессы… Пока в планах стыки на javascript и python. Вообще, дальше в планах добавить к этому shared memory для текущего обрабатываемого пула данных на memory-mapped файлах, чтобы в части случаев не просто сократить передачу данных через пайпы но и вообще избежать её.
Некоторые имплементации JSON-RPC это умеют. А ещё лучше взгляните на WAMP.
вот на WAMP смотреть не надо как раз — из первой версии, идеально простой и понятной, он эволюционировал во вторую — которую мало кто поддерживает и монструозно-непонятную фигню
А чем вторая хуже первой?
И какую альтернативу вы видите?

Требования:
1. Сериализация между C#/.NET, Python, Javascript, PHP, Java, ObjC
2. Двухсторонний RPC между тем, кто подключился, и тем, к кому подключились с киданием засериализованных структур и автоматической десериализацией в нативные структуры.
Сегодня же куча реализаций уже есть: wamp.ws/implementations. Монструозность обусловлена только сложностью задачи, потому что WAMP не взваливает огромное количество смежных подзадач на программиста, а решает их сам. К тому же протокол разбит на две части: basic и advanced.
в том и дело — то по сути, задача тривиальная, и первой версией решалась на ура. Вторая все испортила. И да, качество этих реализаций для разных платформ очень разное. JS библиотек только две, с поддержкой сложно, РНР только одна и то плохо поддерживаемая и без документации
О, вроде похоже на то, что мне надо. Спасибо!
Поясните, пожалуйста, зачем при использование Protobuf использовать HTTP/2 — почему просто не использовать TCP сокет?
А если использовать HTTP/2 зачем Protobuf? Разве я не могу тогда просто все в JSON сериализовать и гонять по HTTP/2 и все будет супер круто сжиматься и прочее…
Можно, чего ж нельзя. gRPC это ведь просто «коробка» вида «HTTP/2 + Protobuf + авторизация + правила именования ресурсов + свои коды ошибок + поддержка сервисами Google». Если последние 3-4 пункта из этого набора Вам побоку — то можно и весь gRPC заменить на HTTP/2 + Json.
У вас получилось собрать это все в VC++ 2015?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий