
Никита
24.03.2018
09:20:05
А в самом коде, как реализовывали? Через враппер?

Daniel
24.03.2018
09:20:15
враппер чего?

Никита
24.03.2018
09:20:33
ну я так понимаю что у нас один ендпоинт
Который принимает запросы

Google

Никита
24.03.2018
09:20:54
И в нем мы смотрим какой method указал пользователь

Daniel
24.03.2018
09:20:59
это все унутре rpc спрятано

Никита
24.03.2018
09:21:03
и в зависимости от него вызывает функцию
net/rpc ?

Kirill
24.03.2018
09:21:48
например тут https://github.com/semrush/zenrpc
через switch/case

Daniel
24.03.2018
09:22:11
вы регистрируете хендлер, и он вызывается, на входе уже структуры, какие вы заявили

Никита
24.03.2018
09:22:15

Kirill
24.03.2018
09:22:40
а зачем вам реализовывать сервер? есть же готовые либы

Александр
24.03.2018
09:22:43

Kirill
24.03.2018
09:22:54

Никита
24.03.2018
09:23:08
А что на счет net/rpc?
Сейчас увидел
https://golang.org/pkg/net/rpc/

Google

Daniel
24.03.2018
09:23:28
так это, с ним и работаем

Никита
24.03.2018
09:23:39
ok, понял
я так понимаю от по tcp бегает
то есть нет http оверхеда?

Daniel
24.03.2018
09:24:14
коллеги
что за херня
какой оверхед, кто его мерял?

Kirill
24.03.2018
09:24:43
да

Daniel
24.03.2018
09:24:43
это вообще не важно
вот когда вы обнаружите, что в требования ТЗ не укладываетесь - тогда и думайте
а заранее - делайте максимально читабельный и максимально пригодный для отладки вариант
by the way, я для себя решил, что там, где возможно, буду делать RPC на REST (хоть это и ублюдочно)
а REST буду делать на swagger, кодогенерацией
и ниипет, что там код неоптимальный
и пока ни разу переделывать не пришлось

Kirill
24.03.2018
09:27:59

Daniel
24.03.2018
09:28:40
https://github.com/go-swagger/go-swagger
другого, вроде, нет, с поддержкой генерации серверного кода на go

Roman
24.03.2018
11:44:10

Evgeniy
24.03.2018
11:45:36
Привет. Почему в Go так плохо всё с GUI?

Google

Evgeniy
24.03.2018
11:45:43

Daniel
24.03.2018
11:46:14
коллега, закругляйтесь

Roman
24.03.2018
11:46:27

Alisher
24.03.2018
12:05:07
Всем привет
кто может поделиться проектом go с rest
или как backend framework лучший для go ?

Daniel
24.03.2018
12:07:55
go-swagger и вперед

Alisher
24.03.2018
12:09:46
go-swagger и вперед
backend с rest-api , чтобы в данном framworkе была архитектура , configов , prod-настроек , routers , models , permisson_guards
присутствует ?

Daniel
24.03.2018
12:13:53
коллега, вы бы доку почитали?
swagger, он же open api, есть стандарт индустриальный для описания rest

Alisher
24.03.2018
12:14:20
я еще не открывал просто читаю что люди советуют

Daniel
24.03.2018
12:14:33
соответственно, делать надо на нем

Sergey
24.03.2018
12:15:45
Всем привет, может кто знает, почему изображение переворачиватеся влево после кропа или ресайза?

Yuriy
24.03.2018
12:26:17

Alisher
24.03.2018
12:27:54

Yuriy
24.03.2018
12:28:46

Roman
24.03.2018
12:50:22

