LINUX.ORG.RU

ищется протокол удалённого вызова процедур

 


0

2

Клиент - C++, Сервер - программа на языке со сборкой мусора. Вызов только локальный. Нужно уметь описывать интерфейсы, хранить ссылки на удалённые объекты, генерировать обёртки и всё вот это вот.

Основное требование - это простота реализации и независимость от библиотек, т.к. придётся портировать на новый язык, в котором ничего нет (даже json).

Поэтому ищется какая-то компактная многоязычная библиотечка.

Второе требование - пермиссивная лицензия.

В текущем самодельном прототипе используются сокеты. Вроде этого пока должно быть достаточно.

Посмотрел:

  • SOAP - на базе XML = тормоза.
  • Protobuf - формат можно рассмотреть, хотя у меня нет цели слишком сжимать данные, а они там похоже на это запарились.
  • grpc - оказывается, там какое-то http/2, заточенное под оптимизацию веба. Мне это абсолютно не нужно
  • erpc - только Си
  • CORBA - вроде громоздкая?

Фавориты:

★★★★★

Последнее исправление: den73 (всего исправлений: 4)
Ответ на: комментарий от anonymous

Ну по идее-то ссылки на удалённые объекты - это всего лишь таблица этих ссылок и инвалидация при отпадении сервера. Вроде не кажется сложным, причём я такое уже делал, правда для FFI, а не для RPC. Не было сложным. Но может быть я чего-то недопонял.

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

ссылки - это … таблица этих ссылок

Рекурсивное определение детектед

я такое уже делал

Для зоопарка языков, с и без автоматического сборщика мусора? И или конкретный костыль для конкретных языков?

anonymous
()
Ответ на: комментарий от den73

У меня простой RPC, без проброса исключений с сервера и описания сигнатур функции, в последний раз занял где то пару часов (клиент на питоне, сервер на плюсах). С отладкой, с нуля - это при том что я не считаю себя программистом. Правда я такую штуку не в первый раз делал и точно знал что и как, сам протокол у меня давно был готов на основе питоньего модуля struct.

Мне кажется тут дольше с готовой библиотекой разбираться будешь.

AntonI ★★★★★
()
Ответ на: комментарий от anonymous

Конкретный, но не надо путать мои скромные возможности и всемирно известные open-source проекты.

den73 ★★★★★
() автор топика
Ответ на: комментарий от AntonI

И реализация удаленных ссылок будет выглядеть как костыль над (целочисленными) handle’ами, с явным или неявным созданием и удалением (из таблицы по целочисленными индексам).

anonymous
()
Ответ на: комментарий от AntonI

Намек понял int err = close(f); if (err != 0) goto panic

anonymous
()
Ответ на: комментарий от den73

Я не очень знаком с теорией. Но если под передачей ссылок на удаленные обьекты подразумевается, что в RPC метода можно вернуть какой-то об’ект клиентского ЯП, и клиент на этом об’екте сможет вызвать тот же метод и таким же простым способом, как первый вызов, то такого в Thrift я не видел. Максимум, что можно сделать - возвращать URL другого сервера (с таким же интерфейсом или с другим), вручную переподключать клиента к этому адресу или создавать/переиспользовать нового клиента. Т.е. короче, Thrift - это такая клиент-серверная сеть, с генератором исходника клиента/сервера плюс транспорты плюс сериалайзеры/десериалайзеры.

Вроде как-то так.

seiken ★★★★★
()
Ответ на: комментарий от seiken

Но если под передачей ссылок на удаленные обьекты подразумевается, что в RPC метода можно вернуть какой-то об’ект клиентского ЯП, и клиент на этом об’екте сможет вызвать тот же метод и таким же простым способом, как первый вызов, то такого в Thrift я не видел.

Я вообще такое только в Erlang видел, где на узел можно перекинуть открытый файл или сформированное окно ГИП.

monk ★★★★★
()
Ответ на: комментарий от monk

Ну ведь в COM в офтопике это есть, а в DCOM это можно растаскивать как минимум по процессам. Видимо, в CORBA тоже. Мне не казалось это каким-то шиком. Понятно, что перекинуть вообще говоря нельзя ввиду того, что удалённый узел может упасть. Но за вычетом этого падения - можно. Т.е. логика будет другая, но способ вызова - такой же.

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

Просто в качестве транспорта используется FFI, а не, скажем, сокеты.

Был бы у меня SWIG на стороне сервера, а не клиента - я бы уже подумал прикрутить сокеты к свигу вместо FFI.

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 5)
Ответ на: комментарий от den73

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

Это плохо сочетается с «простота реализации и независимость от библиотек». COM/DCOM видел сколько занимает?

Был бы у меня SWIG на стороне сервера, а не клиента - я бы уже подумал прикрутить сокеты к свигу вместо FFI.

Так может проще SWIG расширить http://www.swig.org/Doc4.0/Extending.html#Extending_nn31 ?

monk ★★★★★
()
Ответ на: комментарий от monk

Это клиентская сторона, а мне нужно серверную на своём языке, клиентскую на C++.

den73 ★★★★★
() автор топика
Ответ на: комментарий от Legioner

В JSON нет ограничений на точность чисел.

128 байт максимальная длина числа. Но когда передаёшь это дело в JS там оно превращается в JS Number. Он же IEEE754. Аналогично если делаешь это с обратной стороны. Или для исследования и отладки используешь JS-утилиты.

Отталкиваться от формата само по себе не очень. Отталкиваться нужно от того, что передаёшь. Может 0-terminated строк достаточно.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.