Tamir Dresher - Reactive Extensions (Rx) 101

38
MILAN 20/21.11.2015 Talk title: Reactive Extensions 101 Tamir Dresher – CodeValue - @tamir_dresher

Transcript of Tamir Dresher - Reactive Extensions (Rx) 101

Page 1: Tamir Dresher - Reactive Extensions (Rx) 101

MILAN 20/21.11.2015

Talk title: Reactive Extensions 101Tamir Dresher – CodeValue - @tamir_dresher

Page 2: Tamir Dresher - Reactive Extensions (Rx) 101

• Software Architect, Consultant and Instructor

• Software Engineering Lecturer @ Ruppin Academic Center

@[email protected]://www.TamirDresher.com.

Page 3: Tamir Dresher - Reactive Extensions (Rx) 101

Your headache relief pill to Asynchronous and Event based applications

AsyncPush

TriggersEvents

Reactive Extensions

Page 4: Tamir Dresher - Reactive Extensions (Rx) 101

Reactive Programming concentrates on the propagation of changes and

their effectssimply put, how to react to

changes and create dataflows that depend on

them

Reactive Programming

Page 5: Tamir Dresher - Reactive Extensions (Rx) 101

5

Socialmedia

High Rate Data

IoTGPS

External Services

UI eve

nts

Your System

So Many Sources…

Page 6: Tamir Dresher - Reactive Extensions (Rx) 101

Source/Producer

Target/Consumer

Producer-Consumer

Page 7: Tamir Dresher - Reactive Extensions (Rx) 101

Source/Producer

Target/Consumer

Source/Producer

Source/Producer

Target/Consumer

Target/Consumer

Producer-Consumer

Page 8: Tamir Dresher - Reactive Extensions (Rx) 101

IEnumerable<Message> LoadMessages(string hashtag){

var statuses = facebook.Search(hashtag);var tweets = twitter.Search(hashtag);var updates = linkedin.Search(hashtag);return statuses.Concat(tweets).Concat(updates);

}

Twitter AppLinkedi

n

Facebook

Pull Model

Page 9: Tamir Dresher - Reactive Extensions (Rx) 101

???? LoadMessages(string hashtag){

facebook.Search(hashtag);twitter.Search(hashtag);linkedin.Search(hashtag);

}

DoSomething( )msg

Push Model

Page 10: Tamir Dresher - Reactive Extensions (Rx) 101

observable observer

Subscribe(observer)

subscription

OnNext(X1)

OnNext(Xn)⁞

X1observable X2 Xn

⁞IDisposable

Observables and Observers

Page 11: Tamir Dresher - Reactive Extensions (Rx) 101

OnCompleted()

OnError(Exception)

observable

observable observer

X1 X2 Xn

Observables and Observers

Page 12: Tamir Dresher - Reactive Extensions (Rx) 101

namespace System{ public interface IObservable<out T> { IDisposable Subscribe(IObserver<T> observer); }

public interface IObserver<in T> { void OnNext(T value); void OnError(Exception error); void OnCompleted(); }}

Interfaces

Page 13: Tamir Dresher - Reactive Extensions (Rx) 101

MILAN 20/21.11.2015

Creating Observables

Page 14: Tamir Dresher - Reactive Extensions (Rx) 101

IObservable<Message> ObserveMessages(string hashtag){

}

return Observable.Create( async (o) => {

});

var messages = await GetMessagesAsync(hashtag);foreach(var m in messages){ o.OnNext(m);}o.OnCompleted();

Pull To Push

Page 15: Tamir Dresher - Reactive Extensions (Rx) 101

IObservable<Message> ObserveMessages(string hashtag){

}

return Observable.Defer( async () => {

});

var messages = await GetMessagesAsync(hashtag);return message.ToObservable();

Built-in Converters

Page 16: Tamir Dresher - Reactive Extensions (Rx) 101

Observable.Merge(

facebook.ObserveMessages(hashtag),

twitter.ObserveMessages(hashtag),

linkedin.ObserveMessages(hashtag));

Built-in Operators

Page 17: Tamir Dresher - Reactive Extensions (Rx) 101

Observable.Range(1, 10)    .Subscribe(x => Console.WriteLine(x));

Observable.Interval(TimeSpan.FromSeconds(1))    .Subscribe(x => Console.WriteLine(x));

Observable.FromEventPattern(SearchBox, "TextChanged")

1 2 10

⁞1 2 10

⁞1 sec 1 sec

Observables Factories

Page 18: Tamir Dresher - Reactive Extensions (Rx) 101

MILAN 20/21.11.2015

Observable Queries (Rx Operators)

Page 19: Tamir Dresher - Reactive Extensions (Rx) 101

Filtering Projection Partitioning Joins Grouping Set

Element Generation Quantifiers Aggregation Error HandlingTime and Concurrency

Where

OfType

Select

SelectMany

Materialize

Skip

Take

TakeUntil

CombineLatest

Concat

join

GroupBy

GroupByUntil

Buffer

Distinct

DistinctUntilChanged

Timeout

TimeInterval

ElementAt

First

Single

Range

Repeat

Defer

All

Any

Contains

Sum

Average

Scan

Catch

OnErrorResumeNext

Using

Page 20: Tamir Dresher - Reactive Extensions (Rx) 101

Operator2 Creates an IObservable<T3>

