SlideShare a Scribd company logo
1 of 52
Download to read offline
Erlang
Макс Лапшин
Эрливидео
max@erlyvideo.ru
Что такое Erlang?
1. Язык программирования
2. Виртуальная машина
3. Фреймворк для создания сетевых
сервисов
Откуда взялся Erlang?
1. Более 20 лет эксплуатации
2. Создан и развивается в Ericsson
3. Проектировался инженерами, которые
любят спать по ночам
4. Unix среди DOS в мире VM
Для чего нужен Erlang?
1. Разработка долгоживущих сетевых
серверных приложений с высокой ценой
простоя
2. Построение систем с изолированными
компонентами
3. Безболезненное масштабирование по
ядрам и компьютерам
Когда нужен Erlang?
1. большой поток данных
2. массовый сетевой и дисковый I/O
3. много состояний в памяти
4. разделяемые ресурсы
5. большое время жизни данных
6. multicore и multinode
Почему не Java?
1. Erlang гораздо проще, чем Java
2. Легче создать стабильную систему
(правильное управление ошибками)
3. Упрощенное управление ресурсами
4. Сильная ориентированность на сетевой
ввод-вывод и подключенных клиентов
Опыт эксплуатации
1. Гораздо дешевле разрабатывать софт
2. Быстро искать и переучивать людей
3. Легко поддерживать
4. Быстрая реализация VM
5. В несколько раз меньше кода
Введение
Введение в Erlang
1. Как хранятся данные?
2. Как их обрабатывать?
3. Как группировать логику?
4. Как обрабатывать ошибки?
5. Ввод-вывод
6. Виртуальная машина
Типы данных
1. Числа
2. Атомы
3. Блобы (binary)
4. Reference
5. Функции
6. Порты
7. Пиды
8. Кортежи (tuple)
9. Хеш-таблицы (map)
10. Списки
Немутабельность
1. Переменных нет, есть только значения
2. Композитные структуры create once
3. Невозможно создать ссылочную петлю
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:pwrite
2. gen_tcp:connect, send, recv
3. gen_tcp:listen, accept
Pattern-matching
1. Перебор разных веток кода подходящих
по значению
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/O
2. Асинхронная посылка сообщений по Pid
3. Глобальная регистрация Pid по atom
4. Блокирующее получение с таймаутом
5. Оповещение о смерти другого процесса
Ошибки в процессах
1. Изоляция данных и исполнения
2. Изоляция ошибок и проблем
3. Автоматический контроль за ресурсами
4. Оповещение соседей о смерти
5. Автоприбивание соседей
Объекты на процессах
1. Обмен сообщенями вместо вызова метода
2. Pid вместо ссылки
3. Глобальные переменные через register
4. Внутреннее состояние скрыто
5. Нереентерабельны
6. Сериализованный вызов методов
gen_server
1. Реализация generic объекта на процессах
и сообщениях
2. Сериализованные и синхронизированные
вызовы методов
3. Горячее обновление кода
4. Откладываемый ответ на вызов метода
5. Конструкторы, деструкторы
6. Автоматический контроль дедлоков
Псевдо-методы
1. Отдельный клоз handle_call — вызов
метода
2. Есть асинхронные методы: handle_info
BEAM
1. Одна из 4-х платформ с многоядерностью
2. Epoll/kqueue
3. Собственные аллокаторы
Multicore
1. Процессы расползаются по ядрам
2. Обмен сообщениями с минимум локов
3. Нет шаринга данных — нет мьютексов
4. Работает на 72 ядрах
5. Черная магия мьютексов в ETS
Приложения на Erlang
Приложения на Erlang
1. Erlang OTP
2. supervisor
3. application
4. ets
5. потоки данных
6. многоядерность
Erlang OTP
1. Фреймворк на Erlang
2. Сообщения и процессы — это примитивы
3. Реализация ряда паттернов на базе
процессов
4. Обеспечение гарантированной
работоспособности в рамках паттернов
supervisor
1. Процесс, следящий за другими
2. Поддерживает синхронно группу
процессов
3. Реализует паттерн «выключателя» для
заглючившей системы
4. Выключается, если слишком часто всё
ломается
application
1. В простонародье «библиотека»
2. Но со своими тредами — процессами
3. Со своим пулом данных в памяти
gen_event
1. Процесс, в который можно положить
коллбеки
2. Коллбеки с состояниями
3. Годится прежде всего для логов
Как хранить данные?
1. В процессах
2. На диске
3. В сети
4. В БД в памяти (ets)
ETS
1. Глобальное хранилище кортежей
2. Очень хорошо оптимизировано
3. Пользоваться только как хеш-таблицей
4. Вторичные индексы через mnesia
5. Легко можно свалиться в race conditions
6. Писать через процесс (*), читать через ets
Поток данных
1. Вызовы методов — сообщения
2. Сообщения — память
3. Бутылочное горлышко — утечка памяти
4. Надо контролировать входную скорость
5. Развязывать бутылочные горлышки
Flow control
1. Бесконтрольная посылка сообщений —
зло
2. gen_server:call помогает
3. process_info(Pid, message_queue_len)
Пулы воркеров
1. Вместо одного процесса можно поставить
8 или 16
2. Шардирование по воркерам помогает
распределению по ядрам
Отладка
Отладка
1. printf
2. trace
3. process_info
4. recon
Печать
1. io:format — это плохо
2. логгирование с lager — хорошо
3. уровни журналирования, метадата
trace
1. Мониторинг всех сообщений, вызовов
функций и событий процесса
2. Лучше чем gdb, потому что локален для
одного процесса
process_info
1. Неинвазивный способ мониторинга
процесса снаружи
2. Интроспекция стека, состояния,
потребления памяти и CPU
recon
1. Библиотека для отладки аллокаторов
2. Иногда помогает покрутить ручки для
настройки их эффективности
Тестирование
Тестирование
1. eunit
2. common_test
3. meck
eunit
1. считается простым
2. хорошие сообщения об ошибках
3. нет логов
4. тяжелый синтаксис конфигурации
common_test
1. умеет делать HTML логи
2. похуже сообщения об ошибках
3. умеет быть распределенным
meck
1. Временное перекрытие функций
2. очень медленно
3. лучше избегать
4. иногда очень полезно
Полезные инструменты
Полезные инструменты
1. инфраструктура (rebar)
2. веб-сервер (cowboy)
3. логи (lager)
4. json (jsx, jiffy)
5. http-клиент (lhttpc)
Вопросы?
Макс Лапшин
max@erlyvideo.ru

