Konrad `ktoso` Malawski @ Scala Matsuri 2017 @ Tokyo
Survival guide for the
Streaming World
Akka-chan’s
Me, Tokyo & Akka Streams…
The road to 2017…
2014年: リアクティブストリーム始動
0.7
Early preview
RS started (late 2013)
2014
2016年: JDK 9 への導入決定
Reactive Streams started in late 2013,
initiated by Roland Kuhn,Viktor Klang, Erik Meijer, Ben Christiansen
0.7
Early preview
RS begins!
2.0
Experimental
RS on way to JDK9
2014 2016
2014年: リアクティブストリーム始動2017年: 安定版。リアクティブストリーム付きの JDK9。
0.7
Early preview
RS begins!
2.0
Experimental
RS on way to JDK9
2.4.17 + 10.0.3
Fully stable
RS in JDK9 (!)
2014 2016 2017
2014年: リアクティブストリーム始動2016年: JDK 9 への導入決定
Konrad `ktoso` Malawski
Akka Team,
Reactive Streams TCK,
Scala SLIP Committee member
Konrad `@ktosopl` Malawski
work: akka.io lightbend.com
personal blog: http://kto.so
communities: geecon.org Java.pl / KrakowScala.pl sckrk.com GDGKrakow.pl lambdakrk.pl
Konrad `@ktosopl` Malawski
work: akka.io lightbend.com
personal blog: http://kto.so
communities: geecon.org Java.pl / KrakowScala.pl sckrk.com GDGKrakow.pl lambdakrk.pl
2017年: 安定版。リアクティブストリーム付きの JDK9。
The concurrent & distributed applications toolkit
Akka is a toolkit and runtime for building
highly concurrent, distributed, and resilient
message-driven applications on the JVM
2017年: 安定版。リアクティブストリーム付きの JDK9。
Actors – Concurrency / high perf. messaging
Cluster – Location transparent, resilient clusters
Persistence – EventSourcing support (many DBs)
Distributed Data – Availability-first gossiped CRDTs
HTTP – Fully Async & Reactive Http Server (Websockets, Http/2)
soon:

Typed – really well-typed Actors, coming this year
…and much more (kafka, cassandra, testing, …)
“Stream”
“Stream”
なんですか?
2017年: 安定版。リアクティブストリーム付きの JDK9。
Suddenly everyone jumped on the word “Stream”.
Akka Streams / Reactive Streams started end-of-2013.
“Streams”
* when put in “” the word does not appear in project name, but is present in examples / style of APIs / wording.
Suddenly everyone jumped on the word “Stream”.
Akka Streams / Reactive Streams started end-of-2013.
The word “Stream” is used in many contexts/meanings
Akka Streams
Reactive Streams
RxJava “streams”*
Spark Streaming
Apache Storm “streams”*
Java Steams (JDK8)
Reactor “streams”*
Kafka Streams
ztellman / Manifold (Clojure)
* when put in “” the word does not appear in project name, but is present in examples / style of APIs / wording.
Apache GearPump “streams”
Apache [I] Streams (!)
Apache [I] Beam “streams”
Apache [I] Quarks “streams”
Apache [I] Airflow “streams” (dead?)
Apache [I] Samza
Scala Stream
Scalaz Streams, now known as FS2
Swave.io
Java InputStream / OutputStream / … :-)
2017年: 安定版。リアクティブストリーム付きの JDK9。
“Stream”
What does it mean?!
• Possibly infinite datasets (“streams”)
• “Streams are NOT collections.”
• Processed element-by-element
• Element could mean “byte”
• More usefully though it means a specific type “T”
• Asynchronous processing
• Asynchronous boundaries (between threads)
• Network boundaries (between machines)
2017年: 安定版。リアクティブストリーム付きの JDK9。
The new “big data” is “fast data”.
Enabled by reactive building blocks.
“Fast Data”
2017年: 安定版。リアクティブストリーム付きの JDK9。
The typical “big data” architecture
ever since Hadoop entered the market
Legacy Hadoop architectures would mostly look like this:
(legacy, batch oriented architectures)
典型的な「ビッグデータ」アーキテクチャ
The typical “big data” architecture
ever since Hadoop entered the market
Legacy Hadoop architectures would mostly look like this:
(legacy, batch oriented architectures)
典型的な「ビッグデータ」アーキテクチャ
Fast Data – architecture example
Many of these technologies compose together into what we call Fast Data architectures.
典型的な「ビッグデータ」アーキテクチャ
Fast Data – architecture example
It’s like big-data, but FAST - which often implies various kinds of streaming.
典型的な「ビッグデータ」アーキテクチャ
Where does Akka Stream fit?
Akka Streams specifically fits,
if you answer yes to any of these:
• Should it take on public traffic?
• Processing in hot path for requests?
• Integrate various technologies?
• Protect services from over-load?
• Introspection, debugging, excellent Akka integration?
• (vs. other reactive-stream impls.)
以上の質問に「はい」と答えた場合は Akka Stream に向いている
How do I pick which “streaming” I need?
Kafka serves best as a transport
for pub-sub across services.
• Note that Kafka Streams (db ops are on the node) 

is rather, different than the Reactive Kafka client
• Great for cross-service communication 

instead of HTTP Request / Reply
Kafka はサービス間の pub-sub 通信に向いている

HTTP の代わりにサービス間の通信に使う
How do I pick which “streaming” I need?
Spark has vast libraries for ML or join etc ops.
• It’s the “hadoop replacement”.
• Spark Streaming is windowed-batches
• Latency anywhere up from 0.5~1second
• Great for cross-service communication 

