41
Erlang Макс Лапшин Эрливидео [email protected]

Erlang railsclub - 1

Embed Size (px)

DESCRIPTION

Небольшой доклад про то, зачем нужен Erlang

Citation preview

Page 1: Erlang   railsclub - 1

ErlangМакс Лапшин

Эрливидео[email protected]

Page 2: Erlang   railsclub - 1

Что такое Erlang?1. Язык программирования2. Виртуальная машина3. Фреймворк для создания сетевых

сервисов

Page 3: Erlang   railsclub - 1

Откуда взялся Erlang?1. Более 20 лет эксплуатации2. Создан и развивается в Ericsson3. Проектировался инженерами, которые

любят спать по ночам4. Unix среди DOS в мире VM

Page 4: Erlang   railsclub - 1

Для чего нужен Erlang?1. Разработка долгоживущих сетевых

серверных приложений с высокой ценой простоя

2. Построение систем с изолированными компонентами

3. Безболезненное масштабирование по ядрам и компьютерам

Page 5: Erlang   railsclub - 1

Когда нужен Erlang?1. большой поток данных2. массовый сетевой и дисковый I/O3. много состояний в памяти4. разделяемые ресурсы5. большое время жизни данных6. multicore и multinode

Page 6: Erlang   railsclub - 1

Почему не Java?1. Erlang гораздо проще, чем Java2. Легче создать стабильную систему

(правильное управление ошибками)3. Упрощенное управление ресурсами4. Сильная ориентированность на сетевой

ввод-вывод и подключенных клиентов

Page 7: Erlang   railsclub - 1

Опыт эксплуатации1. Гораздо дешевле разрабатывать софт2. Быстро искать и переучивать людей3. Легко поддерживать4. Быстрая реализация VM5. В несколько раз меньше кода

Page 8: Erlang   railsclub - 1

Введение

Page 9: Erlang   railsclub - 1

Введение в Erlang1. Как хранятся данные?2. Как их обрабатывать?3. Как группировать логику?4. Как обрабатывать ошибки?5. Ввод-вывод6. Виртуальная машина

Page 10: Erlang   railsclub - 1

Типы данных1. Числа2. Атомы3. Блобы (binary)4. Reference5. Функции6. Порты7. Пиды8. Кортежи (tuple)9. Хеш-таблицы (map)

10. Списки

Page 11: Erlang   railsclub - 1

Немутабельность1. Переменных нет, есть только значения2. Композитные структуры create once3. Невозможно создать ссылочную петлю4. Сравнение только по значению5. Массивы с O(N) обновлением и не нужны6. Хитрая реализация мутабельного

состояния (ниже)

Page 12: Erlang   railsclub - 1

Функции1. Код есть только в функциях2. Вне функций кода нет3. Функции определяются именем и

количеством аргументов4. Значений по-умолчанию нет5. Есть разные тела одной функции (клозы)6. Рекурсия вместо цикла

Page 13: Erlang   railsclub - 1

Модули1. Модуль — группа функций2. Функций вне модуля нет3. Анонимные функции привязаны к

модулю4. Единица горячей замены кода5. Компилируются в байткод. JIT не

работает

Page 14: Erlang   railsclub - 1

Обработка данных1. Ввод-вывод данных2. Управляющие конструкции3. Обработка массива данных4. Структуры данных5. Изменение данных

Page 15: Erlang   railsclub - 1

Ввод-вывод данных1. file:open, file:pread, file:pwrite2. gen_tcp:connect, send, recv3. gen_tcp:listen, accept

Page 16: Erlang   railsclub - 1

Pattern-matching1. Перебор разных веток кода подходящих

по значению2. Это вместо ООП: классификация данных

не глобальная, а локальная3. Автоматическая деструктуризация

данных4. Вместо if

Page 17: Erlang   railsclub - 1

Pattern-matching

content(8) -> audio; content(9) -> video; content(18) -> metadata.

Page 18: Erlang   railsclub - 1

Массивы1. Список — основной контейнер2. for(i = 0) не используется3. Рекурсивный перебор списков в

различных вариантах4. map, fold, mapfoldl, flatmap, partition…5. Кортежи фиксированной длины, но O(1)

Page 19: Erlang   railsclub - 1

Структуры данных1. Immutable версии структур2. Композиция из списков и кортежей3. dict, set, graph, array и т.п.4. Используются не очень часто