More Related Content

What's hot

Алексей Туля - А нужен ли вам erlang?
Алексей Туля - А нужен ли вам erlang?Алексей Туля - А нужен ли вам erlang?
Алексей Туля - А нужен ли вам erlang?Minsk Linux User Group
 
ELK: менеджмент логов, быстрая локализация проблем / Сергей Шумов (News360)
ELK: менеджмент логов, быстрая локализация проблем / Сергей Шумов (News360)ELK: менеджмент логов, быстрая локализация проблем / Сергей Шумов (News360)
ELK: менеджмент логов, быстрая локализация проблем / Сергей Шумов (News360)Ontico
 
Там, где Rails не справляются
Там, где Rails не справляютсяТам, где Rails не справляются
Там, где Rails не справляютсяMax Lapshin
 
Erlang, который мы потеряли
Erlang, который мы потерялиErlang, который мы потеряли
Erlang, который мы потерялиIvan Grishaev
 
Максим Лапшин. Erlang production
Максим Лапшин. Erlang productionМаксим Лапшин. Erlang production
Максим Лапшин. Erlang productionAlina Dolgikh
 
что и почему вы должны программировать на Erlang.максим лапшин. зал 4
что и почему вы должны программировать на Erlang.максим лапшин. зал 4что и почему вы должны программировать на Erlang.максим лапшин. зал 4
что и почему вы должны программировать на Erlang.максим лапшин. зал 4rit2011
 
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest
 
Константин Осипов
Константин ОсиповКонстантин Осипов
Константин ОсиповCodeFest
 
Алексей Федоров
Алексей ФедоровАлексей Федоров
Алексей ФедоровCodeFest
 
SECON'2016. Тюменцев Евгений, Разработка надежных параллельных, распределенны...
SECON'2016. Тюменцев Евгений, Разработка надежных параллельных, распределенны...SECON'2016. Тюменцев Евгений, Разработка надежных параллельных, распределенны...
SECON'2016. Тюменцев Евгений, Разработка надежных параллельных, распределенны...SECON
 
