36
Erlang Мгновенное Просветление Обучающий курс @5HT

Erlang мгновенное просветление

Embed Size (px)

Citation preview

Page 1: Erlang  мгновенное просветление

Erlang

Мгновенное ПросветлениеОбучающий курс

@5HT

Page 2: Erlang  мгновенное просветление

ErlangЛекция 1. Место языка в современном мире функционального программирования

Page 3: Erlang  мгновенное просветление

На чем делать кошерный проект?

Экосистема JVM

Scala MLClojure Lisp

Без ограничений

Haskell MLOCaml MLErlang Prolog

FFI

ANSI С

Page 4: Erlang  мгновенное просветление

Haskell

● Сложная задача● Нужно не потеряться в коде● Все партнеры Суперзвезды● Необходима мощная система типов

Успешные области применения:Микротранзакции, FPGA моделирование, уникальные утилиты, создание DSL

Консалтинг: WellTyped, LLC

Page 5: Erlang  мгновенное просветление

Scala

● Мощная система типов● JVM экосистема● Akka легковесные процессы● Кровавый энтерпрайз

Успешные области применения:Бэкенды, Веб, Оркестрация Java сервисов

Консалтинг: TypeSafe, Inc.

Page 6: Erlang  мгновенное просветление

OCaml

● Cупербыстрота как С++ или выше● Низкий вход за счет ООП● Первоклассные типы● ML-классика

Успешные области применения:Банковская сфера, сложные алгоритмы, построение DSL

Консалтинг: OCamlPro SAS

Page 7: Erlang  мгновенное просветление

Erlang

● Суперпростой и масштабируемый● Супернадежный soft real-time● Оркестрация кластера

Успешные области применения:Веб, Телеком, GSM, Интернет сервисы, Месаджинг, DHT

Консалтинг: Synrc Research Center s.r.o.

Page 8: Erlang  мгновенное просветление

Промышленность

Haskell 2006— наиболее академичныйOCaml 1996 — маргинальная классикаScala 2004 — на пути к замене JavaErlang 1986 — наиболее промышленный

Erlang — единстенный динамически-типизированный язык среди рассмотреных. Но грустить рано, смотрим на расклад.

Page 9: Erlang  мгновенное просветление

MQ сервера

○ FioranoMQ JMS○ Tibco JMS○ WebSphere JMS○ RabbitMQ AMQP

MQ сервер — сердце кластера. Один из самых быстрых MQ — RabbitMQ — имплементация бинарного AMQP протокола разработаного в JP Morgan.

Page 10: Erlang  мгновенное просветление

KV сервера

C/C++: Redis AP, MongoDB APJava: Oracle Cache Coherence AP, Cassandra CA, Hadoop CAErlang: Riak AP, CouchDB AP, Hibari AP, KAI AP, LeoFS AP, Mnesia CA

Как не странно, больше всего реализаций DHT именно на Erlang. В основном это из-за прозрачности распределенного кода.

Page 11: Erlang  мгновенное просветление

WEB Сервера

Page 12: Erlang  мгновенное просветление

Кот* создавал сайты на Erlang ?

● Lift Scala● Happstack Haskell● Eliom OCaml● Nitrogen Erlang

Нитроген является самым простым и больше всего подходит для huyak-huyak in production development process.* — https://groups.google.com/forum/#!topic/erlang-russian/p6GOpPx03YM

Page 13: Erlang  мгновенное просветление

Кто использует Erlang

● Ericsson

● T-Mobile

● Telia

● Klarna

● Amazon SimpleDB

● Facebook Chat

● Github Pages

● WhatsApp

● ShoreTel M5

Page 14: Erlang  мгновенное просветление

Современный Erlang стек

● Erlang/OTP устройчивая среда

● Riak надежное Key-Value хранилище

● RabbitMQ промышленный Pub/Sub

● Nitrogen суперпростой веб фреймворк

● Cowboy самый быстрый веб сервер

● GProc распределенный реестр

Page 15: Erlang  мгновенное просветление

ErlangЛекция 2. Обзор решений, принятых при разработке языка

Page 16: Erlang  мгновенное просветление

Parallelism and Concurrency

● Shared State (C++, Java)● STM (Haskell, Clojure)● Message Passing (Erlang, Haskell, Scala)

● Parallel composition (Spawn)● Communication (Channels)● Sequential Composition (Monadic)

Process Calculus

Page 17: Erlang  мгновенное просветление

● Preemptive (Erlang, Sparks)● Cooperative (Lwt, Sparks, Akka)

Erlang считает редукции и сам переключает контексты процессов (1.5К). Sparks переключаются только когда требуется память. Остальные модели актёров (Lwt, Akka) планируются кооперативными планировщиками.

Task Switching

Page 18: Erlang  мгновенное просветление

Shared State

● Нет разделяемой памяти. Рай.● Разделяемая памать. Java.● Разделяемые состояния и память. Ад.

Erlang посылает сообщения в процессы не используя мютекстов, все происходит за атомарное изменение указателя очереди. Хип процесса изолирован и собирается GC в выделеное для этого время.

Page 19: Erlang  мгновенное просветление

