SlideShare a Scribd company logo
Reactive programmingReactive programming
Lessons learnedLessons learned
Tomasz Nurkiewicz
You must beYou must be thisthis tall totall to
practice reactivepractice reactive
programmingprogramming
Liam Neeson on reactive programming
[...] a very particular set of skills,
skills [...] acquired over a very long
career. Skills that make me a
nightmare for people like you
Who am I?Who am I?
I built complex reactive systemsI built complex reactive systems
* not really proud about the “complex” part
1000+ Akka cluster nodes1000+ Akka cluster nodes
Tens of thousands of RPSTens of thousands of RPS
on a single nodeon a single node
Beat C10k problemBeat C10k problem
...and C100k...and C100k
I wrote a book with the word “reactive” in the title
Chinese curseChinese curse
May you live inMay you live in
interesting timesinteresting times
me
May you supportMay you support
interesting codebaseinteresting codebase
1. Fetch user by name from a web service
2. If not yet in database, store it
3. Load shopping cart for user
4. Count total price of items
5. Make single payment
6. Send e-mail for each individual item, together
with payment ID
User user = ws.findUserByName(name);
if (!db.contains(user.getSsn())) {
db.save(user);
}
List<Item> cart = loadCart(user);
double total = cart.stream()
.mapToDouble(Item::getPrice)
.sum();
UUID id = pay(total);
cart.forEach(item -> sendEmail(item, id));
     User  user = ws.findUserByName(name)
Mono<User> user = ws.findUserByName(name)
     boolean  contains = db.contains(user.getSsn())
