Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: Racheengel от Сентябрь 17, 2020, 12:14



Название: RPC - обмен данными между распределёнными процессами
Отправлено: Racheengel от Сентябрь 17, 2020, 12:14
Всем привет.

Кто имеет опыт в RPC, чтобы заставить два процесса, (теоретически) работающих на разных машинах (но могут и на одной физически быть запущены), "общаться" между собой?

Сокеты - это понятно, "дедовский метод не подводит". Но может быть есть что-либо более приятное для глаз? :)
Например, gRPC?
Имеет смысл с ним связываться?
Или это ещё один слой метакомпиляции и проблем?


Название: Re: RPC - обмен данными между распределёнными процессами
Отправлено: Авварон от Сентябрь 17, 2020, 12:31
В продакшне опыта нет, но я изучал тему.
gRPC - старая и нажёдная технология, поддерживает различные языки, можно иметь сервер на одном языке, а клиент - на другом. Из недостаков - технология весьма старая и асинхронный код изобилует всякими void* и прочими прелестями из 90х.
flatbuffers+gPRC - всё тоже самое, но как протокол передачи даннных используются flatbuffers, которые ммапятся в память. Языков кроме с++ воде бы нет (питон, к примеру, я не нашел), плюс кгда я проверял, была несовместимость между новой libgprc и flatc - код просто не компилировался. Выглядит как не очень живая и развивающая технология.
Cap'n'proto (https://capnproto.org/cxxrpc.html) RPC. Выглядит наиболее свежо, асинхронный код пишется с футурами, можно асинхронно чейнить коллы (не надо ждать пока колл А завершится чтобы передать его результат в колл Б). Написано тем же челом что изначально писал protobuf, так что чел знает грабли. Есть поддержка разных языков при помощи 3rdparty решений, но они все совместимы, также можно иметь сервер\клиент на разных языках. Выглядит наиболее адкеватно, но количество юзеров на порядки меньше, чем у gRPC.


Название: Re: RPC - обмен данными между распределёнными процессами
Отправлено: Racheengel от Сентябрь 17, 2020, 14:01
Cap'n'proto (https://capnproto.org/cxxrpc.html) RPC. Выглядит наиболее свежо, асинхронный код пишется с футурами, можно асинхронно чейнить коллы (не надо ждать пока колл А завершится чтобы передать его результат в колл Б). Написано тем же челом что изначально писал protobuf, так что чел знает грабли. Есть поддержка разных языков при помощи 3rdparty решений, но они все совместимы, также можно иметь сервер\клиент на разных языках. Выглядит наиболее адкеватно, но количество юзеров на порядки меньше, чем у gRPC.

Ну, судя по саморекламе, оно быстрее, чем gRPC.
Но всё таки метакомпилятор для него нужен... Это минус.
И API ужасен, конечно :( Такое впечатление, что это и не C++ вовсе...

Но спасибо за наводку, посмотрим, как оно себя в проекте поведёт...



Название: Re: RPC - обмен данными между распределёнными процессами
Отправлено: Авварон от Сентябрь 17, 2020, 14:43
По моим глупым замерам он в 2 раза быстрее чем gRPC, но цифры ИМХО слишком маленькиечто для того что для другого - я ожидал примерно на порядок быстрее (судя по цифрам из интернетов которые люди получают на Го или по тому, что говорил Пантер). Хз, где собака порылась.


Название: Re: RPC - обмен данными между распределёнными процессами
Отправлено: Racheengel от Сентябрь 17, 2020, 14:47
Ну, в 2 раза - это уже неплохо. А изначальное время какого порядка было?


Название: Re: RPC - обмен данными между распределёнными процессами
Отправлено: Авварон от Сентябрь 17, 2020, 14:52
Я сейчас не помню, но вроде бы для GRPC 10к синхронных, для capnproto - 20k для синхронных и 50к для асинхронных.
В энторнетах пишут про 90к для grpc, как этого добиться яхз.
Правда я тестил на виртуалке на лэптопе анально огороженном всяким софтом для безопасности, это могло влиять.
Я могу кинуть архив с бенчмарками, погоняете сами.


Название: Re: RPC - обмен данными между распределёнными процессами
Отправлено: Авварон от Сентябрь 17, 2020, 14:57
here we go

возможно будет сложно собрать, grpc на qbs, а capnproto на cmake
client/server - примеры
bench - бенчмарк, запускать при запущенном сервере


Название: Re: RPC - обмен данными между распределёнными процессами
Отправлено: Racheengel от Сентябрь 17, 2020, 18:53
спасибо,попробую :)


Название: Re: RPC - обмен данными между распределёнными процессами
Отправлено: Пантер от Сентябрь 18, 2020, 09:31
gRPC классная штука, используем ее вовсю в Go проектах. В плюсах юзал ее один раз только и не могу сказать, что мне это понравилось. Но тут недостаток плюсов.
Есть еще WebSocket'ы, тоже вполне удобно.
А еще можно их запустить общение через шину обмена соообщениями (NATS, MQTT, etc).
Тут нужно отталкиваться от задачи. Допустим, я для одного из проектов для коммуникации межу сервисом (Go) и GUI(c++/Qt) выбрал WebSocket и это оказалось вполне удобно, но я там не гоняю большое количество информации. Зато отлаживаться удобно было.


Название: Re: RPC - обмен данными между распределёнными процессами
Отправлено: Авварон от Сентябрь 18, 2020, 10:56
NATS кстати тема, юзаем на работе. Только ограничение на размер сообщения разочаровывает=(


Название: Re: RPC - обмен данными между распределёнными пр
Отправлено: Пантер от Сентябрь 18, 2020, 11:06
NATS кстати тема, юзаем на работе. Только ограничение на размер сообщения разочаровывает=(
А что там за ограничение, никогда не сталкивался? Хотя, мы по нему гоняем json'ы в основном. Фильмы гонять да, неудобно будет.


Название: Re: RPC - обмен данными между распределёнными процессами
Отправлено: Igors от Сентябрь 18, 2020, 11:40
[off]Есть же сокеты по рупь двадцать, так нет - хочется "новизны". С жиру бесятся. Какой горячий интерес "что-то поюзать", и как быстро он пропадает когда надо "что-то сделать"[/off]


Название: Re: RPC - обмен данными между распределёнными пр
Отправлено: Авварон от Сентябрь 18, 2020, 11:43
А что там за ограничение, никогда не сталкивался? Хотя, мы по нему гоняем json'ы в основном. Фильмы гонять да, неудобно будет.

То ли 1МБ то ли 10МБ, смешная цифра крч.


Название: Re: RPC - обмен данными между распределёнными процессами
Отправлено: Авварон от Сентябрь 18, 2020, 11:46
[off]Есть же сокеты по рупь двадцать, так нет - хочется "новизны". С жиру бесятся. Какой горячий интерес "что-то поюзать", и как быстро он пропадает когда надо "что-то сделать"[/off]

Если что, CORBA появилась 30 лет назад. Просто она ниощинь оказалась (ну для своего времени норм) вот и появились альтернативы.


Название: Re: RPC - обмен данными между распределёнными процессами
Отправлено: Racheengel от Сентябрь 18, 2020, 12:06
[off]Есть же сокеты по рупь двадцать, так нет - хочется "новизны". С жиру бесятся. Какой горячий интерес "что-то поюзать", и как быстро он пропадает когда надо "что-то сделать"[/off]

Сокеты это да, но boilerplate большой довольно.
Хочется, чтобы мало кода и "изкаропки".


Название: Re: RPC - обмен данными между распределёнными процессами
Отправлено: Авварон от Сентябрь 18, 2020, 12:08
Ну как я уже писал выше, достаточно неплохой бонус - это поддержка разных языков.
Внезапно можно писать тесты на питоне а не на плюсах\джаве\что там у вас основным языком.


Название: Re: RPC - обмен данными между распределёнными процессами
Отправлено: Racheengel от Сентябрь 18, 2020, 13:08
вот это интересным кажется: https://github.com/zeromq/libzmq


Название: Re: RPC - обмен данными между распределёнными процессами
Отправлено: RedDog от Сентябрь 19, 2020, 13:54
вот это интересным кажется: https://github.com/zeromq/libzmq
просто транспорт, а чтобы к Qt прикрутить,  надо попыхтеть, проще тогда Qt сокеты заюзать.


Название: Re: RPC - обмен данными между распределёнными процессами
Отправлено: Old от Сентябрь 19, 2020, 14:28
Что то в Qt уже добавляли под названием Qt Remote Objects.