DUMP-2015: «DevOps-практики в разработке решений для бизнеса» Максим Пашук, 2...
DUMP-2015: «DevOps-практики в разработке решений для бизнеса» Максим Пашук, 2...DUMP-2015: «DevOps-практики в разработке решений для бизнеса» Максим Пашук, 2...
DUMP-2015: «DevOps-практики в разработке решений для бизнеса» Максим Пашук, 2...it-people
 
Как устроен мониторинг в Badoo
Как устроен мониторинг в BadooКак устроен мониторинг в Badoo
Как устроен мониторинг в BadooUptime Community
 
SECON'2016. Васильков Василий, Серверное программирование сегодня
SECON'2016. Васильков Василий, Серверное программирование сегодняSECON'2016. Васильков Василий, Серверное программирование сегодня
SECON'2016. Васильков Василий, Серверное программирование сегодняSECON
 
Олег Бартунов и Иван Панченко
Олег Бартунов и Иван ПанченкоОлег Бартунов и Иван Панченко
Олег Бартунов и Иван ПанченкоCodeFest
 
libfpta — обгоняя SQLite и Tarantool / Леонид Юрьев (Positive Technologies)
libfpta — обгоняя SQLite и Tarantool / Леонид Юрьев (Positive Technologies)libfpta — обгоняя SQLite и Tarantool / Леонид Юрьев (Positive Technologies)
libfpta — обгоняя SQLite и Tarantool / Леонид Юрьев (Positive Technologies)Ontico
 
Алексей Иванкин: Highload + PHP
Алексей Иванкин: Highload + PHPАлексей Иванкин: Highload + PHP
Алексей Иванкин: Highload + PHPOleg Poludnenko
 
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)Ontico
 

What's hot (19)

Алексей Туля - А нужен ли вам erlang?
Алексей Туля - А нужен ли вам erlang?Алексей Туля - А нужен ли вам erlang?
Алексей Туля - А нужен ли вам erlang?
 
ELK: менеджмент логов, быстрая локализация проблем / Сергей Шумов (News360)
ELK: менеджмент логов, быстрая локализация проблем / Сергей Шумов (News360)ELK: менеджмент логов, быстрая локализация проблем / Сергей Шумов (News360)
ELK: менеджмент логов, быстрая локализация проблем / Сергей Шумов (News360)
 
Там, где Rails не справляются
Там, где Rails не справляютсяТам, где Rails не справляются
Там, где Rails не справляются
 
Erlang, который мы потеряли
Erlang, который мы потерялиErlang, который мы потеряли
Erlang, который мы потеряли
 
Erlang ruby
Erlang rubyErlang ruby
Erlang ruby
 
Sivko
SivkoSivko
Sivko
 
Максим Лапшин. Erlang production
Максим Лапшин. Erlang productionМаксим Лапшин. Erlang production
Максим Лапшин. Erlang production
 
что и почему вы должны программировать на Erlang.максим лапшин. зал 4
что и почему вы должны программировать на Erlang.максим лапшин. зал 4что и почему вы должны программировать на Erlang.максим лапшин. зал 4
что и почему вы должны программировать на Erlang.максим лапшин. зал 4
 
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
 
Константин Осипов
Константин ОсиповКонстантин Осипов
Константин Осипов
 
Алексей Федоров
Алексей ФедоровАлексей Федоров
Алексей Федоров
 
SECON'2016. Тюменцев Евгений, Разработка надежных параллельных, распределенны...
SECON'2016. Тюменцев Евгений, Разработка надежных параллельных, распределенны...SECON'2016. Тюменцев Евгений, Разработка надежных параллельных, распределенны...
SECON'2016. Тюменцев Евгений, Разработка надежных параллельных, распределенны...
 
DUMP-2015: «DevOps-практики в разработке решений для бизнеса» Максим Пашук, 2...
DUMP-2015: «DevOps-практики в разработке решений для бизнеса» Максим Пашук, 2...DUMP-2015: «DevOps-практики в разработке решений для бизнеса» Максим Пашук, 2...
DUMP-2015: «DevOps-практики в разработке решений для бизнеса» Максим Пашук, 2...
 
Как устроен мониторинг в Badoo
Как устроен мониторинг в BadooКак устроен мониторинг в Badoo
Как устроен мониторинг в Badoo
 
