- много продуктовых задач
- много уже существующих сервисов со сложившейся инфраструктурой
- задачи требуют быстрого внедрения
- на C/C++ долго
- предложить заменить вводимый текст стикером
- ответ стикером на сообщение
- ответ текстом на сообщение
Пример кода
func HandshakePayload(svc string, host string, cfg string) []byte {
return TLVPack(
1,
SLPack([]byte(svc)),
SLPack([]byte(host)),
SLPack([]byte(cfg)),
)
}
POST /suggest HTTP/1.1
Host: 127.0.0.1:8080
User-Agent: Go-http-client/1.1
Content-Length: 178
Content-Type: application/json
Accept-Encoding: gzip
{"msgs":
[
{"sender":"7105550","receiver":"7105551","TS":1564997991,"text":"тест"},
{"sender":"7105551","receiver":"7105550","TS":1564997991,"text":"тест"}
]
}
178 байт
message Request {
repeated Msg message = 1;
}
message Msg {
string sender = 1;
string receiver = 2;
uint32 TS = 3;
string text = 4;
}
162 байта
01 00 00 00 7b 00 00 00 42 04 cb 9a 01 00 00 00 |....{...B.......|
07 00 00 00 37 37 30 31 35 31 34 01 00 00 00 64 |....7701514....d|
00 00 00 02 00 00 00 5c 00 00 00 03 00 00 00 26 |.......\.......&|
00 00 00 07 00 00 00 37 31 30 35 35 35 30 07 00 |.......7105550..|
00 00 37 31 30 35 35 35 31 3d 24 8a 5d 08 00 00 |..7105551=$.]...|
00 d1 82 d0 b5 d1 81 d1 82 03 00 00 00 26 00 00 |.............&..|
00 07 00 00 00 37 31 30 35 35 35 31 07 00 00 00 |.....7105551....|
37 31 30 35 35 35 30 3d 24 8a 5d 08 00 00 00 d1 |7105550=$.].....|
82 d0 b5 d1 81 d1 82 |.......|
123 байта
- соединение с контроллером (service discovery)
- получение списка хостов, шардированных по ключу
- выбор хоста
- handhake
- обмен данными
- во многих крупных компаниях есть свой RPC
- ipros экономит трафик
- исторически так сложилось
- деплой ML моделей, запакованных в RPM
- структура ipros сообщений жестко не задается на уровне протокола
- ручная сборка nmslib
- написана библиотека для работы с бинарными данными
- ipros: с нуля написан клиент и сервер
type Message struct {
string Sender `ipros:"sl"`
string Receiver `ipros:"sl"`
uint32 TS `ipros:"."`
string Text `ipros:"sl"`
}
type Request struct {
uint32 MsgType `ipros:"."`
string Sender `ipros:"sl"`
[]Message Messages `ipros:"sl"`
}
r := &Request{}
ipros.Unmarshal(data, r)
Увеличение скорости разработки сервисов относительно времени, затрачиваемому на разработку аналогичных сервисов на C/C++.