instead of HTTP Req/Reply
Spark は機械学習系が充実している
Oh yeah, there’s JDK8 “Stream” too!
Terrible naming decision IMHO, since Java’s .stream()
• Geared for collections
• Best for finite and known-up-front data
• Lazy, sync/async (async rarely used)
• Very (!) hard to extend
It’s the opposite what we talk about in Streaming systems!
It’s more:“bulk collection operations”
Also known as… Scala collections API (i.e. Iterator
JDK8 の Stream はイテレータ的なもの
What about JDK9 “Flow”?
JDK9 introduces java.util.concurrent.Flow
• Is a 1:1 copy of the Reactive Streams interfaces
• On purpose, for people to be able to impl. it
• Does not provide useful implementations
• Is only the inter-op interfaces
• Libraries like Akka Streams implement RS,

and expose useful APIs for you to use.
JDK9 の Flow はリアクティブ・ストリーム
And the many meanings it carries.
Reactive
And the many meanings it carries.
Reactive
The many meanings of Reactive
reactivemanifesto.org
The many meanings of Reactive
So what are Reactive Streams actually?
So what are Reactive Streams actually?
So what are Reactive Streams actually?
Getting the complete picture
Getting the complete picture
(yet… not the topic of today’s talk)
How to think about these techniques?
bit.ly/why-reactive
“Not-quite-Reactive-System”
The reason we started researching
into transparent to users flow control.
“Best practices are solutions
to yesterdays problems.”
https://twitter.com/FrankBuytendijk/status/795555578592555008
Circuit breaking as substitute of flow-control
See also, Nitesh Kant, Netflix @ Reactive Summit
https://www.youtube.com/watch?v=5FE6xnH5Lak
See also, Nitesh Kant, Netflix @ Reactive Summit
https://www.youtube.com/watch?v=5FE6xnH5Lak
HTTP/1.1 503 Service Unavailable
HTTP/1.1 503 Service Unavailable
Throttling as represented by 503 responses. Client will back-off… but how?
What if most of the fleet is throttling?
http://doc.akka.io/docs/akka/2.4/common/circuitbreaker.html
HTTP/1.1 503 Service Unavailable
HTTP/1.1 503 Service Unavailable
http://doc.akka.io/docs/akka/2.4/common/circuitbreaker.html
See also, Nitesh Kant, Netflix @ Reactive Summit
https://www.youtube.com/watch?v=5FE6xnH5Lak
“slamming the breaks”
See also, Nitesh Kant, Netflix @ Reactive Summit
https://www.youtube.com/watch?v=5FE6xnH5Lak
“slamming the breaks”
See also, Nitesh Kant, Netflix @ Reactive Summit
https://www.youtube.com/watch?v=5FE6xnH5Lak
“slamming the breaks”
See also, Nitesh Kant, Netflix @ Reactive Summit
https://www.youtube.com/watch?v=5FE6xnH5Lak
“slamming the breaks”
See also, Nitesh Kant, Netflix @ Reactive Summit
https://www.youtube.com/watch?v=5FE6xnH5Lak
“slamming the breaks”
See also, Nitesh Kant, Netflix @ Reactive Summit
https://www.youtube.com/watch?v=5FE6xnH5Lak
We’ll re-visit this specific case in a bit :-)
“slamming the breaks”
Are absolutely useful!
Still… “We can do better than that.”
Circuit Breakers
But we’ll need everyone to understand
some shared semantics…
We can do better.
A fundamental building block.
Not end-user API by itself.
reactive-streams.org
Reactive Streams
Reactive Streams
More of an SPI (Service Provider Interface),
than API.
reactive-streams.org
The specification.
Reactive Streams
Origins of
What is back-pressure?
?
What is back-pressure?
No no no…!
Not THAT Back-pressure!
Also known as:
flow control.
What is back-pressure?
No no no…!
Not THAT Back-pressure!
Also known as:
application level flow control.
What is back-pressure?
Reactive Streams - story: 2013’s impls
~2013:
Reactive Programming
becoming widely adopted on JVM.
- Play introduced “Iteratees”
- Akka (2009) had Akka-IO (TCP etc.)
- Ben starts work on RxJava
http://blogs.msdn.com/b/rxteam/archive/2009/11/17/announcing-reactive-extensions-rx-for-net-silverlight.aspx
http://infoscience.epfl.ch/record/176887/files/DeprecatingObservers2012.pdf - Ingo Maier, Martin Odersky
https://github.com/ReactiveX/RxJava/graphs/contributors
https://github.com/reactor/reactor/graphs/contributors
https://medium.com/@viktorklang/reactive-streams-1-0-0-interview-faaca2c00bec#.69st3rndy
Teams discuss need for back-pressure
in simple user API.
Play’s Iteratee / Akka’s NACK in IO.
}
Reactive Streams - story: 2013’s impls
2014–2015:
Reactive Streams Spec & TCK
development, and implementations.
1.0 released on April 28th 2015,
with 5+ accompanying implementations.
2015
Proposed to be included with JDK9 by Doug Lea
via JEP-266 “More Concurrency Updates”
http://hg.openjdk.java.net/jdk9/jdk9/jdk/file/6e50b992bef4/src/java.base/share/classes/java/util/concurrent/Flow.java
But what does it do!?
Reactive Streams
Publisher[T] Subscriber[T]
Back-pressure explained
Fast Publisher Slow Subscriber
Push model
Subscriber usually has some kind of buffer.
Push model
Push model
Push model
What if the buffer overflows?
Push model
Use bounded buffer,
drop messages + require re-sending
Push model
Kernel does this!
Routers do this!
(TCP)
Use bounded buffer,
drop messages + require re-sending
Push model
Increase buffer size…
Well, while you have memory available!
Push model
Push model
Reactive Streams explained
Reactive Streams
explained in 1 slide
Fast Publisher will send at-most 3 elements.
This is pull-based-backpressure.
Reactive Streams: “dynamic push/pull”
JEP-266 – soon…!
public final class Flow {
private Flow() {} // uninstantiable
@FunctionalInterface
public static interface Publisher<T> {
public void subscribe(Subscriber<? super T> subscriber);
}
public static interface Subscriber<T> {
public void onSubscribe(Subscription subscription);
public void onNext(T item);
public void onError(Throwable throwable);
public void onComplete();
}
public static interface Subscription {
public void request(long n);
public void cancel();
}
public static interface Processor<T,R> extends Subscriber<T>, Publisher<R> {
}
}
JEP-266 – soon…!
public final class Flow {
private Flow() {} // uninstantiable
@FunctionalInterface
public static interface Publisher<T> {
public void subscribe(Subscriber<? super T> subscriber);
}
public static interface Subscriber<T> {
public void onSubscribe(Subscription subscription);
public void onNext(T item);
public void onError(Throwable throwable);
public void onComplete();
}
public static interface Subscription {
public void request(long n);
public void cancel();
}
public static interface Processor<T,R> extends Subscriber<T>, Publisher<R> {
}
}
Single basic (helper) implementation available in JDK:
SubmissionPublisher
Reactive Streams: goals
1) Avoiding unbounded buffering across async boundaries
2)Inter-op interfaces between various libraries
Reactive Streams: goals
1) Avoiding unbounded buffering across async boundaries
2)Inter-op interfaces between various libraries
Argh, implementing a correct
RS Publisher or Subscriber is so hard!
1) Avoiding unbounded buffering across async boundaries
2)Inter-op interfaces between various libraries
Reactive Streams: goals
Argh, implementing a correct RS Publisher
or Subscriber is so hard!
Reactive Streams: goals
Argh, implementing a correct
RS Publisher or Subscriber is so hard!
You should be using
Akka Streams instead!
1) Avoiding unbounded buffering across async boundaries
2)Inter-op interfaces between various libraries
Already made a huge industry impact
Reactive Streams
Back-pressure as a feature
Inspiring other technologies
Inspiring other technologies
It’s been a while since Java inspired
other modern technologies, hasn’t it?
The implementation.
Complete and awesome Java and Scala APIs.
As everything since day 1 in Akka.
Akka Streams
Akka Streams in 20 seconds:
// types:
Source[Out, Mat]
Flow[In, Out, Mat]
Sink[In, Mat]
// generally speaking, it's always:
val ready =
Source.from…(???).via(flow).map(i => i * 2).to(sink)
val mat: Mat = ready.run()
// the usual example:
val f: Future[String] =
Source.single(1).map(i => i.toString).runWith(Sink.head)
Proper static typing!
Akka Streams in 20 seconds:
// types: _
Source[Int, NotUsed]
Flow[Int, String, NotUsed]
Sink[String, Future[String]]
Source.single(1).map(i => i / 0).runWith(Sink.head)
Source.single(1).map(i => i.toString).runWith(Sink.head)
// types: _
Source[Int, NotUsed]
Flow[Int, String, NotUsed]
Sink[String, Future[String]]
Akka Streams in 20 seconds:
Your app has specific needs
Your app has specific needs
Your app has specific needs
Your app has specific needs
Your app has specific needs
Ecosystem that solves problems
> (is greater than)
solving all the problems ourselves
Codename:
Alpakka
// these are “Alpacasso”
A community for Streams connectors
Alpakka – a community for Stream connectors
Alp
Alpakka – a community for Stream connectors
http://developer.lightbend.com/docs/alpakka/current/
Alpakka – a community for Stream connectors
http://developer.lightbend.com/docs/alpakka/current/
Krzysztof Ciesielski
Reactive Kafka (Alpakka) maintainer
Room B @ 15:30,1日
Alpakka – a community for Stream connectors
http://developer.lightbend.com/docs/alpakka/current/
Alpakka – a community for Stream connectors
http://developer.lightbend.com/docs/alpakka/current/
Backpressure in action, visualized
streams
& HTTP
A core feature not obvious to the untrained eye…!
Quiz time!
TCP is a ______ protocol?
Akka Streams & HTTP
A core feature not obvious to the untrained eye…!
Quiz time!
TCP is a STREAMING protocol!
Akka Streams & HTTP
Streaming in Akka HTTP
HttpServer as a:
Flow[HttpRequest, HttpResponse]
http://doc.akka.io/docs/akka/2.4/scala/stream/stream-customize.html#graphstage-scala
“Framed entity streaming” https://github.com/akka/akka/pull/20778
Streaming in Akka HTTP
HttpServer as a:
Flow[HttpRequest, HttpResponse]
HTTP Entity as a:
Source[ByteString, _]
http://doc.akka.io/docs/akka/2.4/scala/stream/stream-customize.html#graphstage-scala
“Framed entity streaming” https://github.com/akka/akka/pull/20778
Streaming in Akka HTTP
http://doc.akka.io/docs/akka/2.4/scala/stream/stream-customize.html#graphstage-scala
“Framed entity streaming” https://github.com/akka/akka/pull/20778
HttpServer as a:
Flow[HttpRequest, HttpResponse]
TCP as a:
Flow[ByteString, ByteString]
Websocket connection as a:
Flow[ws.Message, ws.Message]
Streaming Deep Learning Predictions
Akka [Streams/HTTP/Alpakka] + h2o’s Sparkling Water
Streaming Deep Learning Predictions
Akka [Streams/HTTP/Alpakka] + h2o’s Sparkling Water
Streaming Deep Learning Predictions
Akka [Streams/HTTP/Alpakka] + h2o’s Sparkling Water
DEMO TIME
Streaming from Akka HTTP (Java)
wrap(mySource): Source === apply(Source): Source
def bytesToMeasurements(bytes: Source[ByteString, Any]): Source[Double, NotUsed] = {

val measurementLines =

bytes

.via(Framing.delimiter(ByteString("n"), maximumFrameLength = 1000))

.map(_.utf8String)



measurementLines

.via(CsvSupport.takeColumns(Set("LinAccX (g)", "LinAccY (g)", "LinAccZ (g)")))

.mapConcat(_.flatMap(col => Try(col.toDouble).toOption))

.mapMaterializedValue(_ => NotUsed)

}
Streaming from Akka HTTP (Java)
wrap(mySource): Source === apply(Source): Source
def bytesToMeasurements(bytes: Source[ByteString, Any]): Source[Double, NotUsed] = {

val measurementLines =

bytes

.via(Framing.delimiter(ByteString("n"), maximumFrameLength = 1000))

.map(_.utf8String)



measurementLines

.via(CsvSupport.takeColumns(Set("LinAccX (g)", "LinAccY (g)", "LinAccZ (g)")))

.mapConcat(_.flatMap(col => Try(col.toDouble).toOption))

.mapMaterializedValue(_ => NotUsed)

}
via(Flow) === Source.via(Flow)
Flow.via(Flow)
val bytesToMeasurements: Flow[ByteString, Double, NotUsed] = {

val measurementLines =

Flow[ByteString]

.via(Framing.delimiter(ByteString("n"), maximumFrameLength = 1000))

.map(_.utf8String)



measurementLines

.via(CsvSupport.takeColumns(Set("LinAccX (g)", "LinAccY (g)", "LinAccZ (g)")))

.mapConcat(_.flatMap(col => Try(col.toDouble).toOption))

.mapMaterializedValue(_ => NotUsed)

}
Streaming from Akka HTTP (Java)
wrap(mySource): Source === apply(Source): Source
def bytesToMeasurements(bytes: Source[ByteString, Any]): Source[Double, NotUsed] = {

val measurementLines =

bytes

.via(Framing.delimiter(ByteString("n"), maximumFrameLength = 1000))

.map(_.utf8String)



measurementLines

.via(CsvSupport.takeColumns(Set("LinAccX (g)", "LinAccY (g)", "LinAccZ (g)")))

.mapConcat(_.flatMap(col => Try(col.toDouble).toOption))

.mapMaterializedValue(_ => NotUsed)

}
via(Flow) === Source.via(Flow)
Flow.via(Flow)
val bytesToMeasurements: Flow[ByteString, Double, NotUsed] = {

val measurementLines =

Flow[ByteString]

.via(Framing.delimiter(ByteString("n"), maximumFrameLength = 1000))

.map(_.utf8String)



measurementLines

.via(CsvSupport.takeColumns(Set("LinAccX (g)", "LinAccY (g)", "LinAccZ (g)")))

.mapConcat(_.flatMap(col => Try(col.toDouble).toOption))

.mapMaterializedValue(_ => NotUsed)

}
Streaming Deep Learning Predictions
We have demonstrated:
• Superior pluggability and reusability
• Fully type-safe APIs
• Simple custom Stages
• Advanced custom GraphStages
Back-pressure in real systems
Understanding
Reactive Systems
Understanding Systems
At Lightbend we build for
usability, understanding and performance.
Understanding Systems
At Lightbend we build for
usability, understanding and performance.
Remember the car?
That’s only:
“highest possible performance”.
Understanding Systems
We need controllable, introspectable, operable systems.
Monitoring, tracing.
Right at the core of the tech.
Visualising Architectures
Visualising Architectures
https://app.prod.opsclarity.com
Reactive Streams / Akka Streams
Is now the time to adopt?
Totally, go for it.
Happy hAkking!
We <3 contributions
• Easy to contribute:
• https://github.com/akka/akka/issues?q=is%3Aissue+is%3Aopen+label%3Aeasy-to-contribute
• https://github.com/akka/akka/issues?q=is%3Aissue+is%3Aopen+label%3A%22nice-to-have+%28low-prio%29%22
• Akka: akka.io && github.com/akka
• Reactive Streams: reactive-streams.org
• Reactive Socket: reactivesocket.io
• Mailing list:
• https://groups.google.com/group/akka-user
• Public chat rooms:
• http://gitter.im/akka/dev developing Akka
• http://gitter.im/akka/akka using Akka
What’s next for Akka?
• Akka 2.5.x
• Distributed Data becomes stable in 2.5
• Persistence Query becomes stable in 2.5
• Alpakka connectors
• Akka HTTP/2
• Akka HTTP default backend for Play (2.6.0-M1 sic!)
• Akka Typed (sic!)
• Better AbstractActor for Java8 users
• Possible multi-data centre extensions …?
• …?
Find the Akka Ecosystem <3 Scaladex
https://index.scala-lang.org
Free e-book and printed report.
bit.ly/why-reactive
Covers what reactive actually is.
Implementing in existing architectures.
Thoughts from the team that’s building
reactive apps since more than 6 years.
Obligatory “read my book!” slide :-)
ktoso @ lightbend.com
twitter: ktosopl
github: ktoso
team blog: blog.akka.io
home: akka.io
myself: kto.so
Q/A