Page 20: Erlang   railsclub - 1

Мутация данных1. Все значения неизменяемые2. Все значения обрабатываются в функциях3. Надо получить из функции новое

значение и отдать его дальше4. Рекурсия вместо бесконечного цикла5. Аргумент функции как эксплицитное

состояние

Page 21: Erlang   railsclub - 1

Процесс1. Рекурсивно зацикленная функция — это

процесс2. Её состояние снаружи ненаблюдаемо3. Процессы порождаются отстреливанием

новой функции4. Pid — идентификатор процесса5. Всё как в Unix

Page 22: Erlang   railsclub - 1

Коммуникация процессов1. Обмен только через сообщения и I/O2. Асинхронная посылка сообщений по Pid3. Глобальная регистрация Pid по atom4. Блокирующее получение с таймаутом5. Оповещение о смерти другого процесса

Page 23: Erlang   railsclub - 1

Ошибки в процессах1. Изоляция данных и исполнения2. Изоляция ошибок и проблем3. Автоматический контроль за ресурсами4. Оповещение соседей о смерти5. Автоприбивание соседей

Page 24: Erlang   railsclub - 1

Объекты на процессах1. Обмен сообщенями вместо вызова метода2. Pid вместо ссылки3. Глобальные переменные через register4. Внутреннее состояние скрыто5. Нереентерабельны6. Сериализованный вызов методов

Page 25: Erlang   railsclub - 1

gen_server1. Реализация generic объекта на процессах

и сообщениях2. Сериализованные и синхронизированные

вызовы методов3. Горячее обновление кода4. Откладываемый ответ на вызов метода5. Конструкторы, деструкторы6. Автоматический контроль дедлоков

Page 26: Erlang   railsclub - 1

Псевдо-методы1. Отдельный клоз handle_call — вызов

метода2. Есть асинхронные методы: handle_info

Page 27: Erlang   railsclub - 1

Псевдо-методы

handle_call(balance, _, State) -> {reply, State#s.balance, State};….

Page 28: Erlang   railsclub - 1

BEAM1. Одна из 4-х платформ с многоядерностью2. Epoll/kqueue3. Собственные аллокаторы

Page 29: Erlang   railsclub - 1

Multicore1. Процессы расползаются по ядрам2. Обмен сообщениями с минимум локов3. Нет шаринга данных — нет мьютексов4. Работает на 72 ядрах5. Черная магия мьютексов в ETS

Page 30: Erlang   railsclub - 1

Приложения на Erlang

Page 31: Erlang   railsclub - 1

Erlang OTP1. Фреймворк на Erlang2. Сообщения и процессы — это примитивы3. Реализация ряда паттернов на базе

процессов4. Обеспечение гарантированной

работоспособности в рамках паттернов

Page 32: Erlang   railsclub - 1

supervisor1. Процесс, следящий за другими2. Поддерживает синхронно группу

процессов3. Реализует паттерн «выключателя» для

заглючившей системы4. Выключается, если слишком часто всё

ломается

Page 33: Erlang   railsclub - 1

Поток данных1. Вызовы методов — сообщения2. Сообщения — память3. Бутылочное горлышко — утечка памяти4. Надо контролировать входную скорость5. Развязывать бутылочные горлышки

Page 34: Erlang   railsclub - 1

Flow control1. Бесконтрольная посылка сообщений —

зло2. gen_server:call помогает3. process_info(Pid, message_queue_len)

Page 35: Erlang   railsclub - 1

Пулы воркеров1. Вместо одного процесса можно поставить

8 или 162. Шардирование по воркерам помогает

распределению по ядрам

Page 36: Erlang   railsclub - 1

Отладка

Page 37: Erlang   railsclub - 1

Отладка1. printf2. trace (debugger)3. process_info

Page 38: Erlang   railsclub - 1

Печать1. io:format — это плохо2. логгирование с lager — хорошо3. уровни журналирования, метадата

Page 39: Erlang   railsclub - 1

trace1. Мониторинг всех сообщений, вызовов

функций и событий процесса2. Лучше чем gdb, потому что локален для

одного процесса

Page 40: Erlang   railsclub - 1

process_info1. Неинвазивный способ мониторинга

процесса снаружи2. Интроспекция стека, состояния,

потребления памяти и CPU

Page 41: Erlang   railsclub - 1

Вопросы?

Макс Лапшин[email protected]