Skip to content

WebSocket proxy (json_proto) проблемы #440

Open
nonamegithub opened this issue Jun 15, 2023 · 38 comments
Open

WebSocket proxy (json_proto) проблемы #440

nonamegithub opened this issue Jun 15, 2023 · 38 comments
Labels
enhancement New feature or request

Comments

@nonamegithub
Copy link

Время в orderbook.time возвращается в строковом формате вместо timestamp, аналогичные проблемы в candle с time и last_trade_ts.
Также дает знать о себе старая проблема. Можно конечно же откостылить у себя, но если задаться целью получать не только "сообщения c наименованиями полей идентичными наименованиям полей из proto-контрактов", но и одинакового типа, то есть над чем поработать.
Скорее всего аналогичные проблемы в других WebSocket стримах - не проверял.

Совсем мелочь - пока никто не начал пользоваться WS Proxy, имеет смысл добавить payload в сообщения - для полной совместимости структуры возвращаемых данных с данными gRPC стримов.

@SRadyukov
Copy link

SRadyukov commented Jul 27, 2023

эти ограничение вызваны текущей реализацией прокси - тк контракты транслируются с grpc protobuf
строковое представление в json для timestamp
https://cloud.google.com/ruby/docs/reference/google-cloud-container-v1/latest/Google-Protobuf-Timestamp#json-mapping
c payload получилось трансляция oneof из grpc контрактов в openapi json действительно потерялись но в данной реализации это не похоже на проблему

@nonamegithub
Copy link
Author

nonamegithub commented Jul 28, 2023

эти ограничение вызваны текущей реализацией прокси

Да мне все равно, чем вызваны ограничения

это не похоже на проблему

и похожи ли они на проблему. Я уже давно понял, что разработчикам API Tinkoff Инвестиций не присуще чувство прекрасного, и, как закономерный финал, не приходится говорить ни о каком "бесшовном" переходе на использование WebSocket Proxy в своем коде.

@SRadyukov
Copy link

SRadyukov commented Aug 2, 2023

напишите пожалуйста какую проблему вы решаете и об каком "бесшовном" переходе речь?

@nonamegithub
Copy link
Author

Попробуйте себе представить проект в десяток тысяч строк кода, использующий определенную структуру данных, получаемых с gRPC-стримов InvestAPI. Вдруг появляется интересная альтернатива в виде WebSocket-стримов, поставляющих те же самые данные, но уже в виде структур иной формации. Внимание, вопрос: в каком случае придется минимально переписывать код - в случае с идентичными или в случае с малопохожими друг на друга структурами? Время пошло....

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

@SRadyukov
Copy link

SRadyukov commented Aug 2, 2023

Друг - твоя токсичность не помогает в решении проблемы
Можете нормально сформулировать проблему? Или хотябы ответь нормально на вопросы
Свои 10к строк кода ты руками написал и жалуешься тут что тебе не переключить протокол?
WebSocket - это не интересная альтернатива а отдельный протокол более убогий имхо чем grpc, но сделан в например, чтобы в бразуре можно было нарисовать график, или подключить какуюто беду которая не умеет grpc

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

@nonamegithub
Copy link
Author

Там работы от силы на 10 минут, о чем речь вообще?

@SRadyukov
Copy link

да я согласен что 10 минут, только понять бы что требуется и точно ли проблема у меня
добавить в структур payload - зачем это бесполезное поле.. и лишние байты в сообщении... - кроме совместимости с какимто другим кодом который возможно вообще не от той стенки гвоздь. либо же если это dto из grpc то вы можете замапить json из websocket в эти объекты - это может делать сам protobuf-json, вообще не вижу проблем -
какую вы видите ошибку? как ее повторить пришлите пожалуйста пример, из ваших оценок действительности ничего не понятно

@nonamegithub
Copy link
Author

На payload я уже не настаиваю, но ради совместимости можно было бы и пожертвовать лишними байтами - ни вижу здесь никакого криминала. Главная проблема в том, что поля в возвращаемых структурах gRPC и WebSocket-стримов, хоть и имеют одинаковые наименования, но к сожалению, разных типов. Если честно, то я давно и без проблем нормализовал для себя (привел в соответствие) структуру данных, возвращаемых WebSocket MarketData стримом. Positions и Portfolio не стал пока трогать, в надежде на то, что разработчики смогут доставлять данные "один в один" как в gRPC.

