24
... И снова Эрланг

GetDev.NET: Снова Эрланг

Embed Size (px)

DESCRIPTION

Презентация для встречи GetDev.NET, посвященной языку программирования Эрланг

Citation preview

Page 1: GetDev.NET: Снова Эрланг

...И снова Эрланг

Page 2: GetDev.NET: Снова Эрланг

!Плана не будет

Причины:

- невозможно впитать язык за два часа, надо начать на нем писать

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

болела голова

- язык — это просто средство выражения управления чем-либо, без предметной области

его обсуждать скучно и бесполезно

Скажите «Спасибо, кэп!»

Page 3: GetDev.NET: Снова Эрланг

Что будет

Поговорим за задачи

Посмотрим, каким боком тут поможет Э

Накачаемся кучей фактов

...в надежде, что потом это пригодится в реальной жизни

OMG!!! Это же план!

Page 4: GetDev.NET: Снова Эрланг

« »Поговорим за тяжелые приложения

• термина highload не существует, его придумал Бунин

• буржуины оперируют другими терминами• High Avaibility Systems (HA) — это любые системы

с 24/7 и кучей девяток в конце (сюда же и вэбня);

• High Performance Computing (HPC) — это уже про вычисления, съедающие ресурсы без остатка;

• наверное, есть что-то еще... но нам пока хватит

Page 5: GetDev.NET: Снова Эрланг

HPCПоговорим за- много потолков (CPU bound, memory bound, IO bound);

- предметная область — непростая;

- область решений — еще более непростая;

- цель: максимальная производительность, минимальная задержка;

- 24/7 — как обычно;

- выжать из железа все возможное (цена +1U может быть больше стоимости времени разработчика на

оптимизацию).

:Примеры HFT, OLAP, video encoding, DPI.

Page 6: GetDev.NET: Снова Эрланг

Своя особая атмосфера● ядро (kernel), брысь с моего ядра (core) — cpu affinity... но нам нужны таймеры и системные вызовы;

● память (преаллокация и локальность, huge pages, NUMA, пулы структур (слябы), zero copy, DMA, дружественность кешу);

● выполнение (считаем такты, особенности компилятора и прыжки в ассемблер, неблокирующие алгоритмы, минимум системных вызовов, контролируем вымывание кеша, помогаем предсказателю ветвления);

...

Page 7: GetDev.NET: Снова Эрланг

- 2Своя особая атмосфера

...

● контр-интуитивные знания и опыт (будет ли аппаратно подпружиненная функция быстрее самописной, HyperThreading — плохо, и т.д.);

● NIH — это нормально (переписанное и написанное самостоятельно будет наверняка быстрее и лучше вписываться в экосистему проекта);

● ЗБЧ. Когда операция повторяется миллиард раз, выигрыш в миллисекунду приносит неиллюзорный бенефит;

● языки: С/C++ с подпорками и asm {} (без вариантов);

● спецоборудование (CUDA/OpenCL видео-карты, Xeon Phi, TileGX, FPGA).

Page 8: GetDev.NET: Снова Эрланг

, ?А что вы будете делать если дойдете до конца

Упираемся головой в одну из границ?

- рост вглубь (смотрим что еще подкрутить);

- рост вширь (добавляем ресурсов).

2 CPU x 8 core + 348GB RAM + 6 x 4Tb— и пока все, что можно упихать в 1U.

Можно — больше, но это уже свое железо, свои патчи к ядру, свое производство, свой саппорт, в общем — ну его

нафик...

Остается только одно — ставить еще одну железку. И еще одну... И еще...

Page 9: GetDev.NET: Снова Эрланг

Мухи от котлет- этим безобразием надо как-то управлять

(сообщать конфигурацию)

- за этим безобразием надо как-то следить(собирать статистику)

Application

Data plane

Control plane

Page 10: GetDev.NET: Снова Эрланг

...А теперь немного уличной магии

Если с Data plane все ясно, то с Control plane мы можем развлекаться:

● можно использовать язык высокого уровня;

● легкий FFI с языком data plane;

● сетевая прозрачность/простота;

● легкость интеграции.

● можно использовать сторонние библиотеки/GC/кеды/смузи;

● можно ( )но не нужно падать и терять данные (главное — не уронить data plane при этом)

● при этом не мешало бы горячая смена кода, если вдруг понадобятся бантики (а они понадобятся).

Page 11: GetDev.NET: Снова Эрланг

?И где тут Эрланг

Легкие процессы, нет классической смены контекста и ее тяжести;

Непростой, но вполне понятный FFI с Си (порты,

NIF, C node);

Сетевая прозрачность и распределенный характер;

Иммутабельность и GC;

Интроспекция и легкое чтение кода;

24/7: let it fall, hot code reload;

Интегрируемость (ASN.1, куча сетевых сервисов и binary

pattern matching).

Page 12: GetDev.NET: Снова Эрланг

, … PROFIT!! Берем Э ставим в продакшен*

* - на самом деле нет.

Нужно еще понимание, что там под капотом:- OTP (Open Telecom Platform)