IObservable<T2> Operator<T1>(IObservable<T1> source, parameters);

Operator 1 Subscribe( )

observer

observable… Operator

N

Operator1 Creates an IObservable<T2>

IObservable<T>Original source

observerSubscribe

Composability

Page 21: Tamir Dresher - Reactive Extensions (Rx) 101

g(x)

f(x)

Observable Query Pipeline

Page 22: Tamir Dresher - Reactive Extensions (Rx) 101

Reactive Search

Page 23: Tamir Dresher - Reactive Extensions (Rx) 101

1. At least 3 characters2. Don’t overflow server (0.5 sec delay)3. Don’t send the same string again4. Discard results if another search was

requested

Reactive Search - Rules

Page 24: Tamir Dresher - Reactive Extensions (Rx) 101

Demo

Page 25: Tamir Dresher - Reactive Extensions (Rx) 101

Var textChanged = Observable.FromEventPattern(txt,

“TextChanged”).Select(_=>txt.Text);

textChanged.Where(text=>text.Length>3).Throttle(TimeSpan.FromSeconds(0.5)).DistinctUntilChanged().SelectMany(text => SearchAsync(text)).Switch().Subscribe(/*handle the results*/);

Page 26: Tamir Dresher - Reactive Extensions (Rx) 101

var $input = $('#input'), $results = $('#results');

Rx.Observable.fromEvent($input, 'keyup') .map(e => e.target.value) .filter(text => text.length > 3) .throttle(500 /* ms */) .distinctUntilChanged() .flatMapLatest(searchWikipedia) .subscribe(data => { var res = data[1]; $results.empty(); $.each(res, (_, value) => $('<li>' + value + '</li>').appendTo($results)); }, error => { /* handle any errors */ $results.empty(); $('<li>Error: ' + error + '</li>').appendTo($results);});

Page 27: Tamir Dresher - Reactive Extensions (Rx) 101

MILAN 20/21.11.2015

Abstracting Time and Concurrency

Page 28: Tamir Dresher - Reactive Extensions (Rx) 101

Thread Pool

Task Scheduler

other

Schedulers

Page 29: Tamir Dresher - Reactive Extensions (Rx) 101

public interface IScheduler{ DateTimeOffset Now { get; }

IDisposable Schedule<TState>( TState state, Func<IScheduler, TState, IDisposable> action);

IDisposable Schedule<TState>(TimeSpan dueTime, TState state,Func<IScheduler, TState, IDisposable> action);

IDisposable Schedule<TState>(DateTimeOffset dueTime,

TState state,Func<IScheduler, TState, IDisposable> action);

}

Page 30: Tamir Dresher - Reactive Extensions (Rx) 101

//// Runs a timer on the default scheduler//IObservable<T> Throttle<T>(TimeSpan dueTime);

//// Every operator that introduces concurrency// has an overload with an IScheduler//IObservable<T> Throttle<T>(TimeSpan dueTime, IScheduler scheduler);

Parameterizing Concurrency

Page 31: Tamir Dresher - Reactive Extensions (Rx) 101

textChanged

.Throttle(TimeSpan.FromSeconds(0.5),

DefaultScheduler.Instance).DistinctUntilChanged().SelectMany(text =>

SearchAsync(text)).Switch().Subscribe(/*handle the

results*/);

Page 32: Tamir Dresher - Reactive Extensions (Rx) 101

//// runs the observer callbacks on the specified // scheduler.//IObservable<T> ObserveOn<T>(IScheduler);

//// runs the observer subscription and unsubsciption on// the specified scheduler.//IObservable<T> SubscribeOn<T>(IScheduler)

Changing Execution Context

Page 33: Tamir Dresher - Reactive Extensions (Rx) 101

textChanged.Throttle(TimeSpan.FromSeconds(0.5)).DistinctUntilChanged().SelectMany(text =>

SearchAsync(text)).Switch()

.ObserveOn(DispatcherScheduler.Current).Subscribe(/*handle the results*/);

Changing Execution Context

Page 34: Tamir Dresher - Reactive Extensions (Rx) 101

textChanged.Throttle(TimeSpan.FromSeconds(0.5)).DistinctUntilChanged().SelectMany(text =>

SearchAsync(text)).Switch().ObserveOnDispatcher().Subscribe(/*handle the results*/);

Changing Execution Context

Page 35: Tamir Dresher - Reactive Extensions (Rx) 101

http://blogs.msdn.com/b/rxteam/archive/2012/06/14/testing-rx-queries-using-virtual-time-scheduling.aspx

Virtualizing Time

Page 36: Tamir Dresher - Reactive Extensions (Rx) 101

Your headache relief pill to Asynchronous and Event based applications

AsyncPush

TriggersEvents

Reactive Extensions

Page 37: Tamir Dresher - Reactive Extensions (Rx) 101

Thank You

www.manning.com/dresher www.reactivex.io github.com/Reactive-Extensions

Discount code: ctwcodemot 

Page 38: Tamir Dresher - Reactive Extensions (Rx) 101

MILAN 20/21.11.2015 - Tamir Dresher – Rx 101

Leave your feedback on Joind.in!https://m.joind.in/event/codemotion-milan-2015

Presenter contact detailst: @tamir_dreshere: [email protected]: TamirDresher.comw: www.codevalue.net