reactive programming для успеха вашего стартапа
TRANSCRIPT
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
Вопросы