Алексей Романчук «Реактивное программирование»

190
2gis.ru @rnd2gis Реактивное программирование Алексей Романчук

description

Старые подходы к построению программных систем не так актуальны для создания современных решений. В дополнение к масштабируемости добавляются требования отзывчивости, отказоустойчивости и событийности. Пытаться работать на родном старом или посмотреть в сторону новых технологий? В своем выступлении я расскажу про концепцию reactive programming. Какие технологии реализуют концепцию и как сделать первые шаги в этом новом прекрасном мире.

Transcript of Алексей Романчук «Реактивное программирование»

2gis.ru @rnd2gis

Реактивное программированиеАлексей Романчук

2Обо мне

2Обо мне

2Обо мне

2Обо мне

2Обо мне

Для кого этот доклад

4О чем будем говорить

• Почему это актуально

4О чем будем говорить

• Почему это актуально

• Reactive Manifesto

4О чем будем говорить

• Почему это актуально

• Reactive Manifesto

• Технологии реактивного программирования

4О чем будем говорить

• Почему это актуально

• Reactive Manifesto

• Технологии реактивного программирования

• Опыт 2ГИС

4О чем будем говорить

• Почему это актуально

• Reactive Manifesto

• Технологии реактивного программирования

• Опыт 2ГИС

• С чего начать

4О чем будем говорить

Мир изменился

6

7

8

Мир сильно изменился

10Реактивное программирование

• Не про реактивные самолеты

10Реактивное программирование

• Не про реактивные самолеты

• Реакция на события

10Реактивное программирование

11Реактивное программирование

1. Реакция на пользователей

11Реактивное программирование

1. Реакция на пользователей

2. Реакция на отказы

11Реактивное программирование

1. Реакция на пользователей

2. Реакция на отказы

3. Реакция на нагрузку

11Реактивное программирование

1. Реакция на пользователей

2. Реакция на отказы

3. Реакция на нагрузку

4. Событийность

11Реактивное программирование

1. Реакция на пользователей

Пользователи хотят, чтобы все было хорошо!

14Как определить что все хорошо

• Предсказуемый результат за предсказуемое время

14Как определить что все хорошо

• Предсказуемый результат за предсказуемое время

• Система отзывчива на действия пользователя

14Как определить что все хорошо

250мс

16Как измерять отзывчивость

• Время ответа

16Как измерять отзывчивость

• Время ответа

• Под нагрузкой

16Как измерять отзывчивость

• Время ответа

• Под нагрузкой

• Квантили

16Как измерять отзывчивость

• Время ответа

• Под нагрузкой

• Квантили

• Время ответа при недоступности части систем

16Как измерять отзывчивость

17Особенности в распределенных системах

• Недоступность узла это норма

17Особенности в распределенных системах

• Недоступность узла это норма

• Максимальное время ожидания ответа

17Особенности в распределенных системах

• Недоступность узла это норма

• Максимальное время ожидания ответа

• Корректная деградация вместо полной недоступности

17Особенности в распределенных системах

2. Реакция на отказы

19Что может пойти не так

• Ошибка в своем коде

19Что может пойти не так

• Ошибка в своем коде

• Ошибка в чужом коде (сервис или ОС)

19Что может пойти не так

• Ошибка в своем коде

• Ошибка в чужом коде (сервис или ОС)

• Железо вышло из строя

19Что может пойти не так

• Ошибка в своем коде

• Ошибка в чужом коде (сервис или ОС)

• Железо вышло из строя

• Сеть вышла из строя

19Что может пойти не так

• Ошибка в своем коде

• Ошибка в чужом коде (сервис или ОС)

• Железо вышло из строя

• Сеть вышла из строя

• Эксплутаторы тоже люди

19Что может пойти не так

20Отказы

• Случатся

20Отказы

• Случатся

• Обязательно

20Отказы

• Случатся

• Обязательно

• Именно с вами

20Отказы

• Случатся

• Обязательно

• Именно с вами

• Вы должны быть готовы

20Отказы

21Как минимизировать влияние отказов

• Штатная ситуация

21Как минимизировать влияние отказов

• Штатная ситуация

• Изолированные системы

21Как минимизировать влияние отказов

• Штатная ситуация

• Изолированные системы

• Дублирование данных

21Как минимизировать влияние отказов

3. Реакция на нагрузку

Хабраэффект

24Как пережить хабраэффект

• Что сейчас?

24Как пережить хабраэффект

• Что сейчас?

• Масштабирование

24Как пережить хабраэффект

• Что сейчас?

• Масштабирование

• Нагрузка распределяема

24Как пережить хабраэффект

• Что сейчас?

• Масштабирование

• Нагрузка распределяема

• Балансировка между узлами

24Как пережить хабраэффект

• Что сейчас?

• Масштабирование

• Нагрузка распределяема

• Балансировка между узлами

• Быстрое наращивание мощности

24Как пережить хабраэффект

• Что сейчас?

• Масштабирование

• Нагрузка распределяема

• Балансировка между узлами

• Быстрое наращивание мощности

• Сглаживание пиков

