Reactive Manifesto
6 years later
Krzysztof Ciesielski
@kpciesielski


Reactive Manifesto
22.08.2013, Jonas Boner
16.09.2014 version 2.0
Jonas Bonér, Dave Farley, Roland Kuhn, and Martin Thompson. With the help and refinement of many members in the community.

Reactive
Another buzzword?
Has it got adapter like "Microservices"?
Or rather ended up like "BigData"?

versus
Reactive Programming
Reactive System Design

Main goal of the Manifesto
means:
- Microservices
- Message-driven / Event-driven architecture
- Stream processing
- Autoscaling
- Reactive programming
Reactive System Design

microservices
scalability
reacting to changing load = elastic)
failure isolation (resilient)
simpler deployments
better maintainability
Communication: asynchronous, often non-blocking
Reactive System Design

message-driven
Reactive Systems rely on asynchronous message-passing to establish a boundary between components that ensures loose coupling, isolation and location transparency. This boundary also provides the means to delegate failures as messages.
Reactive System Design

streaming
Samza, Spark Streaming, Flink, AWS Kinesis
Development powered by Machine Learning
Why reactive?
elastic, fault-tolerant (resilience)
"reacting to changes"
Reactive System Design

autoscaling
DevOps/Cloud explosion
Kubernetes, AWS (Fargate), sophisticated monitoring and alerting (like VictorOps)
Reactive System Design

Practices and tools for building code which is:
- asynchronous, nonblocking
- without explicit coordination between components
- declarative: expressing high-level intentions instead of direct instructions
Describing processing logic, not flow control.
Reactive Programming

Declarative code
Description of transformations


Observer pattern
Hollywood Principle ("Don't call us, we'll call you")

Source: https://www.tomaszezula.com/2018/12/10/observer-pattern-in-rxjava/
Reactive Programming

Future[T] / scalaz Task[T]
Actor Model
RxJava
Vert.x
2014
What is happening in the JVM ecosystem
Reactive Programming

Reactive Streams
Akka Streams
scalaz-stream
Apache Kafka 0.8.1
2014
Reactive Programming
What is happening in the JVM ecosystem

Vaughn Vernon
Reactive Messaging Patterns with the Actor Model

Reactive Programming
2015

Work Pulling (Akka)

Source: https://redsigil.weebly.com/home/akka-work-pulling-pattern-and-some-background
Reactive Programming

Project Reactor (Java)

Source: https://speakerdeck.com/simonbasle/projectreactor-dot-io-reactor3-intro
Reactive Programming
2015

Source: https://speakerdeck.com/simonbasle/projectreactor-dot-io-reactor3-intro

Reactive Programming
2015
Project Reactor (Java)

Spring Framework 5 embraces Reactive Streams and Reactor for its own reactive use as well as in many of its core APIs.


Source: http://mdabrowski.net/spring-boot-2-reaktywny-spring-webflux/
Reactive Programming
2016

Akka Persistence, Streams + Alpakka
Kafka 2.3
RxJava
Vert.x
Functional Reactive Programming (FRP)
Cats-Effect, Monix, ZIO
Reactive Programming
2019

val streamGraph = tweets
.filter(_.hashtags contains akkaTag)
.buffer(1000)
.map(t => 1)
.toMat(Sink.fold[Int, Int](0)(_ + _))(Keep.right)
val result: Future[Int] = streamGraph.run()2019
Reactive Programming

val streamGraph = tweets
.filter(_.hashtags contains akkaTag)
.buffer(1000)
.map(t => 1)
.toMat(Sink.fold[Int, Int](0)(_ + _))(Keep.right)
val result: Future[Int] = streamGraph.run()

def process(tweet: Tweet): Future[ProcessedTweet] = ???
val streamGraph = tweets
.filter(_.hashtags contains akkaTag)
.mapAsync(parallelism = 3)(process)
.toMat(sink)(Keep.right)


Akka Streams + Alpakka, Kafka 2.3
val ks: UniqueKillSwitch =
RestartSource
.withBackoff(
minBackoff = config.restart.minBackoff,
maxBackoff = config.restart.maxBackoff,
randomFactor = config.restart.randomFactor
)(() => {
eventSource
.via(preProcessFlow)
.via(pipeline)
.via(postProcessFlow)
.withAttributes(supervisionStrategy(decider))
})
.viaMat(KillSwitches.single)(Keep.right)
.toMat(Sink.ignore)(Keep.left)
.run()
2019
Reactive Programming

zio-kafka
val consumer = Consumer.make(consumerSettings, Serde.string, Serde.string.asTry)
val stream = Consumer
.subscribeAnd[Any, String, Try[String]](Subscription.topics("topic150"))
.plainStream
stream
.mapM { record =>
val tryValue: Try[String] = record.record.value()
val offset: Offset = record.offset
tryValue match {
case Success(value) =>
// Action for successful deserialization
someEffect(value).as(offset)
case Failure(exception) =>
// Possibly log the exception or take alternative action
ZIO.succeed(offset)
}
}
.flattenChunks
.aggregateAsync(Consumer.offsetBatches)
.mapM(_.commit)
.runDrain
.provideSomeLayer(consumer)2020
Reactive Programming

Reactive Design: The dark side
- Entry threshold
- Debugging
- Orchestration infrastructure
- Observability: Logging, monitoring, tracing
- Testing
Tomek Nurkiewicz: "Reactive Programming, lessons learned"
Andrzej Ludwikowski: "Event Sourcing - what could possibly go wrong?"

Where to start?

https://www.lightbend.com/learn/lightbend-reactive-architecture

Reactive Manifesto
2020

Thank You!
@kpciesielski




Reactive Manifesto 6 years later
By Krzysztof Ciesielski
Reactive Manifesto 6 years later
Do you remember how the buzzword "reactive" emerged? In this talk, we will briefly go through its history, then we will examine what it really means today in the context of the current state of the Scala ecosystem. We will compare reactive programming with reactive system design and try to conclude whether the Manifesto is still valid and important.
- 382