82
Андрей Кравец @andykravets http://andrewkravets.com Пришло время быть реактивными, или нет?

Time to be reactive or not

Embed Size (px)

Citation preview

Андрей Кравец

@andykravets

http://andrewkravets.com

Пришло время быть

реактивными, или нет?

Ссылка на презентацию

План1. Чего хотят пользователи

2. Как изменились требования к программным

продуктам

3. Почему стоит изменить подход к разработке

4. Как реактивное программирование может

нам помочь

5. Тулы

Чего хотят пользователи?

Чего хотят пользователи?

1. Скорость

Чего хотят пользователи?

1. Скорость

2. Надежность

Чего хотят пользователи?

1. Скорость

2. Надежность

3. Безопасность

Чего хотят пользователи?

1. Скорость

2. Надежность

3. Безопасность

4. Удобство

Чего хотят пользователи?

1. Скорость

2. Надежность

3. Безопасность

4. Удобство

5. ???

6. PROFIT!!!

Почему стало сложнее

удовлетворить пользователя

Пользователей стало больше

Изменение инфраструктуры

2000 2014

Размеры кластеров < 100 нод > 1000 нод

Время реакции секунды миллисекунды

Стабильность

работы

95% 100%

Объемы данных GBs TBs/PBs

Как мы привыкли разрабатывать

Как мы привыкли разрабатывать

Spring

Hibernate

JPA

JSF

EJB

Camel

Как мы привыкли разрабатывать

Spring

Hibernate

JPA

JSF

EJB

Camel

Sys1

Sys2

JMS

JMS

Как мы привыкли разрабатывать

Spring

Hibernate

JPA

JSF

EJB

Camel

Sys1

Sys2

JMS

JMS

E

S

B

JMS

Как мы привыкли разрабатывать

Spring

Hibernate

JPA

JSF

EJB

Camel

Sys1

Sys2

JMS

JMS

E

S

B

JMS

Фрактал

Фрактал

Что не так с нашей системой

Spring

Hibernate

JPA

JSF

EJB

Camel

Sys1

Sys2

JMS

JMS

E

S

B

JMSМедленно

Почему получается плохо

1. Мы используем подход к разработке не

учитывающий современные реалии

Почему получается плохо

1. Мы используем подход к разработке не

учитывающий современные реалии

2. Снижение требований к качеству кода в

следствии увеличения вычислительных

мощностей

Почему получается плохо

1. Мы используем подход к разработке не

учитывающий современные реалии

2. Снижение требований к качеству кода в

следствии увеличения вычислительных

мощностей

3. Junior-driven development

4. etc…

Почему получается плохо

Подходы к программированию

Подходы к программированию

1. Процедурное программирование(40е)

Подходы к программированию

1. Процедурное программирование(40е)

2. Объектно-ориентированное

программирование(70е-80е)

Подходы к программированию

1. Процедурное программирование(40е)

2. Объектно-ориентированное

программирование(70е-80е)

3. Функциональное программирование(50е,

80е)

Подходы к программированию

1. Процедурное программирование(40е)

2. Объектно-ориентированное

программирование(70е-80е)

3. Функциональное программирование(50е,

80е)

4. Реактивное функциональное

программирование(90е)

Java => Scala

Java and Scala

Java Scala

public final ≈ val

public ≈ var

POJO ≈ case class

Singletone ≈ object

System.out.println() ≈ println()

Как выглядит императивный флоу

var a = 1

var b =2

var c=a+b

println(c) //3

Как выглядит императивный флоу

var a = 1

var b =2

var c=a+b

println(c) //3

a=2

println(c)

Как выглядит императивный флоу

var a = 1

var b =2

var c=a+b

println(c) //3

a=2

println(c) //3

Как починить?

var a = 1

var b =2

var c=a+b

println(c) //3

a=2

println(c) //3

На вкус как боль...

Что такое реактивное

программирование(РП)

Основные концепции РП

1. Статические и динамические потоки данных

Основные концепции РП

1. Статические и динамические потоки данных

2. Автоматическое распространение изменений

Как выглядит рекативный флоу

var a = 1

var b =2

var c=a+b

println(c) //3

Как выглядит рекативный флоу

var a = 1

var b =2

var c=a+b

println(c) //3

