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

Максим Лапшин — введение в Erlang

  • Upload
    -

  • View
    270

  • Download
    3

Embed Size (px)

Citation preview

Page 1: Максим Лапшин — введение в Erlang

ErlangМакс Лапшин

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

Page 2: Максим Лапшин — введение в Erlang

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

сервисов

Page 3: Максим Лапшин — введение в Erlang

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

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

Page 4: Максим Лапшин — введение в Erlang

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

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

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

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

Page 5: Максим Лапшин — введение в Erlang

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

Page 6: Максим Лапшин — введение в Erlang

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

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

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

Page 7: Максим Лапшин — введение в Erlang

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

Page 8: Максим Лапшин — введение в Erlang

Введение

Page 9: Максим Лапшин — введение в Erlang

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

Page 10: Максим Лапшин — введение в Erlang

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

10. Списки

Page 11: Максим Лапшин — введение в Erlang

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

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

Page 12: Максим Лапшин — введение в Erlang

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

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

Page 13: Максим Лапшин — введение в Erlang

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

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

работает

Page 14: Максим Лапшин — введение в Erlang

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

Page 15: Максим Лапшин — введение в Erlang

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

Page 16: Максим Лапшин — введение в Erlang

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

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

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

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

Page 17: Максим Лапшин — введение в Erlang

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

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

Page 18: Максим Лапшин — введение в Erlang

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

Page 19: Максим Лапшин — введение в Erlang

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

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

состояние

Page 20: Максим Лапшин — введение в Erlang

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

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

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

Page 21: Максим Лапшин — введение в Erlang

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

Page 22: Максим Лапшин — введение в Erlang

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

Page 23: Максим Лапшин — введение в Erlang

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

Page 24: Максим Лапшин — введение в Erlang

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

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

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

Page 25: Максим Лапшин — введение в Erlang

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

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

Page 26: Максим Лапшин — введение в Erlang

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

Page 27: Максим Лапшин — введение в Erlang

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

Page 28: Максим Лапшин — введение в Erlang

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

Page 29: Максим Лапшин — введение в Erlang

Приложения на Erlang1. Erlang OTP2. supervisor3. application4. ets5. потоки данных6. многоядерность

Page 30: Максим Лапшин — введение в Erlang

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

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

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

Page 31: Максим Лапшин — введение в Erlang

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

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

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

ломается

Page 32: Максим Лапшин — введение в Erlang

application1. В простонародье «библиотека»2. Но со своими тредами — процессами3. Со своим пулом данных в памяти

Page 33: Максим Лапшин — введение в Erlang

gen_event1. Процесс, в который можно положить

коллбеки2. Коллбеки с состояниями3. Годится прежде всего для логов

Page 34: Максим Лапшин — введение в Erlang

Как хранить данные?1. В процессах2. На диске3. В сети4. В БД в памяти (ets)

Page 35: Максим Лапшин — введение в Erlang

ETS1. Глобальное хранилище кортежей2. Очень хорошо оптимизировано3. Пользоваться только как хеш-таблицей4. Вторичные индексы через mnesia5. Легко можно свалиться в race conditions6. Писать через процесс (*), читать через ets

Page 36: Максим Лапшин — введение в Erlang

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

Page 37: Максим Лапшин — введение в Erlang

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

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

Page 38: Максим Лапшин — введение в Erlang

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

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

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

Page 39: Максим Лапшин — введение в Erlang

Отладка

Page 40: Максим Лапшин — введение в Erlang

Отладка1. printf2. trace3. process_info4. recon

Page 41: Максим Лапшин — введение в Erlang

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

Page 42: Максим Лапшин — введение в Erlang

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

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

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

Page 43: Максим Лапшин — введение в Erlang

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

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

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

Page 44: Максим Лапшин — введение в Erlang

recon1. Библиотека для отладки аллокаторов2. Иногда помогает покрутить ручки для

настройки их эффективности

Page 45: Максим Лапшин — введение в Erlang

Тестирование

Page 46: Максим Лапшин — введение в Erlang

Тестирование1. eunit2. common_test3. meck

Page 47: Максим Лапшин — введение в Erlang

eunit1. считается простым2. хорошие сообщения об ошибках3. нет логов4. тяжелый синтаксис конфигурации

Page 48: Максим Лапшин — введение в Erlang

common_test1. умеет делать HTML логи2. похуже сообщения об ошибках3. умеет быть распределенным

Page 49: Максим Лапшин — введение в Erlang

meck1. Временное перекрытие функций2. очень медленно3. лучше избегать4. иногда очень полезно

Page 50: Максим Лапшин — введение в Erlang

Полезные инструменты

Page 51: Максим Лапшин — введение в Erlang

Полезные инструменты1. инфраструктура (rebar)2. веб-сервер (cowboy)3. логи (lager)4. json (jsx, jiffy)5. http-клиент (lhttpc)

Page 52: Максим Лапшин — введение в Erlang

Вопросы?

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