24Как пережить хабраэффект

4. Событийность

26Что дает нам событийная модель

• Слабая связность

26Что дает нам событийная модель

• Слабая связность

• Естественный параллелизм и масштабирование

26Что дает нам событийная модель

• Слабая связность

• Естественный параллелизм и масштабирование

• Эффективное неиспользование ресурсов

26Что дает нам событийная модель

27Слабая связность

• Кода

27Слабая связность

• Кода

• Изоляция времени исполнения

27Слабая связность

• Кода

• Изоляция времени исполнения

• Жизненных циклов

27Слабая связность

• Кода

• Изоляция времени исполнения

• Жизненных циклов

• Простота тестирования

27Слабая связность

• Кода

• Изоляция времени исполнения

• Жизненных циклов

• Простота тестирования

• Уменьшение доменной сложности

27Слабая связность

28Reactive Manifesto

29Для разработчика

• Проблемы не новы

29Для разработчика

• Проблемы не новы

• Правильных инструментов

29Для разработчика

• Проблемы не новы

• Правильных инструментов

• Микросервисная архитектура

29Для разработчика

• Проблемы не новы

• Правильных инструментов

• Микросервисная архитектура

• Устойчива к отказам

29Для разработчика

• Проблемы не новы

• Правильных инструментов

• Микросервисная архитектура

• Устойчива к отказам

• Масштабируется

29Для разработчика

• Проблемы не новы

• Правильных инструментов

• Микросервисная архитектура

• Устойчива к отказам

• Масштабируется

• Слабосвязна

29Для разработчика

Инструментарий

%здесь нужно вставить слайд про функциональное программирование%

32Требования

• Многопоточное программирование

32Требования

• Многопоточное программирование

• Асинхронность

32Требования

• Многопоточное программирование

• Асинхронность

• Событийность

32Требования

• Многопоточное программирование

• Асинхронность

• Событийность

• Управляемая реакция на отказы

32Требования

Языки программирования общего назначения

34Языки общего назначения

• Java, C++

34Языки общего назначения

• Java, C++

• Плюсы

34Языки общего назначения

• Java, C++

• Плюсы

• Параллелизм

34Языки общего назначения

• Java, C++

• Плюсы

• Параллелизм

• Асинхронность

34Языки общего назначения

• Java, C++

• Плюсы

• Параллелизм

• Асинхронность

• Минуcы

34Языки общего назначения

• Java, C++

• Плюсы

• Параллелизм

• Асинхронность

• Минуcы

• Монолит в рантайме

34Языки общего назначения

• Java, C++

• Плюсы

• Параллелизм

• Асинхронность

• Минуcы

• Монолит в рантайме

• Сложно масштабируемы

34Языки общего назначения

• Java, C++

• Плюсы

• Параллелизм

• Асинхронность

• Минуcы

• Монолит в рантайме

• Сложно масштабируемы

• Возможно все, но сложно

34Языки общего назначения

Process per Request

36Process per Request

• PHP фреймворки, Ruby on Rails, Django и т.д.

36Process per Request

• PHP фреймворки, Ruby on Rails, Django и т.д.

• Плюсы

36Process per Request

• PHP фреймворки, Ruby on Rails, Django и т.д.

• Плюсы

• Изоляция

36Process per Request

• PHP фреймворки, Ruby on Rails, Django и т.д.

• Плюсы

• Изоляция

• Масштабируемость

36Process per Request

• PHP фреймворки, Ruby on Rails, Django и т.д.

• Плюсы

• Изоляция

• Масштабируемость

• Минуcы

36Process per Request

• PHP фреймворки, Ruby on Rails, Django и т.д.

• Плюсы

• Изоляция

• Масштабируемость

• Минуcы

• Не событийны

36Process per Request

• PHP фреймворки, Ruby on Rails, Django и т.д.

• Плюсы

• Изоляция

• Масштабируемость

• Минуcы

• Не событийны

• Нет асинхронности и неблокируемости

36Process per Request

• PHP фреймворки, Ruby on Rails, Django и т.д.

• Плюсы

• Изоляция

• Масштабируемость

• Минуcы

• Не событийны

• Нет асинхронности и неблокируемости

• Простое масштабирование до определенного предела

36Process per Request

Green Threads

38Green Threads

• Go, Lua, Haskel

38Green Threads

• Go, Lua, Haskel

• Потоки планируются виртуальной машиной

38Green Threads

• Go, Lua, Haskel

• Потоки планируются виртуальной машиной

• Плюсы

38Green Threads

• Go, Lua, Haskel

• Потоки планируются виртуальной машиной

• Плюсы

• Асинхронность, неблокируемость

38Green Threads

• Go, Lua, Haskel

• Потоки планируются виртуальной машиной

• Плюсы

• Асинхронность, неблокируемость

• Минусы

38Green Threads

• Go, Lua, Haskel

• Потоки планируются виртуальной машиной

• Плюсы

• Асинхронность, неблокируемость

• Минусы

• Ограничены одной нодой

38Green Threads

• Go, Lua, Haskel