SECON'2016. Васильков Василий, Серверное программирование сегодня
SECON'2016. Васильков Василий, Серверное программирование сегодняSECON'2016. Васильков Василий, Серверное программирование сегодня
SECON'2016. Васильков Василий, Серверное программирование сегодня
 
Олег Бартунов и Иван Панченко
Олег Бартунов и Иван ПанченкоОлег Бартунов и Иван Панченко
Олег Бартунов и Иван Панченко
 
libfpta — обгоняя SQLite и Tarantool / Леонид Юрьев (Positive Technologies)
libfpta — обгоняя SQLite и Tarantool / Леонид Юрьев (Positive Technologies)libfpta — обгоняя SQLite и Tarantool / Леонид Юрьев (Positive Technologies)
libfpta — обгоняя SQLite и Tarantool / Леонид Юрьев (Positive Technologies)
 
Алексей Иванкин: Highload + PHP
Алексей Иванкин: Highload + PHPАлексей Иванкин: Highload + PHP
Алексей Иванкин: Highload + PHP
 
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
 

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

Distributed erlang
Distributed erlangDistributed erlang
Distributed erlangYuri Zhloba
 
Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
 Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo) Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)Ontico
 
Multiprocessor Programming Intro (lecture 1)
Multiprocessor Programming Intro (lecture 1)Multiprocessor Programming Intro (lecture 1)
Multiprocessor Programming Intro (lecture 1)Dmitry Tsitelov
 
Фёдор Строк - Базы данных - SQL, ORM, NoSQL
Фёдор Строк - Базы данных - SQL, ORM, NoSQLФёдор Строк - Базы данных - SQL, ORM, NoSQL
Фёдор Строк - Базы данных - SQL, ORM, NoSQLYandex
 
Функциональный язык программирования Erlang
Функциональный язык программирования ErlangФункциональный язык программирования Erlang
Функциональный язык программирования ErlangЮрий Королюк
 
Sequence prediction with TensorFlow
Sequence prediction with TensorFlowSequence prediction with TensorFlow
Sequence prediction with TensorFlowDenis Dus
 
Introduction to MongoDB
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDBIurii Ogiienko
 
Гатиятов Руслан, технический директор ООО “Дроид Лабс”: “Система управления п...
Гатиятов Руслан, технический директор ООО “Дроид Лабс”: “Система управления п...Гатиятов Руслан, технический директор ООО “Дроид Лабс”: “Система управления п...
Гатиятов Руслан, технический директор ООО “Дроид Лабс”: “Система управления п...Provectus
 
Оптимизация программ для современных процессоров и Linux, Александр Крижановс...
Оптимизация программ для современных процессоров и Linux, Александр Крижановс...Оптимизация программ для современных процессоров и Linux, Александр Крижановс...
Оптимизация программ для современных процессоров и Linux, Александр Крижановс...Ontico
 
AVITO. Решардинг Redis без даунтайма. DevConf 2012
AVITO. Решардинг Redis без даунтайма. DevConf 2012AVITO. Решардинг Redis без даунтайма. DevConf 2012
AVITO. Решардинг Redis без даунтайма. DevConf 2012Roman Pavlushko
 
Другая виртуализация
Другая виртуализацияДругая виртуализация
Другая виртуализацияYandex
 
Процессы и потоки
Процессы и потокиПроцессы и потоки
Процессы и потокиEvgeniy Mironov
 
Введение в курс ОС
Введение в курс ОСВведение в курс ОС
Введение в курс ОСEvgeniy Mironov
 
Память в Java. Garbage Collector
Память в Java. Garbage CollectorПамять в Java. Garbage Collector
Память в Java. Garbage CollectorOlexandra Dmytrenko
 
Excelsior JET в действии
Excelsior JET в действииExcelsior JET в действии
Excelsior JET в действииNikita Lipsky
 
Apache Kafka Cluster - Russian
Apache Kafka Cluster - RussianApache Kafka Cluster - Russian
Apache Kafka Cluster - Russianconfluent
 
Redis: возможности, выгоды, примеры использования
Redis: возможности, выгоды, примеры использованияRedis: возможности, выгоды, примеры использования
Redis: возможности, выгоды, примеры использованияAlexey Kachayev
 