@SRadyukov
Copy link

SRadyukov commented Aug 2, 2023

1 в 1 не получается тк gRPC это бинарный протокол и передача там таймастампа обусловлена размером полей целых чисел.
В случае с json когда мы информацию передаем текстом представление таймстампа какой вариант лучше и почему?
`
2023-08-02T17:09:55Z

{"seconds":1690996195,"nano":0}
`

@SRadyukov
Copy link

  • потратить время на пересборку сообщения чтобы добавить поле payload и преобразовать строки в объекты

@nonamegithub
Copy link
Author

какой вариант лучше

Любой из этих двух лучший, если используется только он один в gRPC и WebSocket. Какой смысл был мутить WebSocket json_proto стрим, если он не стал идентичным gRPC по структуре возвращаемых данных?

  • потратить время на пересборку сообщения чтобы добавить поле payload и преобразовать строки в объекты

именно так я и сделал) Но мог бы с таким же успехом пересобрать и сообщения WebSoсket-стрима в первоначально предложенном разработчиком варианте. Мне не трудно. Гораздо труднее объяснить, чем шедевр мастера отличается от колхоза тяп-ляпщика.

@SRadyukov
Copy link

Ну тут спора не получится, что выглядит не красиво, json-proto вроде по твоей просьбе и делали и только ты его и пользуешь.
Я бы на твоем месте и не писал никаких репортов об проблеме просто попровил спокойно сам и привет.
Тут достаточно почитать пару твоих комментариев чтобы понять что нас посетил мастер а не сельпо

@nonamegithub
Copy link
Author

Там где вы все учились, я преподавал. Какой собес ты мне предлагаешь?) Я сам подобных бедолаг постоянно отбираю, но молодежь сейчас далеко не та, что в мои времена...
Просьба, впредь, называть меня Мастер, и никак иначе. Когда узнаешь, рано или поздно, кто я - будешь хвастаться детям и внукам, что я тебе разрешил так ко мне обращаться.

@SRadyukov
Copy link

Тут понятно что у вас серьезный случай
Обновления по таймастампам скоро доедут

@nonamegithub
Copy link
Author

json-proto вроде по твоей просьбе и делали и только ты его и пользуешь.

не удивлюсь, если я вообще единственный WebSocket proxy затестил на данный момент. Но если сделать все по уму, то мои последователи не раз поблагодарят разработчиков от души

Обновления по таймастампам скоро доедут

там еще одна проблема, кроме TS

И самое главное: если это только для меня, то можно не делать - сегодня же закрою issue. А вот если есть хоть немного понимания, что необходимо обеспечить единство форматов данных WebSocket и gRPC-стримов для легкого старта работы с WebSocket proxy, то конечно же жду в скором будущем обновления.

@SRadyukov
Copy link

с последним обновлением возможно что и эта проблема пройдет, но еще возможно что всплывут и другие неожиданности

@SRadyukov
Copy link

можете проверять еще раз

@nonamegithub
Copy link
Author

image
gRPC данные всегда с полем nano, даже если значение равно 0.
Предлагаю байты не экономить, совместимость важнее. И payload предлагаю тоже начать использовать, пусть только в json_proto. Там работы лишь на строку кода: msg.payload = Object.keys(msg)[0];

@SRadyukov
Copy link

Да конечно и это недоразумение запилим

@SRadyukov
Copy link

в итоге получается помоему очень убого, но мне к сожалению мне не понять мысли мастера сельпо пту для бедолаг

@SRadyukov
Copy link

SRadyukov commented Aug 3, 2023

убогость заключается в том что теперь в json будует все поля с дефолтными значениями -если они не указаны - по словам мастера это в grpc значения содержатся, хотя видимо мастер гуманитарных направлений не разбирает протоколы и в чем отличия json от protobuf

@nonamegithub
Copy link
Author

Не расстраивайся сильно. я сделаю из тебя джуна, как минимум. Мастер пока отталкивается от того, что ему отдает SDK для Node JS. Убедишь Мастера, что там что-то не так, и что другие SDK возвращают без nano, можно будет обсудить. А пока делай, за что тебе деньги платят, пока я в хорошем настроении.