Mono<Boolean> contains = db.contains(user.getSsn())
if (!db.contains(user.getSsn())) {
db.save(user);
}
user -> db
.contains(user.getSsn()) //Mono<Bool>, true/false
.filter(contains -> contains) //Mono<Bool>, true/empty
.switchIfEmpty(db.save(user)) //if empty,
//replace with db.save()
User user = ws.findUserByName(name);
if (!db.contains(user.getSsn())) {
db.save(user);
}
List<Item> cart = loadCart(user);
double total = cart.stream()
.mapToDouble(Item::getPrice)
.sum();
UUID id = pay(total);
cart.forEach(item -> sendEmail(item, id));
Now, take a deep breath...
ws
.findUserByName(name)
.flatMap(user -> db
.contains(user.getSsn())
.filter(contains -> contains)
.switchIfEmpty(db.save(user))
)
.flatMap(user -> loadCart(user)
.collectList()
.flatMap(cart -> {
double total = cart.stream()
.mapToDouble(Item::getPrice)
.sum();
return pay(total)
.map(uuid -> Pair.of(cart, uuid));
}))
.flatMapMany(pair -> Flux
.fromIterable(pair.getLeft())
.map(item -> Pair.of(item, pair.getRight())))
.flatMap(pair -> sendEmail(pair.getLeft(), pair.getRight(
That escalated quicklyThat escalated quickly
User user = ws.findUserByName(name);
if (!db.contains(user.getSsn())) {
db.save(user);
}
List<Item> cart = loadCart(user);
double total = cart.stream()
.mapToDouble(Item::getPrice)
.sum();
UUID id = pay(total);
cart.forEach(item -> sendEmail(item, id));
ws
.findUserByName(name)
.flatMap(user -> db
.contains(user.getSsn())
.filter(contains -> contains)
.switchIfEmpty(db.save(user))
)
.flatMap(user -> loadCart(user)
.collectList()
.flatMap(cart -> {
double total = cart.stream()
.mapToDouble(Item::getPrice)
.sum();
return pay(total)
.map(uuid -> Pair.of(cart, uuid));
}))
.flatMapMany(pair -> Flux
.fromIterable(pair.getLeft())
.map(item -> Pair.of(item, pair.getRight())))
.flatMap(pair -> sendEmail(pair.getLeft(), pair.getRight(
Ubiquitous language?Ubiquitous language?
Are Semigroup, Monoid, Monad,
Functor, Kleisli, and Yoneda
pervasive in your domain model?
www.innoq.com/en/blog/the-language-of-maths-is-not-the-language-of-your-business/
cont.
Unless your core domain is
mathematics, category theory is
not the language used by your
domain experts.
www.innoq.com/en/blog/the-language-of-maths-is-not-the-language-of-your-business/
cont.
Good luck getting your domain
experts to understand the
language introduced by that
abstraction.
www.innoq.com/en/blog/the-language-of-maths-is-not-the-language-of-your-business/
Are Mono and Flux pervasive in
your domain model?
Unless your core domain is
infectious diseases, Reactor is not
the language used by your domain
experts.
en.wikipedia.org/wiki/Infectious_mononucleosis
en.wikipedia.org/wiki/Dysentery
UniversalUniversal
measure ofmeasure of
code quality?code quality?
““SimpleSimple””??
““Monad transformers areMonad transformers are
reducing boilerplatereducing boilerplate””
““Tested?Tested?””
Remember that codeRemember that code
with badly writtenwith badly written
tests can be moretests can be more
harmful than codeharmful than code
without tests.without tests.
hackernoon.com/few-simple-rules-for-good-coding-my-15-years-experience-96cb29d4acd9
open/closed
SOLID
high cohesion
low coupling
cyclomatic complexity
DRY
...
BoringBoring
ImplementationImplementation
transparencytransparency
I don't care about patterns,I don't care about patterns,
frameworks, syntaxframeworks, syntax
10x developer?10x developer?
Enable 10 other developers
What are youWhat are you
optimizing?optimizing?
CostsCosts
Software development
Hardware
Maintenance
Blocking codeBlocking code
Reactive codeReactive code
Tipping point?Tipping point?
TheThe pointpoint
Are youAre you ??
No.No.
Little's lawLittle's law
L = L =  WW
en.wikipedia.org/wiki/Little's_law
Tomcat, 100 threads (L), 100 ms/request (W)
1K request/second (λ)
on a laptop
confirmed!
Ever heard of space-Ever heard of space-
time trade off?time trade off?
What about human-What about human-
hardware trade off?hardware trade off?
Let's talkLet's talk
aboutabout
maintenancemaintenance
I miss you, stack trace...I miss you, stack trace...
java.sql.SQLTransientConnectionException: HikariPool-1 -
Connection is not available,
request timed out after 30003ms.
at com.zaxxer.hikari.pool.HikariPool.createTimeoutExceptio
at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariP
at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariP
at com.zaxxer.hikari.HikariDataSource.getConnection(Hikari
at org.springframework.jdbc.datasource.DataSourceTransacti
at org.springframework.transaction.support.AbstractPlatfor
at org.springframework.transaction.interceptor.Transaction
at org.springframework.transaction.interceptor.Transaction
at org.springframework.transaction.interceptor.Transaction
www.nurkiewicz.com/2017/03/beware-of-slow-transaction-callbacks-in.html
"http-nio-9099-exec-2@6415" daemon prio=5 tid=0x28 nid=NA wait
java.lang.Thread.State: WAITING
[...4 frames omitted...]
at org.apache.activemq.transport.FutureResponse.getResul
at o.a.a.transport.ResponseCorrelator.request
at o.a.a.ActiveMQConnection.syncSendPacket
at o.a.a.ActiveMQConnection.syncSendPacket
at o.a.a.ActiveMQSession.syncSendPacket
at o.a.a.ActiveMQMessageProducer.<init>
at o.a.a.ActiveMQSession.createProducer
[...5 frames omitted...]
at org.springframework.jms.core.JmsTemplate.send
at com.nurkiewicz.Sample$sendMessageAfterCommit$1.afterC
at org.springframework.transaction.support.TransactionSy
at o.s.t.s.TransactionSynchronizationUtils.triggerAfterC
at o.s.t.s.AbstractPlatformTransactionManager.triggerAft
at o.s.t.s.AbstractPlatformTransactionManager.processCom
at o.s.t.s.AbstractPlatformTransactionManager.commit
[...73 frames omitted...]
Async, by contrast, isAsync, by contrast, is
callback based andcallback based and
driven by an eventdriven by an event
looploop [...] stack trace is[...] stack trace is
meaningless whenmeaningless when
trying to follow atrying to follow a
request.request.
medium.com/netflix-techblog/zuul-2-the-netflix-journey-to-asynchronous-non-blocking-systems-45947377fb5c
It is difficult to follow aIt is difficult to follow a
request as events andrequest as events and
callbacks arecallbacks are
processed [...]processed [...]
medium.com/netflix-techblog/zuul-2-the-netflix-journey-to-asynchronous-non-blocking-systems-45947377fb5c
[...] unhandled[...] unhandled
exceptions, andexceptions, and
incorrectly handledincorrectly handled
state changes [...]state changes [...]
These types of issuesThese types of issues
have proven to behave proven to be
quite difficult to debugquite difficult to debug
medium.com/netflix-techblog/zuul-2-the-netflix-journey-to-asynchronous-non-blocking-systems-45947377fb5c
Exceptions from hellExceptions from hell
flux
.map(this::foo)
.map(this::bar)
.map(this::buzz)
java.lang.NullPointerException:
The mapper function returned a null value.
at io.reactivex.internal.functions.ObjectHelper.requir
at io.reactivex.internal.operators.flowable.FlowableMa
at io.reactivex.internal.subscriptions.ScalarSubscript
at io.reactivex.internal.subscribers.BasicFuseableSubs
at io.reactivex.internal.subscribers.BasicFuseableSubs
at io.reactivex.internal.subscribers.BasicFuseableSubs
at io.reactivex.internal.subscribers.LambdaSubscriber
at io.reactivex.internal.operators.flowable.FlowableIn
at io.reactivex.internal.operators.flowable.FlowableIn
at io.reactivex.internal.subscribers.LambdaSubscriber
at io.reactivex.internal.subscribers.BasicFuseableSubs
at io.reactivex.internal.subscribers.BasicFuseableSubs
at io.reactivex.internal.subscribers.BasicFuseableSubs
at io.reactivex.internal.operators.flowable.FlowableJu
at io.reactivex.Flowable.subscribe(Flowable.java:12986
at io.reactivex.internal.operators.flowable.FlowableMa
at io.reactivex.Flowable.subscribe(Flowable.java:12986
at io.reactivex.internal.operators.flowable.FlowableMa
at io.reactivex.Flowable.subscribe(Flowable.java:12986
at io reactivex internal operators flowable FlowableMa
java.lang.NullPointerException:
The mapper returned a null value.
at java.util.Objects.requireNonNull(Objects.java:228)
at reactor.core.publisher.FluxMapFuseable$MapFuseableS
at reactor.core.publisher.FluxJust$WeakScalarSubscript
at reactor.core.publisher.FluxMapFuseable$MapFuseableS
at reactor.core.publisher.FluxMapFuseable$MapFuseableS
at reactor.core.publisher.FluxMapFuseable$MapFuseableS
at reactor.core.publisher.LambdaSubscriber.onSubscribe
at reactor.core.publisher.FluxMapFuseable$MapFuseableS
at reactor.core.publisher.FluxMapFuseable$MapFuseableS
at reactor.core.publisher.FluxMapFuseable$MapFuseableS
at reactor.core.publisher.FluxJust.subscribe(FluxJust
at reactor.core.publisher.FluxMapFuseable.subscribe(Fl
at reactor.core.publisher.FluxMapFuseable.subscribe(Fl
at reactor.core.publisher.FluxMapFuseable.subscribe(Fl
at reactor.core.publisher.Flux.subscribe(Flux.java:657
at reactor.core.publisher.Flux.subscribeWith(Flux.java
at reactor.core.publisher.Flux.subscribe(Flux.java:656
at reactor.core.publisher.Flux.subscribe(Flux.java:652
at reactor.core.publisher.Flux.subscribe(Flux.java:649
TimeoutExceptionTimeoutException
play.api.http.HttpErrorHandlerExceptions$$anon$1:
Execution exception[[AskTimeoutExcepti
Ask timed out on
[Actor[akka://application/user/$a#-948
after [60000 ms]]]
at play.api.http.HttpErrorHandlerExceptions$.throwableToUs
at play.api.http.DefaultHttpErrorHandler.onServerError(Htt
at play.api.GlobalSettings$class.onError(GlobalSettings.sc
at play.api.DefaultGlobal$.onError(GlobalSettings.scala:2
at play.api.http.GlobalSettingsHttpErrorHandler.onServerEr
at play.core.server.netty.PlayDefaultUpstreamHandler$$anon
at play.core.server.netty.PlayDefaultUpstreamHandler$$anon
at scala.runtime.AbstractPartialFunction.apply(AbstractPar
at scala.util.Failure$$anonfun$recover$1.apply(Try.scala:2
at scala.util.Try$.apply(Try.scala:192) [scala-library-2.1
at scala.util.Failure.recover(Try.scala:216) [scala-librar
at scala.concurrent.Future$$anonfun$recover$1.apply(Future
at scala.concurrent.Future$$anonfun$recover$1.apply(Future
at scala.concurrent.impl.CallbackRunnable.run(Promise.scal
at play.api.libs.iteratee.Execution$trampoline$.executeSch
at play.api.libs.iteratee.Execution$trampoline$.execute(Ex
at scala concurrent impl CallbackRunnable executeWithValue
github.com/CogComp/open-eval/issues/186
The best reactiveThe best reactive
system is single-system is single-
threaded (!)threaded (!)
Reactor pattern
Actors
SPSC queues
Rx/Reactor operators
Order is no longerOrder is no longer
guaranteedguaranteed
parallel() vs
flatMap() vs
concatMap() vs
concatMapEager()
DDoS was never thatDDoS was never that
simple!simple!
flatMap(..., 128)
MonitoringMonitoring
Staged event-drivenStaged event-driven
architecturearchitecture
an approach to software
architecture that decomposes a
complex, event-driven application
into a set of stages connected by
queues
en.wikipedia.org/wiki/Staged_event-driven_architecture
Watch out for yourWatch out for your
queuesqueues
Why noWhy no mailboxSizemailboxSize
in Akka 2?in Akka 2?
slow, inaccurate, impossible, silly
letitcrash.com/post/17707262394/why-no-mailboxsize-in-akka-2
Lightbend TelemetryLightbend Telemetry
Mailbox size (counter)
statistics for actor mailbox sizes
developer.lightbend.com/docs/cinnamon/2.5.x/instrumentations/akka/akka.html
KeyKey
TakeawaysTakeaways
Spring Boot 2 changesSpring Boot 2 changes
everythingeverything
@GetMapping("/users/{id}")
ResponseEntity<User> get(@PathVariable long id) {
User user = repository.findById(id);
if(user != null) {
return ok(user);
} else {
return notFound();
}
}
@GetMapping("/users/{id}")
ResponseEntity<User> get(@PathVariable long id) {
return repository
.findById(id)
.map(user -> ok(user))
.orElse(notFound());
}
@Bean
RouterFunction<ServerResponse> route() {
return route(
GET("/users/{id}"), request -> Mono
.justOrEmpty(request.pathVariable("id"))
.map(Long::parseLong)
.flatMap(id -> repository.findById(id)
.flatMap(p -> ok().body(fromObject(p))
.switchIfEmpty(notFound().build()))
);
}
Reactive programmingReactive programming
is awesomeis awesome
SeriouslySeriously
the explosion of latency-inducing
microservices
www.infoq.com/articles/Designing-Implementing-Using-Reactive-APIs
Are you reallyAre you really
benefitting?benefitting?
Need or desire?Need or desire?
Make aMake a
consciousconscious
decisiondecision
Thank you!Thank you!
@tnurkiewicz
nurkiewicz.github.io/talks/2018/reactive-lessons
@tnurkiewicz
Image sourcesImage sources
1.
2.
3.
4.
5.
6.
http://disney.wikia.com/wiki/Statler_and_Waldo
https://twitter.com/nixcraft/status/97464585397
www.pngmart.com/image/46149
http://half-life.wikia.com/wiki/File:HL3_logo.svg
http://dilbert.com/strip/2008-09-03
https://www.3djuegos.com/comunidad-
foros/tema/45105428/0/nintendo-switch-publica-
especificaciones-tecnicas-al-completo/

More Related Content

What's hot

Extending grimoirelab
Extending grimoirelabExtending grimoirelab
Extending grimoirelab
Valerio Cosentino
 
Coding in Style
Coding in StyleCoding in Style
Coding in Style
scalaconfjp
 
NoSQL: Death to Relational Databases(?)
NoSQL: Death to Relational Databases(?)NoSQL: Death to Relational Databases(?)
NoSQL: Death to Relational Databases(?)
Ben Scofield
 
Dynamic C++ ACCU 2013
Dynamic C++ ACCU 2013Dynamic C++ ACCU 2013
Dynamic C++ ACCU 2013
aleks-f
 
Proxies are Awesome!
Proxies are Awesome!Proxies are Awesome!
Proxies are Awesome!
Brendan Eich
 
What’s new in ECMAScript 6.0
What’s new in ECMAScript 6.0What’s new in ECMAScript 6.0
What’s new in ECMAScript 6.0
Eyal Vardi
 
Moose workshop
Moose workshopMoose workshop
Moose workshop
Ynon Perek
 
Exhibition of Atrocity
Exhibition of AtrocityExhibition of Atrocity
Exhibition of Atrocity
Michael Pirnat
 
Working with the Scalding Type-Safe API
Working with the Scalding Type-Safe API Working with the Scalding Type-Safe API
Working with the Scalding Type-Safe API
Criteolabs
 
ES6: The Awesome Parts
ES6: The Awesome PartsES6: The Awesome Parts
ES6: The Awesome Parts
Domenic Denicola
 
A Few of My Favorite (Python) Things
A Few of My Favorite (Python) ThingsA Few of My Favorite (Python) Things
A Few of My Favorite (Python) Things
Michael Pirnat
 
In a galaxy far, far away - A procedural generation tale
In a galaxy far, far away - A procedural generation taleIn a galaxy far, far away - A procedural generation tale
In a galaxy far, far away - A procedural generation tale
Shay Davidson
 

What's hot (13)

Extending grimoirelab
Extending grimoirelabExtending grimoirelab
Extending grimoirelab
 
Coding in Style
Coding in StyleCoding in Style
Coding in Style
 
NoSQL: Death to Relational Databases(?)
NoSQL: Death to Relational Databases(?)NoSQL: Death to Relational Databases(?)
NoSQL: Death to Relational Databases(?)
 
Dynamic C++ ACCU 2013
Dynamic C++ ACCU 2013Dynamic C++ ACCU 2013
Dynamic C++ ACCU 2013
 
Proxies are Awesome!
Proxies are Awesome!Proxies are Awesome!
Proxies are Awesome!
 
Scalding for Hadoop
Scalding for HadoopScalding for Hadoop
Scalding for Hadoop
 
What’s new in ECMAScript 6.0
What’s new in ECMAScript 6.0What’s new in ECMAScript 6.0
What’s new in ECMAScript 6.0
 
Moose workshop
Moose workshopMoose workshop
Moose workshop
 
Exhibition of Atrocity
Exhibition of AtrocityExhibition of Atrocity
Exhibition of Atrocity
 
Working with the Scalding Type-Safe API
Working with the Scalding Type-Safe API Working with the Scalding Type-Safe API
Working with the Scalding Type-Safe API
 
ES6: The Awesome Parts
ES6: The Awesome PartsES6: The Awesome Parts
ES6: The Awesome Parts
 
A Few of My Favorite (Python) Things
A Few of My Favorite (Python) ThingsA Few of My Favorite (Python) Things
A Few of My Favorite (Python) Things
 
In a galaxy far, far away - A procedural generation tale
In a galaxy far, far away - A procedural generation taleIn a galaxy far, far away - A procedural generation tale
In a galaxy far, far away - A procedural generation tale
 

Similar to Tomasz Nurkiewicz - Programowanie reaktywne: czego się nauczyłem

Practical RxJava for Android
Practical RxJava for AndroidPractical RxJava for Android
Practical RxJava for Android
Tomáš Kypta
 
Async Redux Actions With RxJS - React Rally 2016
Async Redux Actions With RxJS - React Rally 2016Async Redux Actions With RxJS - React Rally 2016
Async Redux Actions With RxJS - React Rally 2016
Ben Lesh
 
Rxjs kyivjs 2015
Rxjs kyivjs 2015Rxjs kyivjs 2015
Rxjs kyivjs 2015
Alexander Mostovenko
 
Lagergren jvmls-2013-final
Lagergren jvmls-2013-finalLagergren jvmls-2013-final
Lagergren jvmls-2013-final
Marcus Lagergren
 
rx.js make async programming simpler
rx.js make async programming simplerrx.js make async programming simpler
rx.js make async programming simplerAlexander Mostovenko
 
WebCamp:Front-end Developers Day. Александр Мостовенко "Rx.js - делаем асинхр...
WebCamp:Front-end Developers Day. Александр Мостовенко "Rx.js - делаем асинхр...WebCamp:Front-end Developers Day. Александр Мостовенко "Rx.js - делаем асинхр...
WebCamp:Front-end Developers Day. Александр Мостовенко "Rx.js - делаем асинхр...
GeeksLab Odessa
 
FlinkForward Asia 2019 - Evolving Keystone to an Open Collaborative Real Time...
FlinkForward Asia 2019 - Evolving Keystone to an Open Collaborative Real Time...FlinkForward Asia 2019 - Evolving Keystone to an Open Collaborative Real Time...
FlinkForward Asia 2019 - Evolving Keystone to an Open Collaborative Real Time...
Zhenzhong Xu
 
Reactive Streams 1.0 and Akka Streams
Reactive Streams 1.0 and Akka StreamsReactive Streams 1.0 and Akka Streams
Reactive Streams 1.0 and Akka Streams
Dean Wampler
 
PART-3 : Mastering RTOS FreeRTOS and STM32Fx with Debugging
PART-3 : Mastering RTOS FreeRTOS and STM32Fx with DebuggingPART-3 : Mastering RTOS FreeRTOS and STM32Fx with Debugging
PART-3 : Mastering RTOS FreeRTOS and STM32Fx with Debugging
FastBit Embedded Brain Academy
 
MapReduce with Scalding @ 24th Hadoop London Meetup
MapReduce with Scalding @ 24th Hadoop London MeetupMapReduce with Scalding @ 24th Hadoop London Meetup
MapReduce with Scalding @ 24th Hadoop London MeetupLandoop Ltd
 
Consuming web services asynchronously with Futures and Rx Observables (svcc, ...
Consuming web services asynchronously with Futures and Rx Observables (svcc, ...Consuming web services asynchronously with Futures and Rx Observables (svcc, ...
Consuming web services asynchronously with Futures and Rx Observables (svcc, ...
Chris Richardson
 
Apache Spark for Library Developers with William Benton and Erik Erlandson
 Apache Spark for Library Developers with William Benton and Erik Erlandson Apache Spark for Library Developers with William Benton and Erik Erlandson
Apache Spark for Library Developers with William Benton and Erik Erlandson
Databricks
 
Reactive Stream Processing with Akka Streams
Reactive Stream Processing with Akka StreamsReactive Stream Processing with Akka Streams
Reactive Stream Processing with Akka StreamsKonrad Malawski
 
Futures and Rx Observables: powerful abstractions for consuming web services ...
Futures and Rx Observables: powerful abstractions for consuming web services ...Futures and Rx Observables: powerful abstractions for consuming web services ...
Futures and Rx Observables: powerful abstractions for consuming web services ...
Chris Richardson
 
Event driven javascript
Event driven javascriptEvent driven javascript
Event driven javascript
Francesca1980
 
Event driven javascript
Event driven javascriptEvent driven javascript
Event driven javascript
Francesca1980
 
Reactive Web-Applications @ LambdaDays
Reactive Web-Applications @ LambdaDaysReactive Web-Applications @ LambdaDays
Reactive Web-Applications @ LambdaDays
Manuel Bernhardt
 
Learning from 6,000 projects mining specifications in the large
Learning from 6,000 projects   mining specifications in the largeLearning from 6,000 projects   mining specifications in the large
Learning from 6,000 projects mining specifications in the large
CISPA Helmholtz Center for Information Security
 
Progscon 2017: Taming the wild fronteer - Adventures in Clojurescript
Progscon 2017: Taming the wild fronteer - Adventures in ClojurescriptProgscon 2017: Taming the wild fronteer - Adventures in Clojurescript
Progscon 2017: Taming the wild fronteer - Adventures in Clojurescript
John Stevenson
 
Reactive Access to MongoDB from Scala
Reactive Access to MongoDB from ScalaReactive Access to MongoDB from Scala
Reactive Access to MongoDB from Scala
Hermann Hueck
 

Similar to Tomasz Nurkiewicz - Programowanie reaktywne: czego się nauczyłem (20)

Practical RxJava for Android
Practical RxJava for AndroidPractical RxJava for Android
Practical RxJava for Android
 
Async Redux Actions With RxJS - React Rally 2016
Async Redux Actions With RxJS - React Rally 2016Async Redux Actions With RxJS - React Rally 2016
Async Redux Actions With RxJS - React Rally 2016
 
Rxjs kyivjs 2015
Rxjs kyivjs 2015Rxjs kyivjs 2015
Rxjs kyivjs 2015
 
Lagergren jvmls-2013-final
Lagergren jvmls-2013-finalLagergren jvmls-2013-final
Lagergren jvmls-2013-final
 
rx.js make async programming simpler
rx.js make async programming simplerrx.js make async programming simpler
rx.js make async programming simpler
 
WebCamp:Front-end Developers Day. Александр Мостовенко "Rx.js - делаем асинхр...
WebCamp:Front-end Developers Day. Александр Мостовенко "Rx.js - делаем асинхр...WebCamp:Front-end Developers Day. Александр Мостовенко "Rx.js - делаем асинхр...
WebCamp:Front-end Developers Day. Александр Мостовенко "Rx.js - делаем асинхр...
 
FlinkForward Asia 2019 - Evolving Keystone to an Open Collaborative Real Time...
FlinkForward Asia 2019 - Evolving Keystone to an Open Collaborative Real Time...FlinkForward Asia 2019 - Evolving Keystone to an Open Collaborative Real Time...
FlinkForward Asia 2019 - Evolving Keystone to an Open Collaborative Real Time...
 
Reactive Streams 1.0 and Akka Streams
Reactive Streams 1.0 and Akka StreamsReactive Streams 1.0 and Akka Streams
Reactive Streams 1.0 and Akka Streams
 
PART-3 : Mastering RTOS FreeRTOS and STM32Fx with Debugging
PART-3 : Mastering RTOS FreeRTOS and STM32Fx with DebuggingPART-3 : Mastering RTOS FreeRTOS and STM32Fx with Debugging
PART-3 : Mastering RTOS FreeRTOS and STM32Fx with Debugging
 
MapReduce with Scalding @ 24th Hadoop London Meetup
MapReduce with Scalding @ 24th Hadoop London MeetupMapReduce with Scalding @ 24th Hadoop London Meetup
MapReduce with Scalding @ 24th Hadoop London Meetup
 
Consuming web services asynchronously with Futures and Rx Observables (svcc, ...
Consuming web services asynchronously with Futures and Rx Observables (svcc, ...Consuming web services asynchronously with Futures and Rx Observables (svcc, ...
Consuming web services asynchronously with Futures and Rx Observables (svcc, ...
 
Apache Spark for Library Developers with William Benton and Erik Erlandson
 Apache Spark for Library Developers with William Benton and Erik Erlandson Apache Spark for Library Developers with William Benton and Erik Erlandson
Apache Spark for Library Developers with William Benton and Erik Erlandson
 
Reactive Stream Processing with Akka Streams
Reactive Stream Processing with Akka StreamsReactive Stream Processing with Akka Streams
Reactive Stream Processing with Akka Streams
 
Futures and Rx Observables: powerful abstractions for consuming web services ...
Futures and Rx Observables: powerful abstractions for consuming web services ...Futures and Rx Observables: powerful abstractions for consuming web services ...
Futures and Rx Observables: powerful abstractions for consuming web services ...
 
Event driven javascript
Event driven javascriptEvent driven javascript
Event driven javascript
 
Event driven javascript
Event driven javascriptEvent driven javascript
Event driven javascript
 
Reactive Web-Applications @ LambdaDays
Reactive Web-Applications @ LambdaDaysReactive Web-Applications @ LambdaDays
Reactive Web-Applications @ LambdaDays
 
Learning from 6,000 projects mining specifications in the large
Learning from 6,000 projects   mining specifications in the largeLearning from 6,000 projects   mining specifications in the large
Learning from 6,000 projects mining specifications in the large
 
Progscon 2017: Taming the wild fronteer - Adventures in Clojurescript
Progscon 2017: Taming the wild fronteer - Adventures in ClojurescriptProgscon 2017: Taming the wild fronteer - Adventures in Clojurescript
Progscon 2017: Taming the wild fronteer - Adventures in Clojurescript
 
Reactive Access to MongoDB from Scala
Reactive Access to MongoDB from ScalaReactive Access to MongoDB from Scala
Reactive Access to MongoDB from Scala
 

More from SegFaultConf

Wojciech Rząsa - Przewidywanie zmian wydajności aplikacji rozproszonych
Wojciech Rząsa - Przewidywanie zmian wydajności aplikacji rozproszonychWojciech Rząsa - Przewidywanie zmian wydajności aplikacji rozproszonych
Wojciech Rząsa - Przewidywanie zmian wydajności aplikacji rozproszonych
SegFaultConf
 
Zbyszko Papierski - Communication patterns in carbon-based networks
Zbyszko Papierski - Communication patterns in carbon-based networksZbyszko Papierski - Communication patterns in carbon-based networks
Zbyszko Papierski - Communication patterns in carbon-based networks
SegFaultConf
 
Daniel Pokusa - Praca z kodem zastanym- nadchodzi wielka fala
Daniel Pokusa - Praca z kodem zastanym- nadchodzi wielka falaDaniel Pokusa - Praca z kodem zastanym- nadchodzi wielka fala
Daniel Pokusa - Praca z kodem zastanym- nadchodzi wielka fala
SegFaultConf
 
Andrzej Ludwikowski - Event Sourcing - co może pójść nie tak?
Andrzej Ludwikowski -  Event Sourcing - co może pójść nie tak?Andrzej Ludwikowski -  Event Sourcing - co może pójść nie tak?
Andrzej Ludwikowski - Event Sourcing - co może pójść nie tak?
SegFaultConf
 
Dominik Boszko - Krocząc doliną ciemności mikroserwisów się nie ulęknę
Dominik Boszko - Krocząc doliną ciemności mikroserwisów się nie ulęknęDominik Boszko - Krocząc doliną ciemności mikroserwisów się nie ulęknę
Dominik Boszko - Krocząc doliną ciemności mikroserwisów się nie ulęknę
SegFaultConf
 
Krzysztof Kaczmarek - 10 rzeczy, które chciałbym wiedzieć 10 lat temu
Krzysztof Kaczmarek - 10 rzeczy, które chciałbym wiedzieć 10 lat temuKrzysztof Kaczmarek - 10 rzeczy, które chciałbym wiedzieć 10 lat temu
Krzysztof Kaczmarek - 10 rzeczy, które chciałbym wiedzieć 10 lat temu
SegFaultConf
 
Jan Pustelnik - Curry-Howard w praktyce
Jan Pustelnik - Curry-Howard w praktyceJan Pustelnik - Curry-Howard w praktyce
Jan Pustelnik - Curry-Howard w praktyce
SegFaultConf
 
Robert Pankowecki - Czy sprzedawcy SQLowych baz nas oszukali?
Robert Pankowecki - Czy sprzedawcy SQLowych baz nas oszukali?Robert Pankowecki - Czy sprzedawcy SQLowych baz nas oszukali?
Robert Pankowecki - Czy sprzedawcy SQLowych baz nas oszukali?
SegFaultConf
 
Marcin Grzejszczak - Contract Tests in the Enterprise
Marcin Grzejszczak - Contract Tests in the EnterpriseMarcin Grzejszczak - Contract Tests in the Enterprise
Marcin Grzejszczak - Contract Tests in the Enterprise
SegFaultConf
 

More from SegFaultConf (9)

Wojciech Rząsa - Przewidywanie zmian wydajności aplikacji rozproszonych
Wojciech Rząsa - Przewidywanie zmian wydajności aplikacji rozproszonychWojciech Rząsa - Przewidywanie zmian wydajności aplikacji rozproszonych
Wojciech Rząsa - Przewidywanie zmian wydajności aplikacji rozproszonych
 
Zbyszko Papierski - Communication patterns in carbon-based networks
Zbyszko Papierski - Communication patterns in carbon-based networksZbyszko Papierski - Communication patterns in carbon-based networks
Zbyszko Papierski - Communication patterns in carbon-based networks
 
Daniel Pokusa - Praca z kodem zastanym- nadchodzi wielka fala
Daniel Pokusa - Praca z kodem zastanym- nadchodzi wielka falaDaniel Pokusa - Praca z kodem zastanym- nadchodzi wielka fala
Daniel Pokusa - Praca z kodem zastanym- nadchodzi wielka fala
 
Andrzej Ludwikowski - Event Sourcing - co może pójść nie tak?
Andrzej Ludwikowski -  Event Sourcing - co może pójść nie tak?Andrzej Ludwikowski -  Event Sourcing - co może pójść nie tak?
Andrzej Ludwikowski - Event Sourcing - co może pójść nie tak?
 
Dominik Boszko - Krocząc doliną ciemności mikroserwisów się nie ulęknę
Dominik Boszko - Krocząc doliną ciemności mikroserwisów się nie ulęknęDominik Boszko - Krocząc doliną ciemności mikroserwisów się nie ulęknę
Dominik Boszko - Krocząc doliną ciemności mikroserwisów się nie ulęknę
 
Krzysztof Kaczmarek - 10 rzeczy, które chciałbym wiedzieć 10 lat temu
Krzysztof Kaczmarek - 10 rzeczy, które chciałbym wiedzieć 10 lat temuKrzysztof Kaczmarek - 10 rzeczy, które chciałbym wiedzieć 10 lat temu
Krzysztof Kaczmarek - 10 rzeczy, które chciałbym wiedzieć 10 lat temu
 
Jan Pustelnik - Curry-Howard w praktyce
Jan Pustelnik - Curry-Howard w praktyceJan Pustelnik - Curry-Howard w praktyce
Jan Pustelnik - Curry-Howard w praktyce
 
Robert Pankowecki - Czy sprzedawcy SQLowych baz nas oszukali?
Robert Pankowecki - Czy sprzedawcy SQLowych baz nas oszukali?Robert Pankowecki - Czy sprzedawcy SQLowych baz nas oszukali?
Robert Pankowecki - Czy sprzedawcy SQLowych baz nas oszukali?
 
Marcin Grzejszczak - Contract Tests in the Enterprise
Marcin Grzejszczak - Contract Tests in the EnterpriseMarcin Grzejszczak - Contract Tests in the Enterprise
Marcin Grzejszczak - Contract Tests in the Enterprise
 

Recently uploaded

Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*
Frank van Harmelen
 
ODC, Data Fabric and Architecture User Group
ODC, Data Fabric and Architecture User GroupODC, Data Fabric and Architecture User Group
ODC, Data Fabric and Architecture User Group
CatarinaPereira64715
 
Leading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdfLeading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdf
OnBoard
 
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdfFIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance
 
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdfSmart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
91mobiles
 
The Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and SalesThe Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and Sales
Laura Byrne
 
UiPath Test Automation using UiPath Test Suite series, part 3
UiPath Test Automation using UiPath Test Suite series, part 3UiPath Test Automation using UiPath Test Suite series, part 3
UiPath Test Automation using UiPath Test Suite series, part 3
DianaGray10
 
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
Product School
 
PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)
Ralf Eggert
 
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdfFIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance
 
Accelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish CachingAccelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish Caching
Thijs Feryn
 
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Product School
 
JMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and GrafanaJMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and Grafana
RTTS
 
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Product School
 
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered QualitySoftware Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Inflectra
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
Kari Kakkonen
 
"Impact of front-end architecture on development cost", Viktor Turskyi
"Impact of front-end architecture on development cost", Viktor Turskyi"Impact of front-end architecture on development cost", Viktor Turskyi
"Impact of front-end architecture on development cost", Viktor Turskyi
Fwdays
 
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
James Anderson
 
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Tobias Schneck
 
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Thierry Lestable
 

Recently uploaded (20)

Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*
 
ODC, Data Fabric and Architecture User Group
ODC, Data Fabric and Architecture User GroupODC, Data Fabric and Architecture User Group
ODC, Data Fabric and Architecture User Group
 
Leading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdfLeading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdf
 
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdfFIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
 
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdfSmart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
 
The Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and SalesThe Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and Sales
 
UiPath Test Automation using UiPath Test Suite series, part 3
UiPath Test Automation using UiPath Test Suite series, part 3UiPath Test Automation using UiPath Test Suite series, part 3
UiPath Test Automation using UiPath Test Suite series, part 3
 
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
 
PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)
 
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdfFIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
 
Accelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish CachingAccelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish Caching
 
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
 
JMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and GrafanaJMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and Grafana
 
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...
 
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered QualitySoftware Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
 
"Impact of front-end architecture on development cost", Viktor Turskyi
"Impact of front-end architecture on development cost", Viktor Turskyi"Impact of front-end architecture on development cost", Viktor Turskyi
"Impact of front-end architecture on development cost", Viktor Turskyi
 
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
 
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
 
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
 

Tomasz Nurkiewicz - Programowanie reaktywne: czego się nauczyłem