Reactive programming для успеха вашего стартапа

35
1 Реактивное программирование для успеха вашего стартапа October 31, 2015

Transcript of Reactive programming для успеха вашего стартапа

Page 1: Reactive programming для успеха вашего стартапа

1

Реактивное

программирование

для успеха вашего стартапа

October 31, 2015

Page 2: Reactive programming для успеха вашего стартапа

2

Мир меняется

10 лет назад Сейчас

Количество серверов 10’s 1000’s

Время отклика Секунды Миллисекунды

Время обслуживания Часы 0

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

Page 3: Reactive programming для успеха вашего стартапа

3

Требования к архитектуре

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

(Реагировать на события)

• Гибкость (Реагировать на нагрузку)

• Надежность(Реагировать на ошибки)

• Отзывчивость(Реагировать на юзера)

Page 4: Reactive programming для успеха вашего стартапа

4

Reactive Manifesto

Page 5: Reactive programming для успеха вашего стартапа

5

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

Обмен асинхронными сообщениями между компонентами:

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

• Изоляция,

• Обработка ошибок, как сообщений.

Page 6: Reactive programming для успеха вашего стартапа

6

Гибкость

Система остается работоспособной даже под нагрузкой.

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

• Горизонтальное,

•Вертикальное.

Page 7: Reactive programming для успеха вашего стартапа

7

Надежность

Система остается отзывчивой даже в случае ошибок.

Типы ошибок:

• Software failure

•Hardware failure

•Connection failure

Page 8: Reactive programming для успеха вашего стартапа

8

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

Система возвращает ответ пользователю без задержек.

Page 9: Reactive programming для успеха вашего стартапа

9

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

ReactiveX

a = b + c

b => b2

a => b2 + c

Page 10: Reactive programming для успеха вашего стартапа

10

Observer pattern

Page 11: Reactive programming для успеха вашего стартапа

11

Функции

• Map

• Scan

• Buffer

• Filter

Page 12: Reactive programming для успеха вашего стартапа

12

Function Map

Page 13: Reactive programming для успеха вашего стартапа

13

Function Scan

Page 14: Reactive programming для успеха вашего стартапа

14

Пример: поток нажатий клавиш

clickStream.map(f).scan(g)

Page 15: Reactive programming для успеха вашего стартапа

15

Function Buffer

Page 16: Reactive programming для успеха вашего стартапа

16

Function Filter

Page 17: Reactive programming для успеха вашего стартапа

17

Пример: определение двойного клика

Page 18: Reactive programming для успеха вашего стартапа

18

Разные подходы

• push vs pull

• synchronous vs asynchronous

Page 19: Reactive programming для успеха вашего стартапа

19

push vs pull

Событие Iterable (pull) Observable (push)

Получение данных T next() onNext(T)

Обработка ошибок Throws Exception onError(Exception)

Завершение !hasNext() onCompleted()

Page 20: Reactive programming для успеха вашего стартапа

20

synchronous vs asynchronous

Single items Multiple items

Synchronous T getData() Iterable<T> getData()

Asynchronous Future<T> getData() Observable<T> getData()

Page 21: Reactive programming для успеха вашего стартапа

21

Main interfaces

interface Observer<T> {

void onCompleted();

void onError(Throwable e);

void onNext(T t);

}

interface Subscription {

void unsubscribe();

boolean isUnsubscribed();

}

Page 22: Reactive programming для успеха вашего стартапа

22

Observable observable =

Observable.create(new Observable.OnSubscribe<String>() {

@Override

public void call(Subscriber<? super String> subscriber){

subscriber.onNext("Hello World!");

subscriber.onCompleted();

}

});

Observable

Page 23: Reactive programming для успеха вашего стартапа

23

observable.subscribe(new Subscriber<String>() {

@Override

public void onCompleted() {

}

@Override

public void onError(Throwable e) {

}

@Override

public void onNext(String t) {

System.out.println(t);

}

});

Subscriber

Page 24: Reactive programming для успеха вашего стартапа

24

Пример Async Subscriber

Observable.range(0, 15).buffer(5).flatMap(i -> {

return Observable.from(i)

.subscribeOn(Schedulers.computation()).map(item -> {

// simulate computational work

return item;

});

}).toBlocking().forEach(System.out::println);

Page 25: Reactive programming для успеха вашего стартапа

25

Результат Async Subscriber

05101672113891241314

Page 26: Reactive programming для успеха вашего стартапа

26

Асинхронные функции

• sample

• debounce

• buffer

• throttleFirst

Page 27: Reactive programming для успеха вашего стартапа

27

Function Sample

Page 28: Reactive programming для успеха вашего стартапа

28

Function Debounce

Page 29: Reactive programming для успеха вашего стартапа

29

Пример async functions - часть 1

Observable<Integer> observable = Observable

.create((Subscriber<? super Integer> s) -> {

int i = 0;

while (!s.isUnsubscribed()) {

s.onNext(i++);

Thread.sleep((long) (Math.random() * 100));

}

});

Page 30: Reactive programming для успеха вашего стартапа

30

Пример async functions - часть 2

observable.throttleFirst(500, TimeUnit.MILLISECONDS)

.subscribeOn(Schedulers.newThread())

.forEach(i -> System.out.println("throttleFirst: " + i));

observable.sample(500, TimeUnit.MILLISECONDS)

.subscribeOn(Schedulers.newThread())

.forEach(i -> System.out.println("sample: " + i));

observable.buffer(500, TimeUnit.MILLISECONDS)

.subscribeOn(Schedulers.newThread())

.forEach(i -> System.out.println("buffer: " + i));

observable.debounce(50, TimeUnit.MILLISECONDS)

.subscribeOn(Schedulers.newThread())

.forEach(i -> System.out.println("debounce: " + i));

Page 31: Reactive programming для успеха вашего стартапа

31

Результат async functions

throttleFirst: 0

debounce: 0debounce: 3debounce: 4debounce: 5debounce: 6

sample: 8

buffer: [0, 1, 2, 3, 4, 5, 6, 7, 8]

Page 32: Reactive programming для успеха вашего стартапа

32

JavaRX Javadocs

/**

* Returns an Observable that emits items based on applying a function that you supply to each

item emitted by the source Observable, where that function returns an Observable, and then merging

those resulting Observables and emitting the results of this merger.

*/

public final <R> Observable<R> flatMap(…)

Page 33: Reactive programming для успеха вашего стартапа

33

Для чего стоит использовать JavaRX?

• UI события, такие как нажатия кнопки, передвижение мыши

• Business Domain события: изменения property, обновление коллекции

• Инфраструктурные события, такие как наблюдение за изменением фала или ОС события

• Обработка множественных событий

Page 34: Reactive programming для успеха вашего стартапа

34

Мы используем ReactiveX

Page 35: Reactive programming для успеха вашего стартапа

35

Вопросы