Конференция Highload++ 2014, "Инструменты высоконагруженных проектов: кеширов...
Конференция Highload++ 2014, "Инструменты высоконагруженных проектов: кеширов...Конференция Highload++ 2014, "Инструменты высоконагруженных проектов: кеширов...
Конференция Highload++ 2014, "Инструменты высоконагруженных проектов: кеширов...Lenvendo
 

Similar to Максим Лапшин — введение в Erlang (20)

Distributed erlang
Distributed erlangDistributed erlang
Distributed erlang
 
Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
 Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo) Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
Отладка производительности приложения на Erlang / Максим Лапшин (Erlyvideo)
 
Multiprocessor Programming Intro (lecture 1)
Multiprocessor Programming Intro (lecture 1)Multiprocessor Programming Intro (lecture 1)
Multiprocessor Programming Intro (lecture 1)
 
Фёдор Строк - Базы данных - SQL, ORM, NoSQL
Фёдор Строк - Базы данных - SQL, ORM, NoSQLФёдор Строк - Базы данных - SQL, ORM, NoSQL
Фёдор Строк - Базы данных - SQL, ORM, NoSQL
 
Функциональный язык программирования Erlang
Функциональный язык программирования ErlangФункциональный язык программирования Erlang
Функциональный язык программирования Erlang
 
Sequence prediction with TensorFlow
Sequence prediction with TensorFlowSequence prediction with TensorFlow
Sequence prediction with TensorFlow
 
Introduction to MongoDB
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDB
 
Гатиятов Руслан, технический директор ООО “Дроид Лабс”: “Система управления п...
Гатиятов Руслан, технический директор ООО “Дроид Лабс”: “Система управления п...Гатиятов Руслан, технический директор ООО “Дроид Лабс”: “Система управления п...
Гатиятов Руслан, технический директор ООО “Дроид Лабс”: “Система управления п...
 
Оптимизация программ для современных процессоров и Linux, Александр Крижановс...
Оптимизация программ для современных процессоров и Linux, Александр Крижановс...Оптимизация программ для современных процессоров и Linux, Александр Крижановс...
Оптимизация программ для современных процессоров и Linux, Александр Крижановс...
 
AVITO. Решардинг Redis без даунтайма. DevConf 2012
AVITO. Решардинг Redis без даунтайма. DevConf 2012AVITO. Решардинг Redis без даунтайма. DevConf 2012
AVITO. Решардинг Redis без даунтайма. DevConf 2012
 
Excel in Javascript
Excel in JavascriptExcel in Javascript
Excel in Javascript
 
Другая виртуализация
Другая виртуализацияДругая виртуализация
Другая виртуализация
 
45695
4569545695
45695
 
Процессы и потоки
Процессы и потокиПроцессы и потоки
Процессы и потоки
 
Введение в курс ОС
Введение в курс ОСВведение в курс ОС
Введение в курс ОС
 
Память в Java. Garbage Collector
Память в Java. Garbage CollectorПамять в Java. Garbage Collector
Память в Java. Garbage Collector
 
Excelsior JET в действии
Excelsior JET в действииExcelsior JET в действии
Excelsior JET в действии
 
Apache Kafka Cluster - Russian
Apache Kafka Cluster - RussianApache Kafka Cluster - Russian
Apache Kafka Cluster - Russian
 
Redis: возможности, выгоды, примеры использования
Redis: возможности, выгоды, примеры использованияRedis: возможности, выгоды, примеры использования
Redis: возможности, выгоды, примеры использования
 
Конференция Highload++ 2014, "Инструменты высоконагруженных проектов: кеширов...
Конференция Highload++ 2014, "Инструменты высоконагруженных проектов: кеширов...Конференция Highload++ 2014, "Инструменты высоконагруженных проектов: кеширов...
Конференция Highload++ 2014, "Инструменты высоконагруженных проектов: кеширов...
 

More from Александр Ежов

Борьба с багами: RailsClub на DevConf 2015
Борьба с багами: RailsClub на DevConf 2015Борьба с багами: RailsClub на DevConf 2015
Борьба с багами: RailsClub на DevConf 2015Александр Ежов
 
Rubt on Rails: 1000 запросов в секунду
Rubt on Rails: 1000 запросов в секундуRubt on Rails: 1000 запросов в секунду
Rubt on Rails: 1000 запросов в секундуАлександр Ежов
 
