quik-lua-rpc icon indicating copy to clipboard operation
quik-lua-rpc copied to clipboard

Открытый список вызываемых функций

Open gonsalez-ru opened this issue 4 years ago • 5 comments

Здравствуйте! Потребовалось настроить удаленный запуск новой кастомной LUA функции. Пришлось внести правки в 100500+ файлов проекта, но задачку решил и в итоге потерял возможность использовать обновления из репозитория. Было бы здорово, если бы сервис использовал специальный справочник с описанием допустимых функций и параметров. Есть ли какие-нибудь архитектурные ограничения, которые не позволят это реализовать?

gonsalez-ru avatar Oct 09 '20 10:10 gonsalez-ru

Не хочу напрягать, но можете на конкретном примере пояснить, как Вы это видите?

По идее, практически все функции, доступные через сервис, маппятся 1-к-1 к соответствующим функциям в QLua. Бывают иногда различия в типах параметров (для переносимости) или объектах возврата. Само API сервиса, по сути, заключено в .proto-файлах (или JSON-схемах), описывающих сообщения запросов и ответов.

Enfernuz avatar Oct 13 '20 08:10 Enfernuz

Можете пояснить поля null_flags, value_flags для OnAllTrade? Я полагаю, что value_flags это flags в QLua, но неожиданно натолкнулся на то, что он value_flags бывает пустой. Что такое null_flags?

gojmpz avatar Oct 13 '20 09:10 gojmpz

@gojmpz, это оптимизация для случая, когда в пришедшей от QLua сделке не инициализировано поле flags. Если оставить поле типом int32, то придётся тащить 0 (целое 32-битное число, то есть 4 байта). В случае использования oneof можно заменить сериализацию этого факта 1 байтом (https://stackoverflow.com/a/43696446).

Enfernuz avatar Oct 13 '20 11:10 Enfernuz

Не хочу напрягать, но можете на конкретном примере пояснить, как Вы это видите?

По идее, практически все функции, доступные через сервис, маппятся 1-к-1 к соответствующим функциям в QLua. Бывают иногда различия в типах параметров (для переносимости) или объектах возврата. Само API сервиса, по сути, заключено в .proto-файлах (или JSON-схемах), описывающих сообщения запросов и ответов.

Я себе представляю это так: добавляем .proto файл с описанием новой функции (например, в специальный пакет custom, по аналогии с пакетом OS), а Lua модули динамически его подхватывают и генерят объекты на основе информации из описания.

P.S. Не судите строго, на Lua никогда не писал, и его возможностей не знаю, поэтому может быть чего-то не догоняю. Ж-)

P.P.S. Я правильно понимаю, что .proto описания и json схемы это альтернативные варианты описания API и сервис может работать с чем-то одним из них?

gonsalez-ru avatar Oct 18 '20 07:10 gonsalez-ru

@gonsalez-ru,

а Lua модули динамически его подхватывают и генерят объекты на основе информации из описания

Проблема в том, что библиотека lua-ptorobuf автоматически генерит только Lua-объекты на основе proto-сообщений. Всю остальную обработку -- то есть, как сервис принимает и обрабатывает такие сообщения (и посылает соответствующие ответные сообщения) -- нужно делать вручную в соответствующих serde-исходниках (для protobuf -- protobuf_request_response_serde.lua). В сущности, большинства такого боилерплейта можно было бы избежать путём использования gRPC, но я не знаю, есть ли сейчас для Lua нормальный генератор grpc-стабов. Когда я начинал разрабатывать проект, такой библиотеки не было.

Я правильно понимаю, что .proto описания и json схемы это альтернативные варианты описания API и сервис может работать с чем-то одним из них?

Это форматы сообщений (запросов и ответов), с которыми работает сервис при выборе соответствующего механизма сериализации и десериализации сообщений. Представленное API одинаково в обоих случаях (ведь цель сервиса -- предоставить доступ к QLua извне). Отличие лишь в том, как сообщения кодируются и декодируются при передаче их от сервиса к клиенту. Protocol Buffers более эффективен с точки зрения размера передаваемых сообщений, но более замороченный в использовании, в то время как JSON более человекочитаем и прост в использовании, но сообщения в этом формате имеют бОльший размер (думаю, даже с учётом использования какого-нибудь алгоритма компрессии типа gzip).

Enfernuz avatar Oct 18 '20 20:10 Enfernuz