- не OTP (bad idea but embeed!)

.erl + .hrl

.app

erlc.beam

.beam.beam

ERTS EPMD

node@localhost

EPMDEPMD

EPMD

Page 13: GetDev.NET: Снова Эрланг

pattern matchingДекларативность и- программа не последовательность действий,

а набор правил

- какое правило сработало — то и выполняем

- т.е. такой большой неявный switch/case (clause, слоз, набор правил)

Соответствие образцу (pattern matching) + присвоение (про иммутабельность позже):

- полное {ok, Result} = {ok, [1,2,3]} | {ok, undefined}

- частичное {error, _} = {error, notfound} | {error, <<123, 255>>}

- с допусловиями (guards)

{ok, IP} where IP =/= {127, 0, 0, 1}

Page 14: GetDev.NET: Снова Эрланг

GCИммутабельность и1> P = 1.12> P = 2.** exception error: no match of right hand side value 2

vs.

irb(main):001:0> a = 1=> 1irb(main):002:0> a = 2=> 2irb(main):003:0> print a2=> nil

+ все версии значения переменной;

+ чужой код не подменит значения;

+ warnings рулят! (возникают зачастую из-за ошибки);

+ простота GC (собираем по выходу за границы видимости).

- работа с большими списками и кортежами — ад копирования и фрагментация памяти;

- разработчику трудно адаптироваться;

- имена кончаются, а нумерация усложняет понимание и написание;

- можно наступить в утечку.

Page 15: GetDev.NET: Снова Эрланг

? Wut?Легкие процессы

- process vs. threads vs. green threads vs. erlang processes

- не процесс, но объект, инкапсулирующий состояние (ObjC)

- OTP — инфраструктура над процессами (супервизоры, серверы, конечные автоматы, события, мониторы)

parent инициализацияparent receive

State

spawn(Fun)

Pid = <0.0 10>

{...}

State

{...}

{...}

State

Fun309 w (heap: 233)

Pid ! Message

mailbox

Page 16: GetDev.NET: Снова Эрланг

Let if fall, hot code reload..

- let it fall =/= можно писать с ошибками

- let it fall =:= «ошибки неизбежны, подстрахуемся на их счет»

:Страховка OTP-инфраструктура, супервизоры, мониторы

- немного о релизах

- горячее обновление: останавливаем мир, трансформируем состояние, меняем код, запускаем мир

- система даже не заметит

- и можно делать по сети

- минусы: надо делать аккуратно, надо следить за версиями структур и писать трансформеры

- практика: все предпочитают перезагрузится, для вэба это некритично

Page 17: GetDev.NET: Снова Эрланг

Интроспекция

observer:start().

Page 18: GetDev.NET: Снова Эрланг

Интегрируемость

Что уже есть и прям можно брать:

- SNMP, SSH, SSL, telnet, ASN.1 — в комплекте;

- LDAP, HTTP (classic + WS), XMPP, AMQP — стороннее;

- адаптерты к БД (epgsql, eredis, sqlite) — полно;

- ZMQ, GTK, OpenGL — и это тоже, да.

Через ports и NIF можно подпихнуть что угодно:

- библиотеки;

- unix pipes;

- shared memory.

Page 19: GetDev.NET: Снова Эрланг

- -Фу фу фу- корявый синтаксис (надо привыкнуть);

- особенности GC и масштабирования;

- небыстрая математика;

- проблема первого пня.

Page 20: GetDev.NET: Снова Эрланг

... ?Пссс Хочешь немного кода

connect(_Con) -> undefine.

msg(Con, <<"I">>, undefine) -> add(Con);

msg(Con, <<"L:", Nick/binary>>, undefine) ->

case enter(Con, Nick) of

{ok, UState} -> UState;

error -> undefine

end;

msg(Con, <<"P">>, S) when S =/= undefine -> pub(Con, S);

msg(Con, <<"S">>, S) when S =/= undefine -> stop(Con, S);

msg(Con, <<"C:", Msg/binary>>, S) when S =/= undefine -> chat(Con, S, Msg);

msg(_, _, S) -> S.

close(Con, S) -> rm(Con, S).

Page 21: GetDev.NET: Снова Эрланг

, .Нафик код архитектура лучшеЧто нужно сделать, чтобы передать статистику работы data plane в control plane?

Варианты:

1. data plane сам формирует статистику и передает ее в control plane по шине сообщений;

2. control plane сам забирает статистику из разделяемой памяти data plane;

3. data plane готовит статистику по запросу из control plane.

DP CP

DP CP

DP CPDP CP

Page 22: GetDev.NET: Снова Эрланг

Книги

http://dmkpress.com/

http://www.oreilly.com/

https://pragprog.com/

Page 23: GetDev.NET: Снова Эрланг

Пообщаться

Google-группы:https://groups.google.com/forum/#!forum/erlang-russian

Jabber-конференции:[email protected]

[email protected]

Page 24: GetDev.NET: Снова Эрланг

!Спасибо за внимание

Максим Крентовский

http://devimpress.com

[email protected]

mkrentovskiy

mkrentovskiy