2. В далекой далекой ЮВ Азии
● была сеть, она все еще жива
● раздает контент
● знает про геоблокирование
● может рестримить видео
● обрабатывает много запросов в секунду
● но, когда-то давно она всего этого не умела
● но очень хотела научиться
3. Требования к системе авторизации
● Понятный формат
● Простота интеграции
● Скорость работы
● Масштабируемость
● Надежность
● Простота использования
● JSON?
● REST?
● <1ms?
● 10k клиентов за раз
● автономная работа
● запустил и забыл
4.
5. Erlang
● Простой и понятный, даже старшекласнику
● Многопоточный (умри или сделай)
● Имеет нативный протокол сериализации BERT
● Встроенная база данных Mnesia
● Хорошо зарекомендовал себя при работе под нагрузкой
● Горячая замена кода
● Виртуальную машину можно править/смотреть на лету
● Выбор очевиден
8. Сервер авторизации на erlang
Клиенты
● nginx via lua
● java
● c++
● легко добавить новые (на самом деле нет)
● кстати вы тоже не видите здесь erlang как клиента?
9. Сервер авторизации на erlang
Общается по UDP
● Работает на уровне ноды, т.е. localhost
● Максимальный размер сообщения =MTU ~1472 bytes
● Очень быстро
● Но есть задержки при большом количестве датаграмм
● Клиенты не получают ответа -> задержка оригинального
запроса
10. Сервер авторизации на erlang
Позволяет смотреть состояние виртуальной машины
а также легко ее убивать
[root@node ~]$ service authdaemon attach
Attaching to /tmp/opt/authdeamon/erlang.pipe.1 (^D to exit)
# нажал CTR+C
BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
(v)ersion (k)ill (D)b-tables (d)istribution
...
[End]
12. Эксплуатация
● Авторизационный сервис под нагрузкой часто ложится
○ Запросы вызывают таймаут
○ Клиенты просто не умеют обрабатывать такую ситуацию
● erlang vm требет резолвить ноду через внешнюю сеть
○ лечится в resolve.conf
● Много новой бизнес логики связано с парсингом строк
○ regex и прочий .split
○ не так легко пишется
13. Эксплуатация
● jvm при рестарте erlang vm требует дополнительной логики
подключения
● Никто не пользуется хот релоудом
● Просмотр состояния erlang vm опасно для сервисов
● Сложности с init.d
○ vm одна, процессов несколько
○ изоляция erlang vm на каждый пакет
● Erlang создает больше проблем, чем решает
15. Erlang из масс
● Переписываем авторизационный сервис на C++
○ люди знающие erlang ушли из команды
● Убираем сервис состояние стриминга внутрь стриминг
серсива
○ это же просто hashmap
● Убираем интеграцию jvm с erlang vm
● Не знаем что делать с UDP и BERT
16. Выводы
● Протокол - им должно быть легко пользоваться
● Формат данных - должен быть легким для понимания
● ФП - это лишь технология решения
● Миллениалов оказалось сложно заставить писать на erlang
● ФП не всегда KISS
17.
18. У меня есть мечта применить ФП
● Но не erlang
● Что может быть на уровне python в работе со строками?
● Простым в использовании?
○ Логи, init.d скрипты и пакетирование
● Чтобы билдилось в одно касание?
● Чтобы работало на общих протоколах?
● Имело хорошую библиотеку?
● Легко работало с зависимостями
● Btw, у нас проекте не так много памяти