SlideShare a Scribd company logo
1 of 31
Download to read offline
AKKA STREAMS
FROM ZERO TO KAFKA
Createdby /MarkHarrison @markglh
HOW IT ALL BEGAN
“Reactive Streams is an initiative to provide a
standard for asynchronous stream processing
with non-blocking back pressure. This
encompasses efforts aimed at runtime
environments (JVM and JavaScript) as well as
network protocols.”
WHY
Ef ciently processing large indeterminate streams is hard
Avoiding blocking is essential to maximise performance
Every stage in the stream needs to be able to push and pull
We don't want to overload (or starve!) downstream
consumers...
HOW
Treat data as a stream of elements
Asynchronous non-blocking data and demand ows
Demand ows upstream, causing data to ow downstream
Data ow is therefore restricted by demand
Back Pressure!!
Demand happens on a separate ow!
WHAT
The Reactive Streams speci cation is just that
A collection of interfaces methods and protocols
Provides example implementations and a TCK for
veri cation
Aimed at providing a way to build common
implementations
INTRODUCING AKKA STREAMS!!
AKKA'S IMPLEMENTATION OF REACTIVE STREAMS
DESIGN PRINCIPLES
Explicitness over magic (I'm looking at you Shapeless!)
Fully composable
Each component, or set of componenents can be combined
Each building block is immutable
Fully compatible with other Reactive Stream implementations
BUILDING BLOCKS
BUILDING BLOCKS CONT...
Source
Traditionally known as a producer
Supplies messages that will ow downstream
Exactly one output stream
Sink
Traditionally known as a consumer
End point of the stream, this is where messages end up
BUILDING BLOCKS CONT...
Flow
A processing stage in the Stream
Used to compose Streams
Exactly one input and one output stream
See also BidirectionalFlow (two in -> two out)
BUILDING BLOCKS CONT...
RunnableGraphs
A pre-assembled set of Stream components, packaged into
a Graph.
All exposed ports are connected (between a Source and
Sink)
This can then be Materialized
BUILDING BLOCKS CONT...
Composite Flows
It is possible to wrap several components into more
complex ones
This composition can then be treated as one block
Partial Flow Graphs
An incomplete Flow (Graph)
Can be used to construct more complex Graphs easily
BUILDING BLOCKS CONT...
Materializer
Once complete, the ow is Materialized in order to start
stream processing
Supports fully distributed stream processing
Each step must be either serializable immutable values
or ActorRefs
Fails immediately at runtime if the Graph isn't complete
ERRORS VS FAILURES
Errors handlied within the stream as normal data elements
Passed using the onNext function
Failure means that the stream itself has failed and is collapsing
Raises the onError signal... (???)
Each block in the ow can choose to absorb or propagate the
errors
Possibly resulting the the complete collapse of the ow
FIRST THINGS FIRST
We need to create an ActorSystem and Materializer
implicit val system = ActorSystem("actors")
implicit val materializer = ActorMaterializer()
SIMPLE STREAM
We need to create an ActorSystem and Materializer
Source(1 to 5)
.filter(_ < 3) // 1, 2
.map(_ * 2) // 2, 4
.to(Sink.foreach(println))
.run()
//prints 2 4
COMPOSING ELEMENTS TOGETHER
We can combine multiple components together
Composing elements together
val nestedSource = Source(1 to 5)
.map(_ * 2)
val nestedFlow = Flow[Int]
.filter(_ <=
.map(_ + 2)
val sink = Sink.foreach(println)
//link up the Flow to a Sink
val nestedSink = nestedFlow.to(Sink.foreach(println))
// Create a RunnableGraph - and run it! Prints 4 6
nestedSource.to(nestedSink).run()
COMPOSING ELEMENTS TOGETHER CONT...
Alternatively we could do this, linking them in one step
nestedSource
.via(nestedFlow)
.to(Sink.foreach(println(_)))
COMPOSING ELEMENTS TOGETHER CONT...
GRAPH PROCESSING STAGES
Fan Out
Broadcast[T] – (1 input, N outputs)
Balance[T] – (1 input, N outputs)
...
Fan In
Merge[In] – (N inputs , 1 output)
...
Timer Driven
groupedWithin(Int, Duration)
Groups elements when either the number or duration is
reached (whichever is rst). Very useful for batching
messages.
See the Akka Stream docs for more!
GRAPH PROCESSING STAGES CONT...
THE GRAPH DSL
Whenever you want to perform multiple operations to
control the Flow of a Graph, manually constructing them as
above can become very clumbersome and tedius, not to
mentioned hard to maintain.
For this reason the Akka team have written a DSL to help
write complex Graphs.
THE GRAPH DSL
val g = FlowGraph.closed() {
implicit builder: FlowGraph.Builder[Unit] =>
//This provides the DSL
import FlowGraph.Implicits._
val in = Source(1 to 3)
val out = Sink.foreach(println)
//2 outputs, 2 inputs
val bcast = builder.add(Broadcast[Int](2))
val merge = builder.add(Merge[Int](2))
val f1, f2, f3, f4 = Flow[Int].map(_ + 10)
in ~> f1 ~> bcast ~> f2 ~> merge ~> f3 ~> out
bcast ~> f4 ~> merge
}
g.run() //Prints 31 31 32 32 33 33
THE GRAPH DSL CONT...
EXAMPLE - REACTIVE KAFKA
The guys at SoftwareMill have implemented a wrapper for
Apache Kafka
Tried and tested by yours truly
https://github.com/softwaremill/reactive-kafka
EXAMPLE - REACTIVE KAFKA CONT...
Source is a Kafka Consumer
Sink is a Kafka Publisher
val kafka = new ReactiveKafka()
val publisher: Publisher[StringKafkaMessage] =
kafka.consume(
ConsumerProperties(...)
)
val subscriber: Subscriber[String] =
kafka.publish(
ProducerProperties(...)
)
Source(publisher).map(_.message().toUpperCase)
.to(Sink(subscriber)).run()
A REAL WORLD EXAMPLE
A REAL WORLD EXAMPLE CONT...
FlowGraph.closed() {
implicit builder: FlowGraph.Builder[Unit] =>
import FlowGraph.Implicits._
val in = Source(kafkaConsumer)
val out = Sink.foreach(println)
val bcast = builder
.add(Broadcast[StringKafkaMessage](2))
val merge = builder
.add(Merge[StringKafkaMessage](2))
val parser1, parser2 = Flow[StringKafkaMessage]
.map(...)
val group = Flow[StringKafkaMessage].grouped(4)
in ~> bcast ~> parser1 ~> merge ~> group ~> out
bcast ~> parser2 ~> merge
}.run()
IT'S BEEN EMOTIONAL...
Slides at
Follow me
http://markglh.github.io/AkkaStreams-Madlab-
Slides
@markglh

More Related Content

Similar to Akka Streams - From Zero to Kafka

Introduction to apache_cassandra_for_developers-lhg
Introduction to apache_cassandra_for_developers-lhgIntroduction to apache_cassandra_for_developers-lhg
Introduction to apache_cassandra_for_developers-lhg
zznate
 
Apache Flink@ Strata & Hadoop World London
Apache Flink@ Strata & Hadoop World LondonApache Flink@ Strata & Hadoop World London
Apache Flink@ Strata & Hadoop World London
Stephan Ewen
 
Akka Http , Routes, Streams with Scala
Akka Http , Routes, Streams with ScalaAkka Http , Routes, Streams with Scala
Akka Http , Routes, Streams with Scala
Jerry Kuru
 

Similar to Akka Streams - From Zero to Kafka (20)

Porting a Streaming Pipeline from Scala to Rust
Porting a Streaming Pipeline from Scala to RustPorting a Streaming Pipeline from Scala to Rust
Porting a Streaming Pipeline from Scala to Rust
 
Build Real-Time Streaming ETL Pipelines With Akka Streams, Alpakka And Apache...
Build Real-Time Streaming ETL Pipelines With Akka Streams, Alpakka And Apache...Build Real-Time Streaming ETL Pipelines With Akka Streams, Alpakka And Apache...
Build Real-Time Streaming ETL Pipelines With Akka Streams, Alpakka And Apache...
 
A Brief Conceptual Introduction to Functional Java 8 and its API
A Brief Conceptual Introduction to Functional Java 8 and its APIA Brief Conceptual Introduction to Functional Java 8 and its API
A Brief Conceptual Introduction to Functional Java 8 and its API
 
Apache Spark Streaming: Architecture and Fault Tolerance
Apache Spark Streaming: Architecture and Fault ToleranceApache Spark Streaming: Architecture and Fault Tolerance
Apache Spark Streaming: Architecture and Fault Tolerance
 
Journey into Reactive Streams and Akka Streams
Journey into Reactive Streams and Akka StreamsJourney into Reactive Streams and Akka Streams
Journey into Reactive Streams and Akka Streams
 
The Cloud-natives are RESTless @ JavaOne
The Cloud-natives are RESTless @ JavaOneThe Cloud-natives are RESTless @ JavaOne
The Cloud-natives are RESTless @ JavaOne
 
Building a High-Performance Database with Scala, Akka, and Spark
Building a High-Performance Database with Scala, Akka, and SparkBuilding a High-Performance Database with Scala, Akka, and Spark
Building a High-Performance Database with Scala, Akka, and Spark
 
Back-Pressure in Action: Handling High-Burst Workloads with Akka Streams & Ka...
Back-Pressure in Action: Handling High-Burst Workloads with Akka Streams & Ka...Back-Pressure in Action: Handling High-Burst Workloads with Akka Streams & Ka...
Back-Pressure in Action: Handling High-Burst Workloads with Akka Streams & Ka...
 
Back-Pressure in Action: Handling High-Burst Workloads with Akka Streams & Kafka
Back-Pressure in Action: Handling High-Burst Workloads with Akka Streams & KafkaBack-Pressure in Action: Handling High-Burst Workloads with Akka Streams & Kafka
Back-Pressure in Action: Handling High-Burst Workloads with Akka Streams & Kafka
 
Introduction to apache_cassandra_for_developers-lhg
Introduction to apache_cassandra_for_developers-lhgIntroduction to apache_cassandra_for_developers-lhg
Introduction to apache_cassandra_for_developers-lhg
 
Spark Streaming Recipes and "Exactly Once" Semantics Revised
Spark Streaming Recipes and "Exactly Once" Semantics RevisedSpark Streaming Recipes and "Exactly Once" Semantics Revised
Spark Streaming Recipes and "Exactly Once" Semantics Revised
 
Apache Flink@ Strata & Hadoop World London
Apache Flink@ Strata & Hadoop World LondonApache Flink@ Strata & Hadoop World London
Apache Flink@ Strata & Hadoop World London
 
KSQL - Stream Processing simplified!
KSQL - Stream Processing simplified!KSQL - Stream Processing simplified!
KSQL - Stream Processing simplified!
 
H2O Design and Infrastructure with Matt Dowle
H2O Design and Infrastructure with Matt DowleH2O Design and Infrastructure with Matt Dowle
H2O Design and Infrastructure with Matt Dowle
 
Akka Http , Routes, Streams with Scala
Akka Http , Routes, Streams with ScalaAkka Http , Routes, Streams with Scala
Akka Http , Routes, Streams with Scala
 
Akka Microservices Architecture And Design
Akka Microservices Architecture And DesignAkka Microservices Architecture And Design
Akka Microservices Architecture And Design
 
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
 
Quantifying Container Runtime Performance: OSCON 2017 Open Container Day
Quantifying Container Runtime Performance: OSCON 2017 Open Container DayQuantifying Container Runtime Performance: OSCON 2017 Open Container Day
Quantifying Container Runtime Performance: OSCON 2017 Open Container Day
 
Reactive Streams - László van den Hoek
Reactive Streams - László van den HoekReactive Streams - László van den Hoek
Reactive Streams - László van den Hoek
 
CBStreams - Java Streams for ColdFusion (CFML)
CBStreams - Java Streams for ColdFusion (CFML)CBStreams - Java Streams for ColdFusion (CFML)
CBStreams - Java Streams for ColdFusion (CFML)
 

Recently uploaded

%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
masabamasaba
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
masabamasaba
 
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
masabamasaba
 
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
masabamasaba
 

Recently uploaded (20)

Architecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastArchitecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the past
 
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
 
WSO2Con204 - Hard Rock Presentation - Keynote
WSO2Con204 - Hard Rock Presentation - KeynoteWSO2Con204 - Hard Rock Presentation - Keynote
WSO2Con204 - Hard Rock Presentation - Keynote
 
%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand
 
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
 
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
 
Artyushina_Guest lecture_YorkU CS May 2024.pptx
Artyushina_Guest lecture_YorkU CS May 2024.pptxArtyushina_Guest lecture_YorkU CS May 2024.pptx
Artyushina_Guest lecture_YorkU CS May 2024.pptx
 
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
 
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
 
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
 
AI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplateAI & Machine Learning Presentation Template
AI & Machine Learning Presentation Template
 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learn
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
 
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
 
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
%+27788225528 love spells in Boston Psychic Readings, Attraction spells,Bring...
 
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
 
WSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go PlatformlessWSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go Platformless
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 

Akka Streams - From Zero to Kafka

  • 1. AKKA STREAMS FROM ZERO TO KAFKA Createdby /MarkHarrison @markglh
  • 2. HOW IT ALL BEGAN “Reactive Streams is an initiative to provide a standard for asynchronous stream processing with non-blocking back pressure. This encompasses efforts aimed at runtime environments (JVM and JavaScript) as well as network protocols.”
  • 3. WHY Ef ciently processing large indeterminate streams is hard Avoiding blocking is essential to maximise performance Every stage in the stream needs to be able to push and pull We don't want to overload (or starve!) downstream consumers...
  • 4.
  • 5. HOW Treat data as a stream of elements Asynchronous non-blocking data and demand ows Demand ows upstream, causing data to ow downstream Data ow is therefore restricted by demand Back Pressure!! Demand happens on a separate ow!
  • 6. WHAT The Reactive Streams speci cation is just that A collection of interfaces methods and protocols Provides example implementations and a TCK for veri cation Aimed at providing a way to build common implementations
  • 7. INTRODUCING AKKA STREAMS!! AKKA'S IMPLEMENTATION OF REACTIVE STREAMS
  • 8. DESIGN PRINCIPLES Explicitness over magic (I'm looking at you Shapeless!) Fully composable Each component, or set of componenents can be combined Each building block is immutable Fully compatible with other Reactive Stream implementations
  • 10. BUILDING BLOCKS CONT... Source Traditionally known as a producer Supplies messages that will ow downstream Exactly one output stream Sink Traditionally known as a consumer End point of the stream, this is where messages end up
  • 11. BUILDING BLOCKS CONT... Flow A processing stage in the Stream Used to compose Streams Exactly one input and one output stream See also BidirectionalFlow (two in -> two out)
  • 12. BUILDING BLOCKS CONT... RunnableGraphs A pre-assembled set of Stream components, packaged into a Graph. All exposed ports are connected (between a Source and Sink) This can then be Materialized
  • 13. BUILDING BLOCKS CONT... Composite Flows It is possible to wrap several components into more complex ones This composition can then be treated as one block Partial Flow Graphs An incomplete Flow (Graph) Can be used to construct more complex Graphs easily
  • 14. BUILDING BLOCKS CONT... Materializer Once complete, the ow is Materialized in order to start stream processing Supports fully distributed stream processing Each step must be either serializable immutable values or ActorRefs Fails immediately at runtime if the Graph isn't complete
  • 15. ERRORS VS FAILURES Errors handlied within the stream as normal data elements Passed using the onNext function Failure means that the stream itself has failed and is collapsing Raises the onError signal... (???) Each block in the ow can choose to absorb or propagate the errors Possibly resulting the the complete collapse of the ow
  • 16.
  • 17. FIRST THINGS FIRST We need to create an ActorSystem and Materializer implicit val system = ActorSystem("actors") implicit val materializer = ActorMaterializer()
  • 18. SIMPLE STREAM We need to create an ActorSystem and Materializer Source(1 to 5) .filter(_ < 3) // 1, 2 .map(_ * 2) // 2, 4 .to(Sink.foreach(println)) .run() //prints 2 4
  • 19. COMPOSING ELEMENTS TOGETHER We can combine multiple components together Composing elements together val nestedSource = Source(1 to 5) .map(_ * 2) val nestedFlow = Flow[Int] .filter(_ <= .map(_ + 2) val sink = Sink.foreach(println) //link up the Flow to a Sink val nestedSink = nestedFlow.to(Sink.foreach(println)) // Create a RunnableGraph - and run it! Prints 4 6 nestedSource.to(nestedSink).run()
  • 20. COMPOSING ELEMENTS TOGETHER CONT... Alternatively we could do this, linking them in one step nestedSource .via(nestedFlow) .to(Sink.foreach(println(_)))
  • 22. GRAPH PROCESSING STAGES Fan Out Broadcast[T] – (1 input, N outputs) Balance[T] – (1 input, N outputs) ... Fan In Merge[In] – (N inputs , 1 output) ... Timer Driven groupedWithin(Int, Duration) Groups elements when either the number or duration is reached (whichever is rst). Very useful for batching messages. See the Akka Stream docs for more!
  • 24. THE GRAPH DSL Whenever you want to perform multiple operations to control the Flow of a Graph, manually constructing them as above can become very clumbersome and tedius, not to mentioned hard to maintain. For this reason the Akka team have written a DSL to help write complex Graphs.
  • 25. THE GRAPH DSL val g = FlowGraph.closed() { implicit builder: FlowGraph.Builder[Unit] => //This provides the DSL import FlowGraph.Implicits._ val in = Source(1 to 3) val out = Sink.foreach(println) //2 outputs, 2 inputs val bcast = builder.add(Broadcast[Int](2)) val merge = builder.add(Merge[Int](2)) val f1, f2, f3, f4 = Flow[Int].map(_ + 10) in ~> f1 ~> bcast ~> f2 ~> merge ~> f3 ~> out bcast ~> f4 ~> merge } g.run() //Prints 31 31 32 32 33 33
  • 26. THE GRAPH DSL CONT...
  • 27. EXAMPLE - REACTIVE KAFKA The guys at SoftwareMill have implemented a wrapper for Apache Kafka Tried and tested by yours truly https://github.com/softwaremill/reactive-kafka
  • 28. EXAMPLE - REACTIVE KAFKA CONT... Source is a Kafka Consumer Sink is a Kafka Publisher val kafka = new ReactiveKafka() val publisher: Publisher[StringKafkaMessage] = kafka.consume( ConsumerProperties(...) ) val subscriber: Subscriber[String] = kafka.publish( ProducerProperties(...) ) Source(publisher).map(_.message().toUpperCase) .to(Sink(subscriber)).run()
  • 29. A REAL WORLD EXAMPLE
  • 30. A REAL WORLD EXAMPLE CONT... FlowGraph.closed() { implicit builder: FlowGraph.Builder[Unit] => import FlowGraph.Implicits._ val in = Source(kafkaConsumer) val out = Sink.foreach(println) val bcast = builder .add(Broadcast[StringKafkaMessage](2)) val merge = builder .add(Merge[StringKafkaMessage](2)) val parser1, parser2 = Flow[StringKafkaMessage] .map(...) val group = Flow[StringKafkaMessage].grouped(4) in ~> bcast ~> parser1 ~> merge ~> group ~> out bcast ~> parser2 ~> merge }.run()
  • 31. IT'S BEEN EMOTIONAL... Slides at Follow me http://markglh.github.io/AkkaStreams-Madlab- Slides @markglh