Reactive Manifesto

 6 years later

Krzysztof Ciesielski

@kpciesielski

 

ScalaUA 2020

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

Kolejny buzzword?

Czy przyjął się tak jak "Mikroserwisy"?

Podzielił los "BigData"?

versus

Reactive Programming

Reactive System Design

Główny cel Reactive Manifesto

środki:

  • Mikroserwisy
  • Message-driven / Event-driven architecture
  • Przetwarzanie strumieniowe
  • Autoskalowanie
  • Reactive programming

Reactive System Design

 mikroserwisy 

możliwości skalowania

(reagowanie na zmiany obciążenia, elastic)

 

izolowanie błędów (resilient)

 

łatwiejsze wdrożenia

łatwiejsze utrzymanie

Komunikacja: może być message-driven

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

Rozwój napędzany przez Machine Learning

Dlaczego reactive?

elastic, fault-tolerant (resilience)

 "reagowanie na zmiany"

Reactive System Design

autoscaling

Eksplozja DevOps/Cloud

Kubernetes, usługi AWS (np Fargate), systemy monitoringu i automatycznego reagowania (np VictorOps)

Reactive System Design

Praktyki i narzędzia pozwalające budować kod:

  • asynchroniczny, nieblokujący
  • bez jawnej koordynacji między komponentami
     
  • deklaratywny: wyrażający wysokopoziomowe intencje zamiast instrukcji.


Opisujący logikę przetwarzania, a nie przepływ sterowania.

Reactive Programming

Kod deklaratywny

Opis transformacji

Observer pattern

 

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

Źródło: https://www.tomaszezula.com/2018/12/10/observer-pattern-in-rxjava/

Reactive Programming

Future[T] / scalaz Task[T]

Actor Model

RxJava

Vert.x

2014

Co się dzieje w ekosystemie

Reactive Programming

Reactive Streams

Akka Streams

scalaz-stream


Apache Kafka 0.8.1

2014

Co się dzieje w ekosystemie

Reactive Programming

Vaughn Vernon

 

Reactive Messaging Patterns with the Actor Model

 

 

2015

Reactive Programming

Work Pulling (Akka)

Źródło: https://redsigil.weebly.com/home/akka-work-pulling-pattern-and-some-background

Reactive Programming

Project Reactor (Java)

Żródło: https://speakerdeck.com/simonbasle/projectreactor-dot-io-reactor3-intro

2015

Reactive Programming

Żródło: https://speakerdeck.com/simonbasle/projectreactor-dot-io-reactor3-intro

Project Reactor (Java)

2015

Reactive Programming

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

2016

Źródło: http://mdabrowski.net/spring-boot-2-reaktywny-spring-webflux/

Reactive Programming

Akka Persistence, Streams + Alpakka

Kafka 2.3

RxJava

Vert.x

 

 

Functional Reactive Programming (FRP)

Cats-Effect, ZIO, Monix

JEE: Asynchronous CDI Events?

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

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

tweets

map

filter

Sink.fold

t

t

t

t

t

t

t

1

Flowable<Tweet> blocking = Flowable
        .fromCallable(() -> {
            // tweet processing
        });


Flowable<Tweet> source = Flowable
                            .fromIterable(listOf(tweet1, tweet2, tweet3))


Flowable<Any> stream = source
  .filter(tweet -> tweet.hashtags.contains(akkaTag))
  .flatMap({ a: Tweet -> process(a) }, 3)
def process(tweet: Tweet): Future[ProcessedTweet] = ???
    
val streamGraph = tweets
  .filter(_.hashtags contains akkaTag)
  .mapAsync(parallelism = 3)(process)
  .toMat(sink)(Keep.right)

tweets

process

 

filter

process

 

process

 

sink

 

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

Mroczna strona

  • Próg wejścia
  • Debugging
  • Infrastruktura do zarządzania
  • Logging, monitoring, tracing
  • Testowanie

Tomek Nurkiewicz: "Reactive Programming, lessons learned"

Andrzej Ludwikowski: "Event Sourcing - co może pójść nie tak?"

Jak zacząć?

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

Reactive Manifesto

2019

Dziękuję!

@kpciesielski

https://softwaremill.com/join-us/

Reactive Manifesto 6 lat później

By Krzysztof Ciesielski

Reactive Manifesto 6 lat później

Kiedy wybuchł boom na "reactive" pojawiło się sporo dyskusji na temat tego, czy to cokolwiek wnosi, czy to tylko kolejny buzzword. Teraz, prawie 5 lat później, spojrzymy krytycznie na założenia tego manifestu, czy to podejście faktycznie się sprawdza, jak zmieniły się technologie, systemy i podejście do designu pod wpływem tego nurtu. Ustalmy konkretnie, czy "reactive" coś dziś znaczy i jakie ma konsekwencje.

  • 391