Liquor, Liquid и другие безопасные языки разметки в RoR
Liquor, Liquid и другие безопасные языки разметки в RoRLiquor, Liquid и другие безопасные языки разметки в RoR
Liquor, Liquid и другие безопасные языки разметки в RoRАлександр Ежов
 
Антикризисная презентация
Антикризисная презентацияАнтикризисная презентация
Антикризисная презентацияАлександр Ежов
 
Eventmachine: структура evented-приложений
Eventmachine: структура evented-приложенийEventmachine: структура evented-приложений
Eventmachine: структура evented-приложенийАлександр Ежов
 
Обзорное сравнение серверов приложений для Rails
Обзорное сравнение серверов приложений для RailsОбзорное сравнение серверов приложений для Rails
Обзорное сравнение серверов приложений для RailsАлександр Ежов
 
Использования PgQ и Londste в rails-приложении
Использования PgQ и Londste в rails-приложенииИспользования PgQ и Londste в rails-приложении
Использования PgQ и Londste в rails-приложенииАлександр Ежов
 
Интернационализация и локализация Ruby on Rails. gem russian
Интернационализация и локализация Ruby on Rails. gem russianИнтернационализация и локализация Ruby on Rails. gem russian
Интернационализация и локализация Ruby on Rails. gem russianАлександр Ежов
 

More from Александр Ежов (20)

Кеширование данных в БД
Кеширование данных в БДКеширование данных в БД
Кеширование данных в БД
 
Борьба с багами: RailsClub на DevConf 2015
Борьба с багами: RailsClub на DevConf 2015Борьба с багами: RailsClub на DevConf 2015
Борьба с багами: RailsClub на DevConf 2015
 
Rails 5: awesome features and breaking changes
Rails 5: awesome features and breaking changesRails 5: awesome features and breaking changes
Rails 5: awesome features and breaking changes
 
Big Data и Ruby
Big Data и RubyBig Data и Ruby
Big Data и Ruby
 
Abstract machines for great good
Abstract machines for great goodAbstract machines for great good
Abstract machines for great good
 
Rubt on Rails: 1000 запросов в секунду
Rubt on Rails: 1000 запросов в секундуRubt on Rails: 1000 запросов в секунду
Rubt on Rails: 1000 запросов в секунду
 
Liquor, Liquid и другие безопасные языки разметки в RoR
Liquor, Liquid и другие безопасные языки разметки в RoRLiquor, Liquid и другие безопасные языки разметки в RoR
Liquor, Liquid и другие безопасные языки разметки в RoR
 
Vim or die
Vim or dieVim or die
Vim or die
 
Capistrano Rails
Capistrano RailsCapistrano Rails
Capistrano Rails
 
Умное кэширование в Rails
Умное кэширование в RailsУмное кэширование в Rails
Умное кэширование в Rails
 
Sphinx как база данных
Sphinx как база данныхSphinx как база данных
Sphinx как база данных
 
Emacs и Rails
Emacs и RailsEmacs и Rails
Emacs и Rails
 
Антикризисная презентация
Антикризисная презентацияАнтикризисная презентация
Антикризисная презентация
 
Eventmachine: структура evented-приложений
Eventmachine: структура evented-приложенийEventmachine: структура evented-приложений
Eventmachine: структура evented-приложений
 
Дэдлоки
ДэдлокиДэдлоки
Дэдлоки
 
Обзорное сравнение серверов приложений для Rails
Обзорное сравнение серверов приложений для RailsОбзорное сравнение серверов приложений для Rails
Обзорное сравнение серверов приложений для Rails
 
Приложения в плагинах
Приложения в плагинахПриложения в плагинах
Приложения в плагинах
 
Использования PgQ и Londste в rails-приложении
Использования PgQ и Londste в rails-приложенииИспользования PgQ и Londste в rails-приложении
Использования PgQ и Londste в rails-приложении
 
Масштабирование в Rails
Масштабирование в RailsМасштабирование в Rails
Масштабирование в Rails
 