Daniel
24.03.2018
12:56:29
Это как?
я не понимаю вопроса :(
никто не мешает нам написать RPC поверх RESTful, при этом нарушив некоторые принципы RESTful

Google

Roman
24.03.2018
12:57:43
Почему?
потому-что TCP ты не напишешь на JS для браузера, нет API, в браузере только WS(S)

Roman
24.03.2018
12:58:03
Как только мы начнем передавать endpoint одним из параметров

Roman
24.03.2018
12:59:03
но seriously, зачем TCP? WS достаточно низкоуровневый и предоставляет дополнительные удобства как например поддержка шифрования посредством HTTPS, оверхеда там не значительно больше TCP/IP

Kirill
24.03.2018
13:00:03

Roman
24.03.2018
13:00:49

Admin
ERROR: S client not available

Roman
24.03.2018
13:01:38

Roman
24.03.2018
13:02:54

Roman
24.03.2018
13:09:49
А что подробнее? Как мы узнаем, что удаленная сторона получила сообщение?
WebSockets работает поверх TCP/IP соединения которое пораждает HTTP(S) запрос который потом апгрейдится в WS(S).
если WS не гарантирует доставку, тогда HTTP не гарантирует и TCP/IP тоже, что естественно неправда, поскольку TCP/IP это не UDP, он reliable.
WS не гарантируешь лишь одно: обработает ли сервер сообщение? поэтому в webwire есть request-reply. посылаем сообщение запрос и асинхронно ожидаем сообщение ответ.

Roman
24.03.2018
13:11:21


Roman
24.03.2018
13:13:30
tcp гарантирует доставку только до ядерного буфера на удаленном хосте. Остальное - нет.
ну так правильно, гарантируется только доставка, а обработаешь ли ты сообщение или нет - никто гарантировать кроме тебя не может.
если тебе нужно убедиться в том, что сообщение обработано - для этого, повторюсь, есть в webwire: request-reply. посылаешь запрос, получаешь либо ошибку, либо ответ, либо timeout. таким образом можно гарантировано узнать, выполнил ли сервер что либо или нет

Roman
24.03.2018
13:14:04


Roman
24.03.2018
13:19:00
А что подразумевается под ошибкой?
есть несколько видов ошибок, ошибка ReqErr которая определяется user-code'ом, в ней есть CODE и MSG, аналогично HTTP status но с большей свободой и есть internal error, который только логируется но не отдаёт на клиент описание ошибки ради безопасности
onRequest(ctx context.Context) (wwr.Payload, error) {
msg := ctx.Value(wwr.Msg).(wwr.Message)
if msg.Name != "auth" {
// user-code error reply
return wwr.Payload{}, wwr.NewReqErr("YOUR_CUSTOM_ERROR", "Something went wrong, check it out")
}
// Internal error, similar to HTTP 500 status, will be logged
return fmt.Errorf("internal error, an unexpected error happened")
}

Vadim
24.03.2018
14:17:09
А питерские чятики в тг есть по го?

Phil
24.03.2018
14:19:20

Vadim
24.03.2018
14:19:48
Вопрос-ответ чятик

Phil
24.03.2018
14:21:01
В Питере народ суровый)))

Google

Daniel
24.03.2018
14:23:26

Roman
24.03.2018
14:30:42
Что если говно-сервер на самом деле обработал запрос и отослал ответ. Как он может быть уверен, что клиент получил этот ответ?

Daniel
24.03.2018
14:43:03
не может, конечно
но он может быть уверен, что, если клиент ответа не получил - клиент пришлет запрос заново

Zver
24.03.2018
14:44:29

Vadim
24.03.2018
14:50:35

Roman
24.03.2018
14:51:27
Чем этот request-reply лучше HTTP/2?
конкретно доклад писать не буду, времени нет, возможно напишу статью на медиум с полным подетальным раскладом
он в любом случае легковеснее и гибче HTTP/2
но разница в плане request-reply не большая, ибо именно так и запланировано чтоб webwire мог спокойно заменять HTTP для коммуникации с API сервером.
главная фишка в дуплексе. у HTTP нет обратной связи, long polling не решение да и server-push это про другое..
и нам не хотелось делать запросы по одному каналу, а получать оповещения по другому... это геморно, и там и там нужно связь мониторить, аутентифицировать и т.д.
поэтому написали webwire, чтоб полностью работать на WS(S)

Roman
24.03.2018
14:55:16
Коректне сравнивать с gRPC. Он тоже full duplex поверх HTTP/2, с request-reply, стримингом и таймаутами.


Roman
24.03.2018
14:56:26
Что если говно-сервер на самом деле обработал запрос и отослал ответ. Как он может быть уверен, что клиент получил этот ответ?
гарантии абсолютно идентичны с HTTP(S)
всё что гарантирует HTTP, гарантирует и WebWire.
- запрос гарантировано дойдёт.
обработает ли сервер запрос? это ответственность пользователя, тут не может быть гарантий кроме timeout ошибки.
получит ли клиент ответ на запрос? again.. возможно гарантировать только доставку и то что webwire-js или клиент из webwire-go вызовет соответствующий handler.
если сеть пропала во время обработки запроса - будет ошибка, которую если не отработать - естественно сервер забудет про невыполненый запрос и на стороне клиента будет timeout
HTTP/2 не заменит websockets, websockets не заменит HTTP/2
для разных проблем - разные решения.
А webwire мы написали чтоб работать с API по вебсокетам ?
поверх webwire тоже можно реализовать RPC с protobuf или чем угодно..


Александр
24.03.2018
14:59:19
народ, а вы решаете подобные задачи. Есть 5 воркеров, они кладут в канал chan *MyStruct результаты работы. Но перед формированием неких данных в MyStruct надо убедится что в канал уже не поступала подобная структура (по ID)
можно проверить по факту получения данных, но тогда воркер отработает "в пустую" если он делал дубль
можно в ворке прокинуть структурку на базе sync.Mutex, и там по get проверять, а добавление только через канал