Upload
max-lapshin
View
310
Download
3
Embed Size (px)
DESCRIPTION
Небольшой доклад про то, зачем нужен Erlang
Citation preview
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
Pattern-matching
content(8) -> audio; content(9) -> video; content(18) -> metadata.
Массивы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
Псевдо-методы
handle_call(balance, _, State) -> {reply, State#s.balance, State};….
BEAM1. Одна из 4-х платформ с многоядерностью2. Epoll/kqueue3. Собственные аллокаторы
Multicore1. Процессы расползаются по ядрам2. Обмен сообщениями с минимум локов3. Нет шаринга данных — нет мьютексов4. Работает на 72 ядрах5. Черная магия мьютексов в ETS
Приложения на Erlang
Erlang OTP1. Фреймворк на Erlang2. Сообщения и процессы — это примитивы3. Реализация ряда паттернов на базе
процессов4. Обеспечение гарантированной
работоспособности в рамках паттернов
supervisor1. Процесс, следящий за другими2. Поддерживает синхронно группу
процессов3. Реализует паттерн «выключателя» для
заглючившей системы4. Выключается, если слишком часто всё
ломается
Поток данных1. Вызовы методов — сообщения2. Сообщения — память3. Бутылочное горлышко — утечка памяти4. Надо контролировать входную скорость5. Развязывать бутылочные горлышки
Flow control1. Бесконтрольная посылка сообщений —
зло2. gen_server:call помогает3. process_info(Pid, message_queue_len)
Пулы воркеров1. Вместо одного процесса можно поставить
8 или 162. Шардирование по воркерам помогает
распределению по ядрам
Отладка
Отладка1. printf2. trace (debugger)3. process_info
Печать1. io:format — это плохо2. логгирование с lager — хорошо3. уровни журналирования, метадата
trace1. Мониторинг всех сообщений, вызовов
функций и событий процесса2. Лучше чем gdb, потому что локален для
одного процесса
process_info1. Неинвазивный способ мониторинга
процесса снаружи2. Интроспекция стека, состояния,
потребления памяти и CPU
Вопросы?
Макс Лапшин[email protected]