Akka-chan's Survival Guide for the Streaming World

  • 1.
    Konrad `ktoso` Malawski@ Scala Matsuri 2017 @ Tokyo Survival guide for the Streaming World Akka-chan’s
  • 2.
    Me, Tokyo &Akka Streams… The road to 2017… 2014年: リアクティブストリーム始動
  • 3.
    0.7 Early preview RS started(late 2013) 2014 2016年: JDK 9 への導入決定 Reactive Streams started in late 2013, initiated by Roland Kuhn,Viktor Klang, Erik Meijer, Ben Christiansen
  • 4.
    0.7 Early preview RS begins! 2.0 Experimental RSon way to JDK9 2014 2016 2014年: リアクティブストリーム始動2017年: 安定版。リアクティブストリーム付きの JDK9。
  • 5.
    0.7 Early preview RS begins! 2.0 Experimental RSon way to JDK9 2.4.17 + 10.0.3 Fully stable RS in JDK9 (!) 2014 2016 2017 2014年: リアクティブストリーム始動2016年: JDK 9 への導入決定
  • 6.
    Konrad `ktoso` Malawski AkkaTeam, Reactive Streams TCK, Scala SLIP Committee member
  • 7.
    Konrad `@ktosopl` Malawski work:akka.io lightbend.com personal blog: http://kto.so communities: geecon.org Java.pl / KrakowScala.pl sckrk.com GDGKrakow.pl lambdakrk.pl
  • 8.
    Konrad `@ktosopl` Malawski work:akka.io lightbend.com personal blog: http://kto.so communities: geecon.org Java.pl / KrakowScala.pl sckrk.com GDGKrakow.pl lambdakrk.pl
  • 9.
  • 10.
    The concurrent &distributed applications toolkit Akka is a toolkit and runtime for building highly concurrent, distributed, and resilient message-driven applications on the JVM 2017年: 安定版。リアクティブストリーム付きの JDK9。
  • 11.
    Actors – Concurrency/ high perf. messaging Cluster – Location transparent, resilient clusters Persistence – EventSourcing support (many DBs) Distributed Data – Availability-first gossiped CRDTs HTTP – Fully Async & Reactive Http Server (Websockets, Http/2) soon:
 Typed – really well-typed Actors, coming this year …and much more (kafka, cassandra, testing, …)
  • 12.
  • 13.
  • 14.
    Suddenly everyone jumpedon the word “Stream”. Akka Streams / Reactive Streams started end-of-2013. “Streams” * when put in “” the word does not appear in project name, but is present in examples / style of APIs / wording.
  • 15.
    Suddenly everyone jumpedon the word “Stream”. Akka Streams / Reactive Streams started end-of-2013. The word “Stream” is used in many contexts/meanings Akka Streams Reactive Streams RxJava “streams”* Spark Streaming Apache Storm “streams”* Java Steams (JDK8) Reactor “streams”* Kafka Streams ztellman / Manifold (Clojure) * when put in “” the word does not appear in project name, but is present in examples / style of APIs / wording. Apache GearPump “streams” Apache [I] Streams (!) Apache [I] Beam “streams” Apache [I] Quarks “streams” Apache [I] Airflow “streams” (dead?) Apache [I] Samza Scala Stream Scalaz Streams, now known as FS2 Swave.io Java InputStream / OutputStream / … :-) 2017年: 安定版。リアクティブストリーム付きの JDK9。
  • 16.
    “Stream” What does itmean?! • Possibly infinite datasets (“streams”) • “Streams are NOT collections.” • Processed element-by-element • Element could mean “byte” • More usefully though it means a specific type “T” • Asynchronous processing • Asynchronous boundaries (between threads) • Network boundaries (between machines) 2017年: 安定版。リアクティブストリーム付きの JDK9。
  • 17.
    The new “bigdata” is “fast data”. Enabled by reactive building blocks. “Fast Data” 2017年: 安定版。リアクティブストリーム付きの JDK9。
  • 18.
    The typical “bigdata” architecture ever since Hadoop entered the market Legacy Hadoop architectures would mostly look like this: (legacy, batch oriented architectures) 典型的な「ビッグデータ」アーキテクチャ
  • 19.
    The typical “bigdata” architecture ever since Hadoop entered the market Legacy Hadoop architectures would mostly look like this: (legacy, batch oriented architectures) 典型的な「ビッグデータ」アーキテクチャ
  • 20.
    Fast Data –architecture example Many of these technologies compose together into what we call Fast Data architectures. 典型的な「ビッグデータ」アーキテクチャ
  • 21.
    Fast Data –architecture example It’s like big-data, but FAST - which often implies various kinds of streaming. 典型的な「ビッグデータ」アーキテクチャ
  • 22.
    Where does AkkaStream fit? Akka Streams specifically fits, if you answer yes to any of these: • Should it take on public traffic? • Processing in hot path for requests? • Integrate various technologies? • Protect services from over-load? • Introspection, debugging, excellent Akka integration? • (vs. other reactive-stream impls.) 以上の質問に「はい」と答えた場合は Akka Stream に向いている
  • 23.
    How do Ipick which “streaming” I need? Kafka serves best as a transport for pub-sub across services. • Note that Kafka Streams (db ops are on the node) 
 is rather, different than the Reactive Kafka client • Great for cross-service communication 
 instead of HTTP Request / Reply Kafka はサービス間の pub-sub 通信に向いている HTTP の代わりにサービス間の通信に使う
  • 24.
    How do Ipick which “streaming” I need? Spark has vast libraries for ML or join etc ops. • It’s the “hadoop replacement”. • Spark Streaming is windowed-batches • Latency anywhere up from 0.5~1second • Great for cross-service communication 
 instead of HTTP Req/Reply Spark は機械学習系が充実している
  • 25.
    Oh yeah, there’sJDK8 “Stream” too! Terrible naming decision IMHO, since Java’s .stream() • Geared for collections • Best for finite and known-up-front data • Lazy, sync/async (async rarely used) • Very (!) hard to extend It’s the opposite what we talk about in Streaming systems! It’s more:“bulk collection operations” Also known as… Scala collections API (i.e. Iterator JDK8 の Stream はイテレータ的なもの
  • 26.
    What about JDK9“Flow”? JDK9 introduces java.util.concurrent.Flow • Is a 1:1 copy of the Reactive Streams interfaces • On purpose, for people to be able to impl. it • Does not provide useful implementations • Is only the inter-op interfaces • Libraries like Akka Streams implement RS,
 and expose useful APIs for you to use. JDK9 の Flow はリアクティブ・ストリーム
  • 27.
    And the manymeanings it carries. Reactive
  • 28.
    And the manymeanings it carries. Reactive
  • 29.
    The many meaningsof Reactive reactivemanifesto.org
  • 30.
    The many meaningsof Reactive
  • 33.
    So what areReactive Streams actually?
  • 34.
    So what areReactive Streams actually?
  • 35.
    So what areReactive Streams actually?
  • 36.
  • 37.
    Getting the completepicture (yet… not the topic of today’s talk)
  • 38.
    How to thinkabout these techniques? bit.ly/why-reactive
  • 39.
    “Not-quite-Reactive-System” The reason westarted researching into transparent to users flow control.
  • 46.
    “Best practices aresolutions to yesterdays problems.” https://twitter.com/FrankBuytendijk/status/795555578592555008 Circuit breaking as substitute of flow-control
  • 47.
    See also, NiteshKant, Netflix @ Reactive Summit https://www.youtube.com/watch?v=5FE6xnH5Lak
  • 48.
    See also, NiteshKant, Netflix @ Reactive Summit https://www.youtube.com/watch?v=5FE6xnH5Lak
  • 49.
    HTTP/1.1 503 ServiceUnavailable HTTP/1.1 503 Service Unavailable Throttling as represented by 503 responses. Client will back-off… but how? What if most of the fleet is throttling?
  • 50.
  • 51.
  • 52.
    See also, NiteshKant, Netflix @ Reactive Summit https://www.youtube.com/watch?v=5FE6xnH5Lak “slamming the breaks”
  • 53.
    See also, NiteshKant, Netflix @ Reactive Summit https://www.youtube.com/watch?v=5FE6xnH5Lak “slamming the breaks”
  • 54.
    See also, NiteshKant, Netflix @ Reactive Summit https://www.youtube.com/watch?v=5FE6xnH5Lak “slamming the breaks”
  • 55.
    See also, NiteshKant, Netflix @ Reactive Summit https://www.youtube.com/watch?v=5FE6xnH5Lak “slamming the breaks”
  • 56.
    See also, NiteshKant, Netflix @ Reactive Summit https://www.youtube.com/watch?v=5FE6xnH5Lak “slamming the breaks”
  • 57.
    See also, NiteshKant, Netflix @ Reactive Summit https://www.youtube.com/watch?v=5FE6xnH5Lak We’ll re-visit this specific case in a bit :-) “slamming the breaks”
  • 58.
    Are absolutely useful! Still…“We can do better than that.” Circuit Breakers
  • 60.
    But we’ll needeveryone to understand some shared semantics… We can do better.
  • 61.
    A fundamental buildingblock. Not end-user API by itself. reactive-streams.org Reactive Streams
  • 62.
    Reactive Streams More ofan SPI (Service Provider Interface), than API. reactive-streams.org
  • 63.
  • 64.
  • 65.
  • 66.
    No no no…! NotTHAT Back-pressure! Also known as: flow control. What is back-pressure?
  • 67.
    No no no…! NotTHAT Back-pressure! Also known as: application level flow control. What is back-pressure?
  • 68.
    Reactive Streams -story: 2013’s impls ~2013: Reactive Programming becoming widely adopted on JVM. - Play introduced “Iteratees” - Akka (2009) had Akka-IO (TCP etc.) - Ben starts work on RxJava http://blogs.msdn.com/b/rxteam/archive/2009/11/17/announcing-reactive-extensions-rx-for-net-silverlight.aspx http://infoscience.epfl.ch/record/176887/files/DeprecatingObservers2012.pdf - Ingo Maier, Martin Odersky https://github.com/ReactiveX/RxJava/graphs/contributors https://github.com/reactor/reactor/graphs/contributors https://medium.com/@viktorklang/reactive-streams-1-0-0-interview-faaca2c00bec#.69st3rndy Teams discuss need for back-pressure in simple user API. Play’s Iteratee / Akka’s NACK in IO. }
  • 69.
    Reactive Streams -story: 2013’s impls 2014–2015: Reactive Streams Spec & TCK development, and implementations. 1.0 released on April 28th 2015, with 5+ accompanying implementations. 2015 Proposed to be included with JDK9 by Doug Lea via JEP-266 “More Concurrency Updates” http://hg.openjdk.java.net/jdk9/jdk9/jdk/file/6e50b992bef4/src/java.base/share/classes/java/util/concurrent/Flow.java
  • 70.
    But what doesit do!? Reactive Streams
  • 71.
  • 72.
    Fast Publisher SlowSubscriber Push model
  • 73.
    Subscriber usually hassome kind of buffer. Push model
  • 74.
  • 75.
  • 76.
    What if thebuffer overflows? Push model
  • 77.
    Use bounded buffer, dropmessages + require re-sending Push model
  • 78.
    Kernel does this! Routersdo this! (TCP) Use bounded buffer, drop messages + require re-sending Push model
  • 79.
    Increase buffer size… Well,while you have memory available! Push model
  • 80.
  • 81.
    Reactive Streams explained ReactiveStreams explained in 1 slide
  • 82.
    Fast Publisher willsend at-most 3 elements. This is pull-based-backpressure. Reactive Streams: “dynamic push/pull”
  • 83.
    JEP-266 – soon…! publicfinal class Flow { private Flow() {} // uninstantiable @FunctionalInterface public static interface Publisher<T> { public void subscribe(Subscriber<? super T> subscriber); } public static interface Subscriber<T> { public void onSubscribe(Subscription subscription); public void onNext(T item); public void onError(Throwable throwable); public void onComplete(); } public static interface Subscription { public void request(long n); public void cancel(); } public static interface Processor<T,R> extends Subscriber<T>, Publisher<R> { } }
  • 84.
    JEP-266 – soon…! publicfinal class Flow { private Flow() {} // uninstantiable @FunctionalInterface public static interface Publisher<T> { public void subscribe(Subscriber<? super T> subscriber); } public static interface Subscriber<T> { public void onSubscribe(Subscription subscription); public void onNext(T item); public void onError(Throwable throwable); public void onComplete(); } public static interface Subscription { public void request(long n); public void cancel(); } public static interface Processor<T,R> extends Subscriber<T>, Publisher<R> { } } Single basic (helper) implementation available in JDK: SubmissionPublisher
  • 85.
    Reactive Streams: goals 1)Avoiding unbounded buffering across async boundaries 2)Inter-op interfaces between various libraries
  • 86.
    Reactive Streams: goals 1)Avoiding unbounded buffering across async boundaries 2)Inter-op interfaces between various libraries Argh, implementing a correct RS Publisher or Subscriber is so hard!
  • 87.
    1) Avoiding unboundedbuffering across async boundaries 2)Inter-op interfaces between various libraries Reactive Streams: goals Argh, implementing a correct RS Publisher or Subscriber is so hard!
  • 88.
    Reactive Streams: goals Argh,implementing a correct RS Publisher or Subscriber is so hard! You should be using Akka Streams instead! 1) Avoiding unbounded buffering across async boundaries 2)Inter-op interfaces between various libraries
  • 89.
    Already made ahuge industry impact Reactive Streams
  • 90.
  • 91.
  • 92.
    Inspiring other technologies It’sbeen a while since Java inspired other modern technologies, hasn’t it?
  • 93.
    The implementation. Complete andawesome Java and Scala APIs. As everything since day 1 in Akka. Akka Streams
  • 94.
    Akka Streams in20 seconds: // types: Source[Out, Mat] Flow[In, Out, Mat] Sink[In, Mat] // generally speaking, it's always: val ready = Source.from…(???).via(flow).map(i => i * 2).to(sink) val mat: Mat = ready.run() // the usual example: val f: Future[String] = Source.single(1).map(i => i.toString).runWith(Sink.head) Proper static typing!
  • 95.
    Akka Streams in20 seconds: // types: _ Source[Int, NotUsed] Flow[Int, String, NotUsed] Sink[String, Future[String]] Source.single(1).map(i => i / 0).runWith(Sink.head)
  • 96.
    Source.single(1).map(i => i.toString).runWith(Sink.head) //types: _ Source[Int, NotUsed] Flow[Int, String, NotUsed] Sink[String, Future[String]] Akka Streams in 20 seconds:
  • 97.
    Your app hasspecific needs
  • 98.
    Your app hasspecific needs
  • 99.
    Your app hasspecific needs
  • 100.
    Your app hasspecific needs
  • 101.
    Your app hasspecific needs
  • 102.
    Ecosystem that solvesproblems > (is greater than) solving all the problems ourselves
  • 103.
  • 104.
    A community forStreams connectors Alpakka – a community for Stream connectors Alp
  • 105.
    Alpakka – acommunity for Stream connectors http://developer.lightbend.com/docs/alpakka/current/
  • 106.
    Alpakka – acommunity for Stream connectors http://developer.lightbend.com/docs/alpakka/current/ Krzysztof Ciesielski Reactive Kafka (Alpakka) maintainer Room B @ 15:30,1日
  • 107.
    Alpakka – acommunity for Stream connectors http://developer.lightbend.com/docs/alpakka/current/
  • 108.
    Alpakka – acommunity for Stream connectors http://developer.lightbend.com/docs/alpakka/current/
  • 109.
    Backpressure in action,visualized streams & HTTP
  • 110.
    A core featurenot obvious to the untrained eye…! Quiz time! TCP is a ______ protocol? Akka Streams & HTTP
  • 111.
    A core featurenot obvious to the untrained eye…! Quiz time! TCP is a STREAMING protocol! Akka Streams & HTTP
  • 112.
    Streaming in AkkaHTTP HttpServer as a: Flow[HttpRequest, HttpResponse] http://doc.akka.io/docs/akka/2.4/scala/stream/stream-customize.html#graphstage-scala “Framed entity streaming” https://github.com/akka/akka/pull/20778
  • 113.
    Streaming in AkkaHTTP HttpServer as a: Flow[HttpRequest, HttpResponse] HTTP Entity as a: Source[ByteString, _] http://doc.akka.io/docs/akka/2.4/scala/stream/stream-customize.html#graphstage-scala “Framed entity streaming” https://github.com/akka/akka/pull/20778
  • 114.
    Streaming in AkkaHTTP http://doc.akka.io/docs/akka/2.4/scala/stream/stream-customize.html#graphstage-scala “Framed entity streaming” https://github.com/akka/akka/pull/20778 HttpServer as a: Flow[HttpRequest, HttpResponse] TCP as a: Flow[ByteString, ByteString] Websocket connection as a: Flow[ws.Message, ws.Message]
  • 115.
    Streaming Deep LearningPredictions Akka [Streams/HTTP/Alpakka] + h2o’s Sparkling Water
  • 116.
    Streaming Deep LearningPredictions Akka [Streams/HTTP/Alpakka] + h2o’s Sparkling Water
  • 117.
    Streaming Deep LearningPredictions Akka [Streams/HTTP/Alpakka] + h2o’s Sparkling Water DEMO TIME
  • 118.
    Streaming from AkkaHTTP (Java) wrap(mySource): Source === apply(Source): Source def bytesToMeasurements(bytes: Source[ByteString, Any]): Source[Double, NotUsed] = {
 val measurementLines =
 bytes
 .via(Framing.delimiter(ByteString("n"), maximumFrameLength = 1000))
 .map(_.utf8String)
 
 measurementLines
 .via(CsvSupport.takeColumns(Set("LinAccX (g)", "LinAccY (g)", "LinAccZ (g)")))
 .mapConcat(_.flatMap(col => Try(col.toDouble).toOption))
 .mapMaterializedValue(_ => NotUsed)
 }
  • 119.
    Streaming from AkkaHTTP (Java) wrap(mySource): Source === apply(Source): Source def bytesToMeasurements(bytes: Source[ByteString, Any]): Source[Double, NotUsed] = {
 val measurementLines =
 bytes
 .via(Framing.delimiter(ByteString("n"), maximumFrameLength = 1000))
 .map(_.utf8String)
 
 measurementLines
 .via(CsvSupport.takeColumns(Set("LinAccX (g)", "LinAccY (g)", "LinAccZ (g)")))
 .mapConcat(_.flatMap(col => Try(col.toDouble).toOption))
 .mapMaterializedValue(_ => NotUsed)
 } via(Flow) === Source.via(Flow) Flow.via(Flow) val bytesToMeasurements: Flow[ByteString, Double, NotUsed] = {
 val measurementLines =
 Flow[ByteString]
 .via(Framing.delimiter(ByteString("n"), maximumFrameLength = 1000))
 .map(_.utf8String)
 
 measurementLines
 .via(CsvSupport.takeColumns(Set("LinAccX (g)", "LinAccY (g)", "LinAccZ (g)")))
 .mapConcat(_.flatMap(col => Try(col.toDouble).toOption))
 .mapMaterializedValue(_ => NotUsed)
 }
  • 120.
    Streaming from AkkaHTTP (Java) wrap(mySource): Source === apply(Source): Source def bytesToMeasurements(bytes: Source[ByteString, Any]): Source[Double, NotUsed] = {
 val measurementLines =
 bytes
 .via(Framing.delimiter(ByteString("n"), maximumFrameLength = 1000))
 .map(_.utf8String)
 
 measurementLines
 .via(CsvSupport.takeColumns(Set("LinAccX (g)", "LinAccY (g)", "LinAccZ (g)")))
 .mapConcat(_.flatMap(col => Try(col.toDouble).toOption))
 .mapMaterializedValue(_ => NotUsed)
 } via(Flow) === Source.via(Flow) Flow.via(Flow) val bytesToMeasurements: Flow[ByteString, Double, NotUsed] = {
 val measurementLines =
 Flow[ByteString]
 .via(Framing.delimiter(ByteString("n"), maximumFrameLength = 1000))
 .map(_.utf8String)
 
 measurementLines
 .via(CsvSupport.takeColumns(Set("LinAccX (g)", "LinAccY (g)", "LinAccZ (g)")))
 .mapConcat(_.flatMap(col => Try(col.toDouble).toOption))
 .mapMaterializedValue(_ => NotUsed)
 }
  • 121.
    Streaming Deep LearningPredictions We have demonstrated: • Superior pluggability and reusability • Fully type-safe APIs • Simple custom Stages • Advanced custom GraphStages
  • 122.
  • 123.
  • 124.
    Understanding Systems At Lightbendwe build for usability, understanding and performance.
  • 125.
    Understanding Systems At Lightbendwe build for usability, understanding and performance. Remember the car? That’s only: “highest possible performance”.
  • 126.
    Understanding Systems We needcontrollable, introspectable, operable systems. Monitoring, tracing. Right at the core of the tech.
  • 127.
  • 128.
  • 129.
    Reactive Streams /Akka Streams Is now the time to adopt?
  • 130.
  • 131.
  • 132.
    We <3 contributions •Easy to contribute: • https://github.com/akka/akka/issues?q=is%3Aissue+is%3Aopen+label%3Aeasy-to-contribute • https://github.com/akka/akka/issues?q=is%3Aissue+is%3Aopen+label%3A%22nice-to-have+%28low-prio%29%22 • Akka: akka.io && github.com/akka • Reactive Streams: reactive-streams.org • Reactive Socket: reactivesocket.io • Mailing list: • https://groups.google.com/group/akka-user • Public chat rooms: • http://gitter.im/akka/dev developing Akka • http://gitter.im/akka/akka using Akka
  • 133.
    What’s next forAkka? • Akka 2.5.x • Distributed Data becomes stable in 2.5 • Persistence Query becomes stable in 2.5 • Alpakka connectors • Akka HTTP/2 • Akka HTTP default backend for Play (2.6.0-M1 sic!) • Akka Typed (sic!) • Better AbstractActor for Java8 users • Possible multi-data centre extensions …? • …?
  • 134.
    Find the AkkaEcosystem <3 Scaladex https://index.scala-lang.org
  • 135.
    Free e-book andprinted report. bit.ly/why-reactive Covers what reactive actually is. Implementing in existing architectures. Thoughts from the team that’s building reactive apps since more than 6 years. Obligatory “read my book!” slide :-)
  • 136.
    ktoso @ lightbend.com twitter:ktosopl github: ktoso team blog: blog.akka.io home: akka.io myself: kto.so Q/A