a=2

Как выглядит рекативный флоу

var a = 1

var b =2

var c=a+b

println(c) //3

a=2

println(c) //4

Что такое функциональное

реактивное

программирование(ФРП)

Что насчет флоу?

F1() => F2() => F3(F4()) => …. => Fn()

Свойства реактивных приложений

Событийная-ориентированность

Что не так со старой

Что не так со старой

1. На уровне API пропагандируется

использование сайд-эффектов

Что не так со старой

1. На уровне API пропагандируется

использование сайд-эффектов

2. Мы не можем создавать абстракции более

высокого уровня

Что не так со старой

1. На уровне API пропагандируется

использование сайд-эффектов

2. Мы не можем создавать абстракции более

высокого уровня

3. Callback hell

Что не так со старой

1. На уровне API пропагандируется

использование сайд-эффектов

2. Мы не можем создавать абстракции более

высокого уровня

3. Callback hell

4. Необходимость в самостоятельном

управлении ресурсами

Как ФРП позволяет решить эти

проблеммы

Новая событийная система

1. Каждое событие - функция, элемент

высшего уровня

Новая событийная система

1. Каждое событие - функция, элемент

высшего уровня

2. Обработчики событий - функции, элементы

высшего уровня

Новая событийная система

1. Каждое событие - функция, элемент

высшего уровня

2. Обработчики событий - функции, элементы

высшего уровня

3. Комбинирование позволяет создавать

абстракции более высокого уровня

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

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

1. Вертикальная

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

1. Вертикальная

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

1. Вертикальная

2. Горизонтальная

Отказоустойчивость

Отзывчивость

Почему эти принципы не

серебряная пуля

1. Алгоритмы

Что все еще важно

1. Алгоритмы

2. Грамотная архитектура приложения

Что все еще важно

1. Алгоритмы

2. Грамотная архитектура приложения

3. Качество кода

Что все еще важно

1. Алгоритмы

2. Грамотная архитектура приложения

3. Качество кода

4. Высокий профессиональный уровень

команды

Что все еще важно

Scala.Rx

val a = Var(1) // 1

val b = Var(2) // 2

val c = Rx{ a() + b() } // 3

val d = Rx{ c() * 5 } // 15

val e = Rx{ c() + 4 } // 7

val f = Rx{ d() + e() + 4 } // 26

println(f()) // 26

Scala.Rx #1

Scala.Rx #1

val a = Var(1) // 1

val b = Var(2) // 2

val c = Rx{ a() + b() } // 3

val d = Rx{ c() * 5 } // 15

val e = Rx{ c() + 4 } // 7

val f = Rx{ d() + e() + 4 } // 26

println(f()) // 26

a() = 3

println(f()) // 38

Scala.Rx #1

Scala.Rx #1

val a = Var(1)

var count = 0

val o = Obs(a){

count = a() + 1

}

println(count) // 2

Scala.Rx #2

Scala.Rx #2

val a = Var(1)

var count = 0

val o = Obs(a){

count = a() + 1

}

println(count) // 2

a() = 4

println(count) // 5

Scala.Rx #2

Scala.Rx #2

val a = Var(1)

var count = 0

val o = a.foreach{ x =>

count = x + 1

}

println(count) // 2

a() = 4

println(count) // 5

Scala.Rx #3

val a = Var(1)

val b = Rx{ 2 * a() }

var target = 0

val o = Obs(b){ target = b() }

println(target) // 2

a() = 2

println(target) // 4

o.kill()

a() = 3

println(target) // 4

Scala.Rx #4

val p = Promise[Int]()

val a = Rx{

p.future

}.async(10)

println(a()) // 10

Scala.Rx #5

val p = Promise[Int]()

val a = Rx{

p.future

}.async(10)

println(a()) // 10

p.success(5)

println(a()) // 5

Scala.Rx #5

Scala.Rx

и

производительность

“I havent done much perf measurements at all =/

there is a unit test which would give you numbers.”

Haoyi Li

Что дальше?

1. RxJava

2. The Reactive Manifesto

3. Deprecating the Observer Pattern

4. Typesafe Activator

5. Elm

6. RxJS/Flapjax/Bacon.js/Kefir.js

7. Tao Presentations

Дополнительная информация

Questions?