Upload
max-lapshin
View
313
Download
3
Embed Size (px)
DESCRIPTION
Небольшой доклад про то, зачем нужен Erlang
Citation preview
Что такое 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