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