@SRadyukov
Copy link

Друг, так и хочется тебе сказать иди делай уроки, а свои фантазии оставь для других пабликов - писателей-фантастов

@nonamegithub
Copy link
Author

Ученик, ты уж определись, можешь ли ты сделать полное подобие структуры gGPRC или нет? Если нет, то не имеет смысла мучать себя и других: json_proto можешь убить за ненадобностью тогда. А если можешь - стисни зубы и делай.

@SRadyukov
Copy link

да я сделал уже только доедет оно после торгов

@nonamegithub
Copy link
Author

Так то лучше, ставлю тебе плюсик пока

@SRadyukov
Copy link

и скорей всего json_proto просто удалим потом - либо придется обратно убрать дефолтные значение - потомучто смысла в них нет, поразвлекаемся с гуманитариями над совместимостью и пока

@nonamegithub
Copy link
Author

очень жаль, что ты так и не понял, в чем смысл реализации json_proto( А то что она будет с небольшими костылями на бэкенде, отобьется много раз сэкономленным временем на фронтах пользователей. Все ради удобства конечного пользователя, не более того

@SRadyukov
Copy link

SRadyukov commented Aug 3, 2023

да просветите плиз, в чем заключается удобство?
развне недостаточно использовать https://github.com/googleapis/proto3-json-serializer-nodejs
чтобы распарсить json в нужный вам протобуф на nodejs, даже в протоколе json, а не json_proto?
тут какраз json_proto поделка которая вернет результат не совместимы со специфакаицияей protobuf-json тоесть имеет проблемы с переносимость в другие платформы

@nonamegithub
Copy link
Author

Не переживай так - тебе все скажут. Когда придет время

@nonamegithub
Copy link
Author

Доброе утро, ученик! Много лучше, но не слушаешь ты Мастера внимательно, он тебе все подсказал уже. Холостой деплой получился. Ход твоих мыслей мне предельно понятен, но, как говорится, почувствуй разницу:
gRPC:
image
WebSocket:
image

@SRadyukov
Copy link

Проблема только с этим осталась?

@nonamegithub
Copy link
Author

nonamegithub commented Aug 4, 2023

Мастер пока проверил, что смог. Остальное, если вылезет, то только после очередного деплоя. А если уж совсем откровенно, то Мастер не работает тестировщиком в InvestAPI Тинькова, и все что он делает на данный момент, он делает с одной целью - сделать InvestAPI лучше, по мере имеющихся у него возможностей. Кстати, если одолеешь этот Issue, то обязательно свяжусь с руководством Банка, чтобы тебя перебросили на эту тему. Там-то у тебя будет что рассказать мастеру-гуманитарию из ПТУ, и при его контроле, я уверен, этот тикет будет быстро закрыт раз и навсегда.

@SRadyukov
Copy link

обновил

@nonamegithub
Copy link
Author

Теперь candle и orderbook прилетают нормальные - ни в какой доп. обработке больше не нуждаются - достаточно переключиться на желаемый способ доставки сообщений и все.
Пользователям на самом деле фиолетово, какой ценой это достигнуто на бэкенде: принесены ли в жертву лишние байты, "gRPC это бинарный протокол" или нет, "передача там таймастампа обусловлена размером полей целых чисел" или нет, совместимо ли это "со специфакаицияей protobuf-json" или нет - многие из них никогда и ничего не слышали про это, и вряд ли услышат.
Сегодня-завтра проверю портфельные WebSocket-стримы.

@SRadyukov
Copy link

Мастер - сделать InvestAPI лучше, по мере имеющихся у него возможностей.

используйте меня для этого как угодно

Пользователям на самом деле фиолетово

да простите за мое недоверие, считайте что это проблема в процессе донесения требований

@nonamegithub
Copy link
Author

На постмаркете выстрелила одна мелочь: WebSocket-стрим доставляет orderbook без ключей bids или asks, в случае отсутствия соответствующих данных, а gRPC и REST-стаканы всегда с ними обоими

@nonamegithub
Copy link
Author

аналогичная картина в данных WebSocket Positions Stream: отсутствуют ключи futures,options,securities в случае отсутствия соответствующих данных.
Вероятно, нечто аналогичное имеем в Portfolio и Trades стримах - даже не стал смотреть

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

3 participants