
Daniel
23.03.2018
19:50:16

Kirill
23.03.2018
19:50:17
чувак из Авито делает

Daniel
23.03.2018
19:50:52
при чем тут клиент?!

Google

Daniel
23.03.2018
19:51:01
клиент пусть как хочет работает

Kirill
23.03.2018
19:51:54

Roman
23.03.2018
19:51:58
request-reply я тут не вижу совсем, это одна из главных фич нашей либы кстати
"аутентификация" какая-то есть, но конкретно про "сессии" ничего не написано
"каналы" типа chatroom'ы и у нас можно реализовать с помощью namespace'ов

Kirill
23.03.2018
19:55:47
понял

Roman
23.03.2018
19:56:01
бинарный ли протокол - тоже не пояснено, у нас бинарный и очень компактный

Kirill
23.03.2018
19:56:46
там protobuf

Roman
23.03.2018
19:57:02
да, это скорее похоже на чаты короче
а у нас скорее похоже на HTTP2 в обе стороны с ещё кучей плюх

Google

Igor
23.03.2018
19:58:08

Daniel
23.03.2018
19:58:27
со стороны go там синхронный интерфейс?
если да - не понятно, зачем дамба, она сама получится

Roman
23.03.2018
19:59:43
со стороны go там синхронный интерфейс?
да
client.Request, client.TimedRequest и client.RestoreSession блокируют до получения ответа от сервера, ошибки или таймаута, единственно client.Signal не блокирует
ведь их может быть неопределённое множество
и сервер неизвестно вернётся ли

Daniel
23.03.2018
20:03:16
дамба для этого не нужна
получили запрос из канала, попробовали отправить
если ошибка - поспали милисекунду, снова попробовали

Roman
23.03.2018
20:04:01

Daniel
23.03.2018
20:04:09
и так, пока таймаут не истечет
как истек - вернули ошибку
тут, кстати, и канал не нужен, в принципе
но если запросов может накопиться много - таки канал. и вместе с запросом по нему приезжает канал, через который вернуть результат (и второй, для ошибки)

Roman
23.03.2018
20:05:50

Daniel
23.03.2018
20:06:35
тогда эта горутина может быть одна ровно
и принимать запросы через канал
и все встанут в очередь на записи в этот канал

Google

Roman
23.03.2018
20:09:30
ладно, короче долго объяснять, у тебя нет полного контекста ситуации
но дамба тут нужна

Daniel
23.03.2018
20:09:37
нет
не нужна

Roman
23.03.2018
20:10:50
дело в том, что каждый вызов client.Request должен блокировать вызыающую рутину

Daniel
23.03.2018
20:11:48
да
это делается так
вместе с запросом ты отправляешь канал, по которому тебе придет ответ
и встаешь на чтении этого канала

Roman
23.03.2018
20:34:57

Daniel
23.03.2018
20:36:34
для каждого запроса два канала - для ответа и для ошибки
но разве это плохо?

Roman
23.03.2018
20:38:05

Daniel
23.03.2018
20:38:40
так
а как ошибку-то вернуть ровно туда, откуда запрос пришел?

Roman
23.03.2018
20:39:37
там сейчас регистр reqid -> {fail(), fulfill()} т.е. колбаки

Daniel
23.03.2018
20:39:59
и что, это хорошо, колбеки?
лучше, чем пара каналов?

Roman
23.03.2018
20:40:14
а разве плохо?)

Daniel
23.03.2018
20:40:20
плохо

Google

Daniel
23.03.2018
20:40:22
очень
и при отладке плохо, и при чтении кода

Roman
23.03.2018
20:42:31
https://github.com/qbeon/webwire-go/blob/master/client/sendRequest.go#L16
вот тут создаётся новый request object
а это собственно класс регистра:
https://github.com/qbeon/webwire-go/blob/master/requestManager/requestManager.go

Daniel
23.03.2018
20:43:07
погоди
у тебя там уже есть канал для ответов
почему, собственно, не заблокироваться на его чтении?
зачем колбек?

Admin
ERROR: S client not available

Roman
23.03.2018
20:43:56
где конкретно?

Daniel
23.03.2018
20:44:36
там, где ты запрос создал и отправил

Roman
23.03.2018
20:53:07
короче sendRequest создаёт новый объект запроса, который откладывает в мап (reqid -> reqobj) requestManager'а.
когда reader goroutine читающая из сокета парсит входящее сообщение и оно типа reply, тогда ищет по id данный запрос и либо фейлит его либо fulfill'ит в зависимости от овета, выполняя либо .fail() либо .fulfill() колбаки

Daniel
23.03.2018
20:54:08
это ок

Roman
23.03.2018
20:55:39
reqobj да, есть канал типа reply с либо ошибкой либо данными

Daniel
23.03.2018
20:55:51
ну
ладно, остальное завтра

Roman
23.03.2018
20:56:44
у объекта запроса есть AwaitReply
блокирующий метод
он то и читает из канала
так-что да, уже всё через каналы
дамба нужна не в этом место а в методе tryAutoconnect

Google

Roman
23.03.2018
20:58:45
ладно, реализую - покажу кому интересно

Roman
23.03.2018
21:23:26
И зачем поверх вебсокетов весь этот велосипед?

Roman
23.03.2018
23:23:36
У вас подтверждения доставки есть?
подтверждение доставки чего?
сообщений? это гарантирует сам вебсокет
запросов? они так или иначе возвращают ответ
сигнал? доставка гарантируется, обработка - нет
И зачем поверх вебсокетов весь этот велосипед?
duplex messaging
HTTP не обладает обратной связью, long polling - не решение, HTTP2 server-side push - не о том
webwire позволяет работать с сервером через 1 единое соединение
- асинхронно мультиплексить запросы и сигналы в обе стороны
- бинарный протокол, очень компактный и легковесный
- поддерживает по умолчанию UTF8 и UTF16 кодировки
- гарантирует соединение, самовосстанавливается
- сессии и аутентификация встроены..
ну и многое другое
впрочем тут всё описано: https://github.com/qbeon/webwire-go


Anatoly
24.03.2018
03:35:36
WebWire provides a compact set of useful features that are not available and/or cumbersome to implement on raw WebSockets such as Request-Reply, Sessions, Thread-safety etc.
ну эт конечно лол
впрочем, если есть время пилить всякое такое, вай нот

Mikhail
24.03.2018
06:39:44
Нужна помощь в написании отдельного Смарта под airdrop. Есть у кого опыт? Или знакомые? Заранее спасибо

Roman
24.03.2018
08:31:15

Kirill
24.03.2018
08:33:01
tcp это слишком низкоуровнево

Никита
24.03.2018
08:38:38
Есть кто применяет JSON-RPC или нечто подобное?

Subbotin
24.03.2018
08:46:54
В чате на 1500 человек точно хоть один да применяет. Спрашивай вопрос

Никита
24.03.2018
08:48:05
Интересно кто с чем его применяет (http, websocket, protobuf) и было ли хорошим решение использовать RPC-style API

Daniel
24.03.2018
09:17:35
я применял поверх http и поверх udp

Никита
24.03.2018
09:18:13
И как "впечатления", если так можно сказать?

Daniel
24.03.2018
09:19:13
jsonrpc 2.0 - норм