что и почему вы должны программировать на Erlang.максим лапшин. зал 4
Максим Лапшин — введение в Erlang
-
Upload
- -
Category
Data & Analytics
-
view
270 -
download
3
Transcript of Максим Лапшин — введение в Erlang
ErlangМакс Лапшин
Эрливидео[email protected]
Что такое Erlang?1. Язык программирования2. Виртуальная машина3. Фреймворк для создания сетевых
сервисов
Откуда взялся Erlang?1. Более 20 лет эксплуатации2. Создан и развивается в Ericsson3. Проектировался инженерами, которые
любят спать по ночам4. Unix среди DOS в мире VM
Для чего нужен Erlang?1. Разработка долгоживущих сетевых
серверных приложений с высокой ценой простоя
2. Построение систем с изолированными компонентами
3. Безболезненное масштабирование по ядрам и компьютерам
Когда нужен Erlang?1. большой поток данных2. массовый сетевой и дисковый I/O3. много состояний в памяти4. разделяемые ресурсы5. большое время жизни данных6. multicore и multinode
Почему не Java?1. Erlang гораздо проще, чем Java2. Легче создать стабильную систему
(правильное управление ошибками)3. Упрощенное управление ресурсами4. Сильная ориентированность на сетевой
ввод-вывод и подключенных клиентов
Опыт эксплуатации1. Гораздо дешевле разрабатывать софт2. Быстро искать и переучивать людей3. Легко поддерживать4. Быстрая реализация VM5. В несколько раз меньше кода
Введение
Введение в Erlang1. Как хранятся данные?2. Как их обрабатывать?3. Как группировать логику?4. Как обрабатывать ошибки?5. Ввод-вывод6. Виртуальная машина
Типы данных1. Числа2. Атомы3. Блобы (binary)4. Reference5. Функции6. Порты7. Пиды8. Кортежи (tuple)9. Хеш-таблицы (map)
10. Списки
Немутабельность1. Переменных нет, есть только значения2. Композитные структуры create once3. Невозможно создать ссылочную петлю4. Сравнение только по значению5. Массивы с O(N) обновлением и не нужны6. Хитрая реализация мутабельного
состояния (ниже)
Функции1. Код есть только в функциях2. Вне функций кода нет3. Функции определяются именем и
количеством аргументов4. Значений по-умолчанию нет5. Есть разные тела одной функции (клозы)6. Рекурсия вместо цикла
Модули1. Модуль — группа функций2. Функций вне модуля нет3. Анонимные функции привязаны к
модулю4. Единица горячей замены кода5. Компилируются в байткод. JIT не
работает
Обработка данных1. Ввод-вывод данных2. Управляющие конструкции3. Обработка массива данных4. Структуры данных5. Изменение данных
Ввод-вывод данных1. file:open, file:pread, file:pwrite2. gen_tcp:connect, send, recv3. gen_tcp:listen, accept
Pattern-matching1. Перебор разных веток кода подходящих
по значению2. Это вместо ООП: классификация данных
не глобальная, а локальная3. Автоматическая деструктуризация
данных4. Вместо if
Массивы1. Список — основной контейнер2. for(i = 0) не используется3. Рекурсивный перебор списков в
различных вариантах4. map, fold, mapfoldl, flatmap, partition…5. Кортежи фиксированной длины, но O(1)
Структуры данных1. Immutable версии структур2. Композиция из списков и кортежей3. dict, set, graph, array и т.п.4. Используются не очень часто
Мутация данных1. Все значения неизменяемые2. Все значения обрабатываются в функциях3. Надо получить из функции новое
значение и отдать его дальше4. Рекурсия вместо бесконечного цикла5. Аргумент функции как эксплицитное
состояние
Процесс1. Рекурсивно зацикленная функция — это
процесс2. Её состояние снаружи ненаблюдаемо3. Процессы порождаются отстреливанием
новой функции4. Pid — идентификатор процесса5. Всё как в Unix
Коммуникация процессов1. Обмен только через сообщения и I/O2. Асинхронная посылка сообщений по Pid3. Глобальная регистрация Pid по atom4. Блокирующее получение с таймаутом5. Оповещение о смерти другого процесса
Ошибки в процессах1. Изоляция данных и исполнения2. Изоляция ошибок и проблем3. Автоматический контроль за ресурсами4. Оповещение соседей о смерти5. Автоприбивание соседей
Объекты на процессах1. Обмен сообщенями вместо вызова метода2. Pid вместо ссылки3. Глобальные переменные через register4. Внутреннее состояние скрыто5. Нереентерабельны6. Сериализованный вызов методов
gen_server1. Реализация generic объекта на процессах
и сообщениях2. Сериализованные и синхронизированные
вызовы методов3. Горячее обновление кода4. Откладываемый ответ на вызов метода5. Конструкторы, деструкторы6. Автоматический контроль дедлоков
Псевдо-методы1. Отдельный клоз handle_call — вызов
метода2. Есть асинхронные методы: handle_info
BEAM1. Одна из 4-х платформ с многоядерностью2. Epoll/kqueue3. Собственные аллокаторы
Multicore1. Процессы расползаются по ядрам2. Обмен сообщениями с минимум локов3. Нет шаринга данных — нет мьютексов4. Работает на 72 ядрах5. Черная магия мьютексов в ETS
Приложения на Erlang
Приложения на Erlang1. Erlang OTP2. supervisor3. application4. ets5. потоки данных6. многоядерность
Erlang OTP1. Фреймворк на Erlang2. Сообщения и процессы — это примитивы3. Реализация ряда паттернов на базе
процессов4. Обеспечение гарантированной
работоспособности в рамках паттернов
supervisor1. Процесс, следящий за другими2. Поддерживает синхронно группу
процессов3. Реализует паттерн «выключателя» для
заглючившей системы4. Выключается, если слишком часто всё
ломается
application1. В простонародье «библиотека»2. Но со своими тредами — процессами3. Со своим пулом данных в памяти
gen_event1. Процесс, в который можно положить
коллбеки2. Коллбеки с состояниями3. Годится прежде всего для логов
Как хранить данные?1. В процессах2. На диске3. В сети4. В БД в памяти (ets)
ETS1. Глобальное хранилище кортежей2. Очень хорошо оптимизировано3. Пользоваться только как хеш-таблицей4. Вторичные индексы через mnesia5. Легко можно свалиться в race conditions6. Писать через процесс (*), читать через ets
Поток данных1. Вызовы методов — сообщения2. Сообщения — память3. Бутылочное горлышко — утечка памяти4. Надо контролировать входную скорость5. Развязывать бутылочные горлышки
Flow control1. Бесконтрольная посылка сообщений —
зло2. gen_server:call помогает3. process_info(Pid, message_queue_len)
Пулы воркеров1. Вместо одного процесса можно поставить
8 или 162. Шардирование по воркерам помогает
распределению по ядрам
Отладка
Отладка1. printf2. trace3. process_info4. recon
Печать1. io:format — это плохо2. логгирование с lager — хорошо3. уровни журналирования, метадата
trace1. Мониторинг всех сообщений, вызовов
функций и событий процесса2. Лучше чем gdb, потому что локален для
одного процесса
process_info1. Неинвазивный способ мониторинга
процесса снаружи2. Интроспекция стека, состояния,
потребления памяти и CPU
recon1. Библиотека для отладки аллокаторов2. Иногда помогает покрутить ручки для
настройки их эффективности
Тестирование
Тестирование1. eunit2. common_test3. meck
eunit1. считается простым2. хорошие сообщения об ошибках3. нет логов4. тяжелый синтаксис конфигурации
common_test1. умеет делать HTML логи2. похуже сообщения об ошибках3. умеет быть распределенным
meck1. Временное перекрытие функций2. очень медленно3. лучше избегать4. иногда очень полезно
Полезные инструменты
Полезные инструменты1. инфраструктура (rebar)2. веб-сервер (cowboy)3. логи (lager)4. json (jsx, jiffy)5. http-клиент (lhttpc)
Вопросы?
Макс Лапшин[email protected]