• Потоки планируются виртуальной машиной

• Плюсы

• Асинхронность, неблокируемость

• Минусы

• Ограничены одной нодой

• Нет механизмов управления отказами

38Green Threads

Event Loop

40Event Loop

• Node.js, Vert.x

40Event Loop

• Node.js, Vert.x

• Вся работа в event loop

40Event Loop

• Node.js, Vert.x

• Вся работа в event loop

• Плюсы

40Event Loop

• Node.js, Vert.x

• Вся работа в event loop

• Плюсы

• Событийны, асинхронны, неблокируемы

40Event Loop

• Node.js, Vert.x

• Вся работа в event loop

• Плюсы

• Событийны, асинхронны, неблокируемы

• Минусы

40Event Loop

• Node.js, Vert.x

• Вся работа в event loop

• Плюсы

• Событийны, асинхронны, неблокируемы

• Минусы

• Ограничен одной нодой

40Event Loop

• Node.js, Vert.x

• Вся работа в event loop

• Плюсы

• Событийны, асинхронны, неблокируемы

• Минусы

• Ограничен одной нодой

• Не масштабируется по процессорам

40Event Loop

• Node.js, Vert.x

• Вся работа в event loop

• Плюсы

• Событийны, асинхронны, неблокируемы

• Минусы

• Ограничен одной нодой

• Не масштабируется по процессорам

• Нет механизмов управления отказами

40Event Loop

Actor Model

42Actor Model

• Erlang, Akka

42Actor Model

• Erlang, Akka

• Плюсы

42Actor Model

• Erlang, Akka

• Плюсы

• Событийны, асинхронны, неблокируемы

42Actor Model

• Erlang, Akka

• Плюсы

• Событийны, асинхронны, неблокируемы

• Не ограничены одной нодой

42Actor Model

• Erlang, Akka

• Плюсы

• Событийны, асинхронны, неблокируемы

• Не ограничены одной нодой

• Присутствуют механизмы управления отказами

42Actor Model

• Erlang, Akka

• Плюсы

• Событийны, асинхронны, неблокируемы

• Не ограничены одной нодой

• Присутствуют механизмы управления отказами

• Минусы

42Actor Model

• Erlang, Akka

• Плюсы

• Событийны, асинхронны, неблокируемы

• Не ограничены одной нодой

• Присутствуют механизмы управления отказами

• Минусы

• Форсисрует архитектуру

42Actor Model

43Actor Model

43Actor Model

43Actor Model

43Actor Model

43Actor Model

43Actor Model

43Actor Model

43Actor Model

Node 1

43Actor ModelNode 2

Node 1

43Actor ModelNode 2

44Опыт в 2ГИС

• Внутренняя система

44Опыт в 2ГИС

• Внутренняя система

• Несколько источников данных

44Опыт в 2ГИС

• Внутренняя система

• Несколько источников данных

• Множество потребителей

44Опыт в 2ГИС

• Внутренняя система

• Несколько источников данных

• Множество потребителей

• API

44Опыт в 2ГИС

45Опыт в 2ГИС

Микросервисы

47Scala, Akka

• Модель акторов

47Scala, Akka

• Модель акторов

• Строгая типизация

47Scala, Akka

• Модель акторов

• Строгая типизация

• JVM-язык

47Scala, Akka

• Модель акторов

• Строгая типизация

• JVM-язык

• Развитое сообщество

47Scala, Akka

• Модель акторов

• Строгая типизация

• JVM-язык

• Развитое сообщество

• Истории успеха

47Scala, Akka

Nginx

49Spray

• Web Framework

49Spray

• Web Framework

• Асинхронный

49Spray

• Web Framework

• Асинхронный

• Неблокируемый

49Spray

• Web Framework

• Асинхронный

• Неблокируемый

• Событийный

49Spray

• Web Framework

• Асинхронный

• Неблокируемый

• Событийный

• Дружит с актор системами

49Spray

REST

51ØMQ

• Замена сокетам

51ØMQ

• Замена сокетам

• Высокая производительность

51ØMQ

• Замена сокетам

• Высокая производительность

• Балансировка

51ØMQ

53Hadoop, Spark

• Хранилище сырых данных

53Hadoop, Spark

• Хранилище сырых данных

• 50Гб в день

53Hadoop, Spark

• Хранилище сырых данных

• 50Гб в день

• Spark как реализация map-reduce

53Hadoop, Spark

54С чего начать

• Reactive Manifesto

• Coursera

• Functional Programming Principles in Scala

• Principles of Reactive Programming

• Typesafe

54С чего начать

• Reactive Manifesto

• Coursera

• Functional Programming Principles in Scala

• Principles of Reactive Programming

• Typesafe

• Activator

54С чего начать

• Reactive Manifesto

• Coursera

• Functional Programming Principles in Scala

• Principles of Reactive Programming

• Typesafe

• Activator

• Видео

54С чего начать

• Reactive Manifesto

• Coursera

• Functional Programming Principles in Scala

• Principles of Reactive Programming

• Typesafe

• Activator

• Видео

• Reactive Streams

54С чего начать