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

Post on 21-Feb-2017

250 views 0 download

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

1

Реактивное

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

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

October 31, 2015

2

Мир меняется

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

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

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

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

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

3

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

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

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

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

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

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

4

Reactive Manifesto

5

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

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

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

• Изоляция,

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

6

Гибкость

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

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

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

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

7

Надежность

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

Типы ошибок:

• Software failure

•Hardware failure

•Connection failure

8

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

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

9

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

ReactiveX

a = b + c

b => b2

a => b2 + c

10

Observer pattern

11

Функции

• Map

• Scan

• Buffer

• Filter

12

Function Map

13

Function Scan

14

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

clickStream.map(f).scan(g)

15

Function Buffer

16

Function Filter

17

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

18

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

• push vs pull

• synchronous vs asynchronous

19

push vs pull

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

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

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

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

20

synchronous vs asynchronous

Single items Multiple items

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

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

21

Main interfaces

interface Observer<T> {

void onCompleted();

void onError(Throwable e);

void onNext(T t);

}

interface Subscription {

void unsubscribe();

boolean isUnsubscribed();

}

22

Observable observable =

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

@Override

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

subscriber.onNext("Hello World!");

subscriber.onCompleted();

}

});

Observable

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

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);

25

Результат Async Subscriber

05101672113891241314

26

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

• sample

• debounce

• buffer

• throttleFirst

27

Function Sample

28

Function Debounce

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));

}

});

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));

31

Результат async functions

throttleFirst: 0

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

sample: 8

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

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(…)

33

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

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

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

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

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

34

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

35

Вопросы