Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Erlang в FunBox

Erlang в FunBox

Опыт использования Erlang в компании FunBox

Anton Kaliaev

April 24, 2016
Tweet

More Decks by Anton Kaliaev

Other Decks in Programming

Transcript

  1. Предупреждение • презентация содержит смехуечки • есть некая вероятность, что

    вы не узнаете ничего нового • прослушав этот доклад, вы не научитесь писать на Erlang
  2. О чем пойдет речь? • проблемах, с которыми столкнулись при

    написании приложений, и как мы их решили • какие инструменты используем • как деплоим • как дебажим • личные впечатления от Erlang • Elixir
  3. FunBox • основана в: 2006 г. • сфера деятельности: телеком

    • клиенты: операторы сотовой связи • Erlang разработчиков: ~ 20 • Erlang репозиториев: 39 • Elixir репозиториев: 5
  4. lager app file Если синхронный режим выключен → рост потребления

    памяти и OutOfMemoryError в конце https://groups.google.com/forum/#!topic/erlang-russian/ 8xEeffAV8sc (http://bit.ly/hl-logging)
  5. Latest commit 7218c80 on Aug 19, 2013 (3 years ago)

    https://github.com/basho-labs/hierdis
  6. - X не выглядит так, что его кто-то пилит, 25

    Jan последний PR - 25 Jan для эрланг библиотеки - можно сказать вчера коммитнули. актив девелопмент
  7. 1 LPUSH 100 LPUSH 
 via pipeline Avg time (msc)

    0,00000 175,00000 350,00000 525,00000 700,00000 eredis hierdis eredis ~ 16K ops
 hierdis ~ 28K ops
 redis-benchmark ~ 60K ops 100 соединений | n = 100_000
  8. Зачем? • CPU bound (кол-во процессов <= N ядер) •

    Соединения к внешним ресурсам (редис, postgresql) • не тратим время на открытие соединения • проще поддержка (одно место в коде) • проще анализ текущего состояния (кол-во соединений и т.п.) • разделяем задержку от сети
  9. • если падает один воркер, падают все в рамках пула

    • нельзя зарепортить плохого воркера • нормальная статистика https://github.com/inaka/worker_pool http://www.erlang-factory.com/sfbay2015/anthony-molinaro How to Pick a Pool in Erlang without Drowning
  10. Как деплоим • нет необходимости ставить Erlang на сервере •

    разные приложения могут использовать разные версии Erlang • собирать релиз нужно на ОС == ОС сервера (из-за C расширений)
  11. - А почему capistrano, А не что- нибудь другое (ansible)

    ? - Потому что и так все работает
  12. Как мониторим • логи • собственная система сбора метрик и

    состояния приложения и его сущностей (http://riemann.io/ + Kafka) • https://github.com/zaa/entop
  13. Как дебажим • http://erlang.org/doc/man/observer.html • http://erlang.org/doc/apps/observer/ crashdump_ug.html • https://ferd.github.io/recon/ •

    подключаемся к ноде и вперед (process_info(Pid), system_info(procs)) http://www.slideshare.net/motonarola/erlang-data-operation- caveats (http://bit.ly/1Wfhq9k)
  14. • одна из лучших реализаций акторов (если не лучшая) •

    OTP крут (никто пока не повторил нормально) • простой до жути синтаксис Личные впечатления
  15. • одна из лучших реализаций акторов (если не лучшая) •

    OTP крут (никто пока не повторил нормально) • простой до жути синтаксис • добротная документация и инструментарий (тот, что включен в стандартную поставку) Личные впечатления
  16. “эрланг не гуглят это бесполезно ) я поначалу пытался по

    привычке найти ответы на SO потом смирился и приучил себя читать доки”
  17. "всего через год упорных тренировок ты научишься по слову error

    различать не меньше 25 видов ошибки и додумывать трейс на ходу"
  18. сложно писать тесты из-за • отсутствия DI в нашем коде

    • необходимости запускать зависимые компоненты • дополнительного coupling-а из-за spawn-ов с внешними обращениями.
  19. print_time_test(_Config) -> PredefinedTime = 1459246205, System = doppler:start(undefined), doppler:def(System, time,

    fun(State) -> {PredefinedTime, State} end), doppler:def(System, print, fun(_State, Str) -> NewState = Str, {ok, NewState} end), print_time(System), PrintedTime = doppler:state(System), doppler:stop(System). "1459246205" = lists:flatten(PrintedTime).
  20. Личные впечатления • ошибки непонятные • сложно писать тесты •

    много лишнего кода в случае с OTP • не всегда есть готовые библиотеки → возможность написать свое
  21. Elixir • удобные макросы • синтаксический сахар • протоколы из

    Clojure • много возможностей → больше ответственность args = %{"req" => req, “resp” => nil} |> authorize |> decode_req |> validate_body
  22. Мы узнали, что • все что угодно может пойти не

    так, и надо “бороться” с этим (тесты, статические анализаторы, code review, game days) • нужно планировать нагрузку • важна унификация • важны метрики и мониторинг (логи никто не смотрит)