Интернационализация и локализация Ruby on Rails. gem russian
Интернационализация и локализация Ruby on Rails. gem russianИнтернационализация и локализация Ruby on Rails. gem russian
Интернационализация и локализация Ruby on Rails. gem russian
 

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

  • 2. Что такое Erlang? 1. Язык программирования 2. Виртуальная машина 3. Фреймворк для создания сетевых сервисов
  • 3. Откуда взялся Erlang? 1. Более 20 лет эксплуатации 2. Создан и развивается в Ericsson 3. Проектировался инженерами, которые любят спать по ночам 4. Unix среди DOS в мире VM
  • 4. Для чего нужен Erlang? 1. Разработка долгоживущих сетевых серверных приложений с высокой ценой простоя 2. Построение систем с изолированными компонентами 3. Безболезненное масштабирование по ядрам и компьютерам
  • 5. Когда нужен Erlang? 1. большой поток данных 2. массовый сетевой и дисковый I/O 3. много состояний в памяти 4. разделяемые ресурсы 5. большое время жизни данных 6. multicore и multinode
  • 6. Почему не Java? 1. Erlang гораздо проще, чем Java 2. Легче создать стабильную систему (правильное управление ошибками) 3. Упрощенное управление ресурсами 4. Сильная ориентированность на сетевой ввод-вывод и подключенных клиентов
  • 7. Опыт эксплуатации 1. Гораздо дешевле разрабатывать софт 2. Быстро искать и переучивать людей 3. Легко поддерживать 4. Быстрая реализация VM 5. В несколько раз меньше кода
  • 9. Введение в Erlang 1. Как хранятся данные? 2. Как их обрабатывать? 3. Как группировать логику? 4. Как обрабатывать ошибки? 5. Ввод-вывод 6. Виртуальная машина
  • 10. Типы данных 1. Числа 2. Атомы 3. Блобы (binary) 4. Reference 5. Функции 6. Порты 7. Пиды 8. Кортежи (tuple) 9. Хеш-таблицы (map) 10. Списки
  • 11. Немутабельность 1. Переменных нет, есть только значения 2. Композитные структуры create once 3. Невозможно создать ссылочную петлю 4. Сравнение только по значению 5. Массивы с O(N) обновлением и не нужны 6. Хитрая реализация мутабельного состояния (ниже)
  • 12. Функции 1. Код есть только в функциях 2. Вне функций кода нет 3. Функции определяются именем и количеством аргументов 4. Значений по-умолчанию нет 5. Есть разные тела одной функции (клозы) 6. Рекурсия вместо цикла
  • 13. Модули 1. Модуль — группа функций 2. Функций вне модуля нет 3. Анонимные функции привязаны к модулю 4. Единица горячей замены кода 5. Компилируются в байткод. JIT не работает
  • 14. Обработка данных 1. Ввод-вывод данных 2. Управляющие конструкции 3. Обработка массива данных 4. Структуры данных 5. Изменение данных
  • 15. Ввод-вывод данных 1. file:open, file:pread, file:pwrite 2. gen_tcp:connect, send, recv 3. gen_tcp:listen, accept
  • 16. Pattern-matching 1. Перебор разных веток кода подходящих по значению 2. Это вместо ООП: классификация данных не глобальная, а локальная 3. Автоматическая деструктуризация данных 4. Вместо if
  • 17. Массивы 1. Список — основной контейнер 2. for(i = 0) не используется 3. Рекурсивный перебор списков в различных вариантах 4. map, fold, mapfoldl, flatmap, partition… 5. Кортежи фиксированной длины, но O(1)
  • 18. Структуры данных 1. Immutable версии структур 2. Композиция из списков и кортежей 3. dict, set, graph, array и т.п. 4. Используются не очень часто
  • 19. Мутация данных 1. Все значения неизменяемые 2. Все значения обрабатываются в функциях 3. Надо получить из функции новое значение и отдать его дальше 4. Рекурсия вместо бесконечного цикла 5. Аргумент функции как эксплицитное состояние
  • 20. Процесс 1. Рекурсивно зацикленная функция — это процесс 2. Её состояние снаружи ненаблюдаемо 3. Процессы порождаются отстреливанием новой функции 4. Pid — идентификатор процесса 5. Всё как в Unix
  • 21. Коммуникация процессов 1. Обмен только через сообщения и I/O 2. Асинхронная посылка сообщений по Pid 3. Глобальная регистрация Pid по atom 4. Блокирующее получение с таймаутом 5. Оповещение о смерти другого процесса
  • 22. Ошибки в процессах 1. Изоляция данных и исполнения 2. Изоляция ошибок и проблем 3. Автоматический контроль за ресурсами 4. Оповещение соседей о смерти 5. Автоприбивание соседей
  • 23. Объекты на процессах 1. Обмен сообщенями вместо вызова метода 2. Pid вместо ссылки 3. Глобальные переменные через register 4. Внутреннее состояние скрыто 5. Нереентерабельны 6. Сериализованный вызов методов
  • 24. gen_server 1. Реализация generic объекта на процессах и сообщениях 2. Сериализованные и синхронизированные вызовы методов 3. Горячее обновление кода 4. Откладываемый ответ на вызов метода 5. Конструкторы, деструкторы 6. Автоматический контроль дедлоков
  • 25. Псевдо-методы 1. Отдельный клоз handle_call — вызов метода 2. Есть асинхронные методы: handle_info
  • 26. BEAM 1. Одна из 4-х платформ с многоядерностью 2. Epoll/kqueue 3. Собственные аллокаторы
  • 27. Multicore 1. Процессы расползаются по ядрам 2. Обмен сообщениями с минимум локов 3. Нет шаринга данных — нет мьютексов 4. Работает на 72 ядрах 5. Черная магия мьютексов в ETS
  • 29. Приложения на Erlang 1. Erlang OTP 2. supervisor 3. application 4. ets 5. потоки данных 6. многоядерность
  • 30. Erlang OTP 1. Фреймворк на Erlang 2. Сообщения и процессы — это примитивы 3. Реализация ряда паттернов на базе процессов 4. Обеспечение гарантированной работоспособности в рамках паттернов
  • 31. supervisor 1. Процесс, следящий за другими 2. Поддерживает синхронно группу процессов 3. Реализует паттерн «выключателя» для заглючившей системы 4. Выключается, если слишком часто всё ломается
  • 32. application 1. В простонародье «библиотека» 2. Но со своими тредами — процессами 3. Со своим пулом данных в памяти
  • 33. gen_event 1. Процесс, в который можно положить коллбеки 2. Коллбеки с состояниями 3. Годится прежде всего для логов
  • 34. Как хранить данные? 1. В процессах 2. На диске 3. В сети 4. В БД в памяти (ets)
  • 35. ETS 1. Глобальное хранилище кортежей 2. Очень хорошо оптимизировано 3. Пользоваться только как хеш-таблицей 4. Вторичные индексы через mnesia 5. Легко можно свалиться в race conditions 6. Писать через процесс (*), читать через ets
  • 36. Поток данных 1. Вызовы методов — сообщения 2. Сообщения — память 3. Бутылочное горлышко — утечка памяти 4. Надо контролировать входную скорость 5. Развязывать бутылочные горлышки
  • 37. Flow control 1. Бесконтрольная посылка сообщений — зло 2. gen_server:call помогает 3. process_info(Pid, message_queue_len)
  • 38. Пулы воркеров 1. Вместо одного процесса можно поставить 8 или 16 2. Шардирование по воркерам помогает распределению по ядрам
  • 40. Отладка 1. printf 2. trace 3. process_info 4. recon
  • 41. Печать 1. io:format — это плохо 2. логгирование с lager — хорошо 3. уровни журналирования, метадата
  • 42. trace 1. Мониторинг всех сообщений, вызовов функций и событий процесса 2. Лучше чем gdb, потому что локален для одного процесса
  • 43. process_info 1. Неинвазивный способ мониторинга процесса снаружи 2. Интроспекция стека, состояния, потребления памяти и CPU
  • 44. recon 1. Библиотека для отладки аллокаторов 2. Иногда помогает покрутить ручки для настройки их эффективности
  • 47. eunit 1. считается простым 2. хорошие сообщения об ошибках 3. нет логов 4. тяжелый синтаксис конфигурации
  • 48. common_test 1. умеет делать HTML логи 2. похуже сообщения об ошибках 3. умеет быть распределенным
  • 49. meck 1. Временное перекрытие функций 2. очень медленно 3. лучше избегать 4. иногда очень полезно
  • 51. Полезные инструменты 1. инфраструктура (rebar) 2. веб-сервер (cowboy) 3. логи (lager) 4. json (jsx, jiffy) 5. http-клиент (lhttpc)