18
об эволюции использования и наследии Erlang, который мы потеряли

Erlang, который мы потеряли

Embed Size (px)

Citation preview

Page 1: Erlang, который мы потеряли

об эволюции использования и наследии

Erlang, который мы потеряли

Page 2: Erlang, который мы потеряли

В далекой далекой ЮВ Азии

● была сеть, она все еще жива● раздает контент● знает про геоблокирование ● может рестримить видео● обрабатывает много запросов в секунду ● но, когда-то давно она всего этого не умела● но очень хотела научиться

Page 3: Erlang, который мы потеряли

Требования к системе авторизации

● Понятный формат● Простота интеграции● Скорость работы● Масштабируемость● Надежность● Простота использования

● JSON?● REST?● <1ms?● 10k клиентов за раз● автономная работа● запустил и забыл

Page 4: Erlang, который мы потеряли
Page 5: Erlang, который мы потеряли

Erlang

● Простой и понятный, даже старшекласнику● Многопоточный (умри или сделай)● Имеет нативный протокол сериализации BERT● Встроенная база данных Mnesia● Хорошо зарекомендовал себя при работе под нагрузкой● Горячая замена кода● Виртуальную машину можно править/смотреть на лету● Выбор очевиден

Page 6: Erlang, который мы потеряли

Сеть

Page 7: Erlang, который мы потеряли

Сервер авторизации на erlang

Использует BERT

Page 8: Erlang, который мы потеряли

Сервер авторизации на erlang

Клиенты

● nginx via lua● java ● c++● легко добавить новые (на самом деле нет)● кстати вы тоже не видите здесь erlang как клиента?

Page 9: Erlang, который мы потеряли

Сервер авторизации на erlang

Общается по UDP

● Работает на уровне ноды, т.е. localhost● Максимальный размер сообщения =MTU ~1472 bytes● Очень быстро● Но есть задержки при большом количестве датаграмм● Клиенты не получают ответа -> задержка оригинального

запроса

Page 10: Erlang, который мы потеряли

Сервер авторизации на 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]

Page 11: Erlang, который мы потеряли

Erlang в массы

Page 12: Erlang, который мы потеряли

Эксплуатация

● Авторизационный сервис под нагрузкой часто ложится○ Запросы вызывают таймаут○ Клиенты просто не умеют обрабатывать такую ситуацию

● erlang vm требет резолвить ноду через внешнюю сеть○ лечится в resolve.conf

● Много новой бизнес логики связано с парсингом строк○ regex и прочий .split ○ не так легко пишется

Page 13: Erlang, который мы потеряли

Эксплуатация

● jvm при рестарте erlang vm требует дополнительной логики подключения

● Никто не пользуется хот релоудом● Просмотр состояния erlang vm опасно для сервисов● Сложности с init.d

○ vm одна, процессов несколько○ изоляция erlang vm на каждый пакет

● Erlang создает больше проблем, чем решает

Page 14: Erlang, который мы потеряли

Что делать?

ТРИЗ: Идеальный объект — когда объекта нет, а функция его выполняется.

Page 15: Erlang, который мы потеряли

Erlang из масс

● Переписываем авторизационный сервис на C++○ люди знающие erlang ушли из команды

● Убираем сервис состояние стриминга внутрь стриминг серсива○ это же просто hashmap

● Убираем интеграцию jvm с erlang vm● Не знаем что делать с UDP и BERT

Page 16: Erlang, который мы потеряли

Выводы

● Протокол - им должно быть легко пользоваться● Формат данных - должен быть легким для понимания● ФП - это лишь технология решения

● Миллениалов оказалось сложно заставить писать на erlang● ФП не всегда KISS

Page 17: Erlang, который мы потеряли
Page 18: Erlang, который мы потеряли

У меня есть мечта применить ФП

● Но не erlang● Что может быть на уровне python в работе со строками?● Простым в использовании?

○ Логи, init.d скрипты и пакетирование● Чтобы билдилось в одно касание?● Чтобы работало на общих протоколах?● Имело хорошую библиотеку?● Легко работало с зависимостями● Btw, у нас проекте не так много памяти