Interconnection

● TCP● SCTP

Simplicity and Openness

● Go https://github.com/goerlang● Ocaml https://github.com/khigia/erlocaml● Scala https://github.com/boundary/scalang

Page 20: Erlang  мгновенное просветление

Heterogeneity and Interoperability

● NIF (C FFI, leveldb, shmem, сuda)● Ports (Fast High Level Right Way)● Distribution Protocol (ETF)

Если надо подключить существующую C библиотеку лучше это сделать через NIF. В случае взаимодействия с внешними системами напрямую через Ports. Если хочеться хардкора через dist протокол.

Page 21: Erlang  мгновенное просветление

ErlangЛекция 3. Введение в язык и примеры программ

Page 22: Erlang  мгновенное просветление

Атомарные типы

Integer 42 длинная арифметикаFloat 4.2 doubleAtom ok Reference #Ref<0.0.0.29>Binary <<"maxim">>Pid <0.0.42>Port #Port<0.42>Fun #Fun<erl_eval.6.82930912>

Page 23: Erlang  мгновенное просветление

Составные типы

List [<<42,1,0,90>>,1,ok]Tuple {<0.0.16>,107,42,["maxim",true]}

Можно типизировать кортежи и требовать, чтобы все элементы списка были одного типа. Строки — списки. Поэтому работа со строками в Erlang медленная, нужно стараться работать с бинарными данными.

Page 24: Erlang  мгновенное просветление

Чат на Нитрогене...

body() ->

wf:comet_global(fun() -> chat_loop() end, chat), [ #panel { id=chatHistory, class=chat_history }, #textbox { id=messageTextBox, next=sendButton }, #button { id=send, text="Send", postback=chat } ].

event(chat) -> Usrname = wf:q(userNameTextBox), Msg = wf:q(messageTextBox), wf:send_global(chat, {message, Usname, Msg}), wf:wire("obj('messageTextBox').focus();" "obj('messageTextBox').select();");

Page 25: Erlang  мгновенное просветление

... выглядит просто

chat_loop() -> receive {message, Username, Message} -> Terms = [#span { text=Username, class=username }, ": ", #span { text=Message, class=message } ], wf:insert_bottom(chatHistory, Terms), wf:wire("obj('chatHistory').scrollTop = " "obj('chatHistory').scrollHeight;"), wf:flush() end, chat_loop().

Page 26: Erlang  мгновенное просветление

RLE декомпрессия еще проще

-module(rle).-compile(export_all).

drle([]) -> [];drle([H|L]) when H<192 -> [H,drle(L)];drle([H,X|L]) -> [lists:duplicate(H-192,X),drle(L)].

Любой кто писал на Python, PHP, Perl, Ruby может писать на Erlang уже на второй неделе.

Page 27: Erlang  мгновенное просветление

XML < > Suck and Blow

● Текстовый формат● 10% времени на парсинг● Много ошибок при ручном парсинге

XML нужен только для связи с внешними системами. Нет смысла использовать внутри своей системы XML.

Page 28: Erlang  мгновенное просветление

ASN.1

● BER - LDAP, SNMP, PKCS#7, GSM TAP, ISDN, UMTS● DER - X.509 Certs and Keys● XER - XML encoding● ECN - Bluetooth, UMTS RRC, GPRS, GSM, SS7

ASN.1 разработанный в 1984 году на службе телекомов по сей день.

Page 29: Erlang  мгновенное просветление

Свободные ASN компиляторы

● Erlang (Ericsson)● asn1c (Lev Walkin)

Свободных ASN компиляторов не так и много. Erlang — это лучший инструмент для оркестрации сервисов, где данные определяются c помощью ASN.1

Page 30: Erlang  мгновенное просветление

Как с этим работать ?

SP DEFINITIONS AUTOMATIC TAGS ::=BEGINMessage ::= SEQUENCE { version INTEGER DEFAULT 1,

type MsgType, body Body }

MsgType ::= ENUMERATED { public(0), private(1), tralala(2) }Body ::= OCTET STRINGEND

$ erlc SP.asn

Page 31: Erlang  мгновенное просветление

И в Эрланг консоли

1> {ok, Bin} = 'SP':encode('Message', #'Message'{version = 3, type = private, body = "Hello, ASN.1"}).

{ok,[48,20,128,1,3,129,1,1,130,12,72,101,108,108,111,44,32,65,83,78,46,49]}

1> 'SP':decode('Message', Bin).{ok,#'Message'{version = 3,type = private, body = "Hello, ASN.1"}}

Page 32: Erlang  мгновенное просветление

ErlangСеминар 1. Практическое занятие. LDAP сервер

Page 33: Erlang  мгновенное просветление

ErlangЛекция 4. Управление релизами, деплой и обновление кота

Page 34: Erlang  мгновенное просветление

ErlangСеминар 2. Чат на Cowboy и вебсокетах

Page 35: Erlang  мгновенное просветление

ErlangСеминар 3. Демонстрация продакшин системы как оно есть

Page 36: Erlang  мгновенное просветление

ErlangЛекция 5. Будущее. Виртуализация и работа в Xen