Петр Курышев, itmozg
DESCRIPTION
Erlang/OTP: чтобы не падалоTRANSCRIPT
2
Erlang
2
• Функциональный язык программирования (не чистый)
• Писать для распределенности и отказоустойчивости - легко
• Писать логику - сложно
3
Erlang и другие
3
• У каждой технологии - своя ниша
• Не противопоставлять!
• Использовать вместе для достижения целей
4
Все привыкли к ООП
4
• Процесс - как экземпляр класса
• Состояние - внутри модуля
• Модуль - как декларация класса
5
Open Telecom Platform
5
• Можно все писать самому, но зачем?
• Общий путь для всехspawn -> init -> loop calls -> ... -> exit
6
Gen server
6
• gen_server:start_link
• gen_server:call и genserver:cast
• синхронно и асинхронно, соответственно
7
Горячая замена кода
7
code_change(_OldVsn, State, _Extra) -> %% No change planned. The function is there for the behaviour, %% but will not be used. Only a version on the next {ok, State}.
code_change({down, _Vsn}, {Chs, N}, _Extra) -> {ok, Chs};code_change(_Vsn, Chs, _Extra) -> {ok, {Chs, 0}}.
8
Супервизор
8
• Наблюдающий и наблюдаемый
• Спецификация «ребенка»:
• Супервизоры супервизоров или кто следит за следящими
{ChildId, StartFunc, Restart, Shutdown, Type, Modules}.
9
Супервизор
9
child_spec() = {Id,StartFunc,Restart,Shutdown,Type,Modules} Id = term() StartFunc = {M,F,A} M = F = atom() A = [term()] Restart = permanent | transient | temporary Shutdown = brutal_kill | int()>0 | infinity Type = worker | supervisor Modules = [Module] | dynamic Module = atom()
Какой должен быть ребенок
10
Наеродные воркеры
10
• Python/Django
• Ruby on Rails
• Node.js
11
Слежка за чужими детьми
11
• Порты Erlang
• Port против Lined Port
• Другие способы
12
Способ взаимодействия
12
• Вызываем внешние процессы
• NIFы
• ErlPort (http://hlabs.org/development/erlang/ports.html)
13
Что бывает когда падает
13
14
Let it fail
14
• Быстро поднятое не считается упавшим
• Уронить до конца и поднять с самого начала
15
Храните состояние вовне
15
• Очереди сообщений
• Быстрые key/value хранилища
• Всегда можно что-то потерять пока оно не записано в постоянное хранилище