User Tools

Site Tools


Foo bar

Поскольку собеседование носило вид забега по саванне =) , то некоторые пост-заметки тут.

gRPC

Генерируеться не только сериализатор/десериализатор. При его использовании действительно генерируется объемные клиент-серверный код, который “добавляется” к основному шасси.

Это несколько затрудняет отладку, как в любом случае с генерацией кода.

К которому можно прикрутить свою аутентификацию и авторизацию. Для примера сделал:

Но gRPC используют где нужно и не нужно, хотя тот JSON RPC 2.0 и варианты реализовываеться на раз, и даже с валидацией запроса при желании. И включая через web-socket как транспорт (в примере сделал на базе gorilla libs)

И на том же на perl, как пример реализации на разном

Так что да, не панацея.

GET, POST и RPC

RPC можно организовать хоть почтовыми голубями. Вопрос в соглашении об интерпретации и дисциплине. “Красные барабаны это сигнал правым полкам наcтупать”

В проекте ниже RPC реализован через старые как мир GET/POST. Помним, что этот продуктик работает 5 лет без остановки, и каждые сутки по расписанию прогоняет через себя 2Тб дампов с 30 узлов.

Кстати, почему Perl?

  1. Потому что иначе бы не написал, не было бы времени, а надо было закрыть вопрос с резервированием баз данных в компании. Фронтэндера не было, и фиг кто бы его нанял, самому на Angular/Vue объем работ сильно больше.
  2. Поэтому perl, Mojo & Bootstrap наше все.

Digest auth

В моем последнем протокольном фрейворке https://pkg.go.dev/github.com/kindsoldier/dsrpc действительно реализована “порядочная” аутентификация. В открытом виде передается только авторизационный ключ. Дайджест каждый раз другой.

Псевдокод

===client side===
struct {
   login
   pass
}
salt = hash(random)
digest = hash(salt + password)
 
send(login, salt, digest)
 
===server side===
struct {
   login
   pass
}
 
req_login, req_salt, req_digest = receive()
digest = hash(req_salt + password)
if digest == req_digest {
   auth = true
} else {
  auth = false
}

Подобная логика применяется в очень и очень многих сетевых приложениях. Она достаточно устойчива, посольку не позволяет вычислить пароль по дайджесту. Для скрытия авторизационного ключа применяется шифрование разделяемым ключем, но тут это изыточно.

Как избежать перегрузки при массовом открытии массы тупых сокетов к серверу

Вставить в начало протокольного диалога обработку magic code. Если первые байты из сокета не соотвествуют шаблону, то закрываем сокет на сервере по ошибке декодирования заголовка. Полностью не спасает (нужен комплекс мер), но позволяет при “атаке” снизить нагрузку на сервис на порядок и более.

JWT

Код какой-то из промежуточных версий. JWT AA для Gin на базе хорошей крипто-библиотеки от немецкого коллеги. Легко переделать для других целей.

Код с фронта c JWT в два конца сейчас не найду.