zen of akka
TRANSCRIPT
![Page 1: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/1.jpg)
Konrad `@ktosopl` Malawski @ Tokyo, Scala Matsuri 2016
の zen
![Page 2: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/2.jpg)
Konrad `ktoso` Malawski
(we’re renaming soon!)
Akka Team, Reactive Streams TCK, Maintaining Akka Http
![Page 3: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/3.jpg)
Konrad `@ktosopl` Malawski
akka.iotypesafe.comgeecon.org
Java.pl / KrakowScala.plsckrk.com / meetup.com/Paper-Cup @ London
GDGKrakow.pl lambdakrk.pl
(we’re renaming soon!)
![Page 4: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/4.jpg)
![Page 5: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/5.jpg)
はじめまして!
Who are you guys?
![Page 6: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/6.jpg)
Why such talk?
1番: One actor is no Actor
2番: Structure your Actors
3番: Name your Actors
4番: ”Matrix of mutability (Pain)”
5番: Blocking needs careful management
6番: Never Await, for/flatMap instead!
7番: Avoid Java Serialization
7.5番: Trust no-one, benchmark everything!
Agenda
8番: Let it Crash!
9番: Backoff Supervision
10番: Design using State Machines
11番: Cluster Convergence and Joining
12番: Cluster Partitions and “Down”
13番: Akka is a Toolkit.
14番: Happy Hakking, Community!
Questions?
![Page 7: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/7.jpg)
“The Tao / Zen of Programming”
Talk title loosely based on the “Tao of Programming” book
by Goeffrey James (1987).
「プログラミングの Tao (道)」
![Page 8: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/8.jpg)
“The Tao / Zen of Programming”
And the follow-up book“Zen of Programming”.
「プログラミングの Zen (禅)」の 2冊に影響を受けたトーク
![Page 9: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/9.jpg)
“The Tao / Zen of Programming”
Available here: http://www.mit.edu/~xela/tao.html
Series of nine “books”, stories about an apprentice programmer and his sensei.
Thus spake the Master Programmer:
“Without the wind, the grass does not move. Without software hardware is useless.”
師が弟子に語る形式の 9冊シリーズの一部「風無くば草は揺れず。ソフト無くばハードは無用の長物。」
![Page 10: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/10.jpg)
The Akka landscape
![Page 11: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/11.jpg)
The Akka landscape
Akka Actor IO Cluster Cluster Tools (PubSub, Sharding, …) Persistence & Persistence Query Streams HTTP Typed
![Page 12: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/12.jpg)
1番: One actor is no Actor
1つのアクターは、0個のアクター
![Page 13: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/13.jpg)
1番: One actor is no Actor
アクターは他のアクターと協調するためにあるアクターは一つの責務に特化するべき
![Page 14: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/14.jpg)
1番: One actor is no Actor
If you have only one actor then it can only…
1. Reply2. Drop the message (“ignore”3. Schedule another message to self
So we’re not really making any use of itsparallelism or concurrency capabilities.
アクターは他のアクターと協調するためにあるアクターは一つの責務に特化するべき
![Page 15: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/15.jpg)
1番: One actor is no Actor
アクターは他のアクターと協調するためにあるアクターは一つの責務に特化するべき
![Page 16: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/16.jpg)
1番: One actor is no Actor
アクターは他のアクターと協調するためにあるアクターは一つの責務に特化するべき
![Page 17: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/17.jpg)
1番: One actor is no Actor
アクターは他のアクターと協調するためにあるアクターは一つの責務に特化するべき
![Page 18: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/18.jpg)
1番: One actor is no Actor
アクターは他のアクターと協調するためにあるアクターは一つの責務に特化するべき
![Page 19: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/19.jpg)
1番: One actor is no Actor
アクターは他のアクターと協調するためにあるアクターは一つの責務に特化するべき
![Page 20: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/20.jpg)
1番: One actor is no Actor
- Actors are meant to work together.- An Actor should do one thing and do it very well- then talk to other Actors to do other things for it.
- Child Actors usually used for workers or “tasks” etc.
- Avoid using `actorSelection`, introduce Actors to each other.
アクターはエンティティーを表すそれぞれが「一貫性の島」であるべき
![Page 21: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/21.jpg)
2番: Structure your Actors
![Page 22: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/22.jpg)
2番: Structure your Actors
Different types…but no structure!
![Page 23: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/23.jpg)
2番: Structure your Actors
Parent / child relationshipsalso allow for Actor supervision.
![Page 24: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/24.jpg)
2番: Structure your Actors
![Page 25: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/25.jpg)
3番: Name your Actors
![Page 26: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/26.jpg)
3番: Name your Actors // default context.actorOf(childProps) // "$a", "$b", "$c"
Default names are: BASE64(sequence_nr++)Here’s why: - cheap to generate - guarantees uniqueness - less chars than plain numbers
![Page 27: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/27.jpg)
3番: Name your Actors // default: naming is BASE64(sequential numbers) context.actorOf(childProps) // "$a", "$b", "$c"
// better: but not very informative... context.actorOf(childProps, nextFetchWorkerName) // "fetch-worker-1", "fetch-worker-2"
private var _fetchWorkers: Int = 0 private def nextFetchWorkerName: String = { _fetchWorkers += 1 s”fetch-worker-${_fetchWorkers}” }
Sequential names are a bit better sometimes.
![Page 28: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/28.jpg)
3番: Name your Actors // default: naming is BASE64(sequential numbers) context.actorOf(childProps) // "$a", "$b", "$c"
// better: but not much informative... context.actorOf(childProps, nextFetchWorkerName) // "fetch-worker-1", "fetch-worker-2"
private var _fetchWorkers: Int = 0 private def nextFetchWorkerName: String = { _fetchWorkers += 1 s”fetch-worker-${_fetchWorkers}” }
abstract class SeqActorName { def next(): String def copy(name: String): SeqActorName}object SeqActorName { def apply(prefix: String) = new SeqActorNameImpl(prefix, new AtomicLong(0))}
final class SeqActorNameImpl(val prefix: String, counter: AtomicLong) extends SeqActorName { def next(): String = prefix + '-' + counter.getAndIncrement()
def copy(newPrefix: String): SeqActorName = new SeqActorNameImpl(newPrefix, counter)}
If you use this pattern a lot, here’s a simple encapsulation of it:
![Page 29: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/29.jpg)
3番: Name your Actors // default: naming is BASE64(sequential numbers) context.actorOf(childProps) // "$a", "$b", "$c"
// better: but not much informative... context.actorOf(childProps, nextFetchWorkerName) // "fetch-worker-1", "fetch-worker-2"
private var fetchWorkers: Int = 0 private def nextFetchWorkerName: String = { fetchWorkers += 1 s"fetch-worker-$fetchWorkers" }
// BEST: proper names, based on useful information context.actorOf(childProps, fetcherName(videoUrl)) // "fetch-yt-MRCWy2E_Ts", ... def fetcherName(link: Link) = link match { case YoutubeLink(id, metadata) => s"fetch-yt-$id" case DailyMotionLink(id, metadata) => s"fetch-dm-$id" case VimeoLink(id, metadata) => s"fetch-vim-$id" }
Meaningful names are the best!
アクターが適切に命名すべきアクターの名前は一意で、内容と構造を表す
![Page 30: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/30.jpg)
3番: Name your Actors
Meaningful names are the best!
import akka.actor.OneForOneStrategyimport akka.actor.SupervisorStrategy._import scala.concurrent.duration._
// ... extends Actor with ActorLogging {
override def supervisorStrategy: SupervisorStrategy = OneForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1.minute) { case ex: Exception ⇒ log.warning("Child {} failed with {}, attempting restart...", sender().path.name, ex.getMessage) Restart }
The name of the failed child Actor!
![Page 31: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/31.jpg)
3番: Name your Actors
Meaningful names are the best!
import akka.actor.OneForOneStrategyimport akka.actor.SupervisorStrategy._import scala.concurrent.duration._
// ... extends Actor with ActorLogging {
override def supervisorStrategy: SupervisorStrategy = OneForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1.minute) { case ex: Exception ⇒ log.warning("Child {} failed with {}, attempting restart...", sender().path.name, ex.getMessage) Restart }
The name of the failed child Actor! // BAD –– String ALWAYS built log.debug(s"Something heavy $generateId from $physicalAddress") // GOOD! –– String built only when DEBUG level is ON log.debug("Something heavy {} from {}", generateId, physicalAddress)
Side note: always use {} log formatting (or macros), not s””
![Page 32: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/32.jpg)
4番: ”Matrix of mutability (Pain)”
![Page 33: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/33.jpg)
4番: ”Matrix of mutability (Pain)”
See Jamie Allen’s talk on the subject.
さまざまな可変性ミュータブル+値よりも、イミュータブル+変数
![Page 34: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/34.jpg)
4番: ”Matrix of mutability (Pain)”
See Jamie Allen’s talk on the subject.
さまざまな可変性ミュータブル+値よりも、イミュータブル+変数
![Page 35: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/35.jpg)
4番: ”Matrix of mutability (Pain)”
See Jamie Allen’s talk on the subject.
さまざまな可変性ミュータブル+値よりも、イミュータブル+変数
![Page 36: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/36.jpg)
4番: ”Matrix of mutability (Pain)”
See Jamie Allen’s talk on the subject.
さまざまな可変性ミュータブル+値よりも、イミュータブル+変数
![Page 37: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/37.jpg)
4番: ”Matrix of mutability (Pain)”
See Jamie Allen’s talk on the subject.
さまざまな可変性ミュータブル+値よりも、イミュータブル+変数
![Page 38: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/38.jpg)
4番: ”Matrix of mutability (Pain)”
さまざまな可変性ミュータブル+値よりも、イミュータブル+変数
![Page 39: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/39.jpg)
5番: Blocking needs careful management
正しくは「ブロッキングは注意深く管理すべき」バルクヘッド(防水隔壁)パターンが有効
![Page 40: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/40.jpg)
5番: Blocking needs careful management
Blocking operations are really bad.Actors are all about resource sharing, and if someone is “behaving badly” it hurts everyone.
Here is an example how blocking can grind an app to a halt.
Next we’ll see how to avoid that… even if we have to live with the blocking code.
ブロック操作を使ってはいけないアクター同士が共有するリソースを独り占めすると皆が困る
![Page 41: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/41.jpg)
5番: Blocking needs careful management
In simple terms:
Blocking is bad because instead of doing something else,we just wait and do nothing (wasting CPU time)…
ブロック操作を使ってはいけないアクター同士が共有するリソースを独り占めすると皆が困る
![Page 42: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/42.jpg)
5番: Blocking needs careful management
Future でブロックしている悪い例デフォルトのディスパッチャーが枯渇する
![Page 43: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/43.jpg)
5番: Blocking needs careful management
Having that said, it’s not a bad question. Let’s investigate.
Future でブロックしている悪い例デフォルトのディスパッチャーが枯渇する
![Page 44: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/44.jpg)
5番: Blocking needs careful management// BAD! (due to the blocking in Future):implicit val defaultDispatcher = system.dispatcher
val routes: Route = post { complete { Future { // uses defaultDispatcher Thread.sleep(5000) // will block on the default dispatcher, System.currentTimeMillis().toString // starving the routing infra } }}
Future でブロックしている悪い例デフォルトのディスパッチャーが枯渇する
![Page 45: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/45.jpg)
5番: Blocking needs careful management// BAD! (due to the blocking in Future):implicit val defaultDispatcher = system.dispatcher
val routes: Route = post { complete { Future { // uses defaultDispatcher Thread.sleep(5000) // will block on the default dispatcher, System.currentTimeMillis().toString // starving the routing infra } }}
Future でブロックしている悪い例デフォルトのディスパッチャーが枯渇する
![Page 46: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/46.jpg)
5番: Blocking needs careful management
// application.conf
my-blocking-dispatcher { type = Dispatcher executor = “thread-pool-executor"
thread-pool-executor { // in Akka previous to 2.4.2: core-pool-size-min = 16 core-pool-size-max = 16 max-pool-size-min = 16 max-pool-size-max = 16
// or in Akka 2.4.2+ fixed-pool-size = 16 } throughput = 100 }
![Page 47: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/47.jpg)
5番: Blocking needs careful management// GOOD (due to the blocking on a dedicated dispatcher):implicit val blockingDispatcher = system.dispatchers.lookup("my-blocking-dispatcher")
val routes: Route = post { complete { Future { // uses the good "blocking dispatcher" that we configured, // instead of the default dispatcher – the blocking is isolated. Thread.sleep(5000) System.currentTimeMillis().toString } }}
Future でブロックしている良い例別のディスパッチャーに隔離
![Page 48: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/48.jpg)
5番: Blocking needs careful management
The “Never block!” mantra sounds cool,but actually what we mean by it is “blocking needs careful management”.
We use the “bulkhead” pattern separate out potentially blockingbehaviours to their independent dispatchers (and should always do so).
http://stackoverflow.com/questions/34641861/akka-http-blocking-in-a-future-blocks-the-server/34645097#34645097
![Page 49: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/49.jpg)
6番: Never Await, for/flatMap instead!
![Page 50: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/50.jpg)
6番: Never Await, for/flatMap instead! // ... extends Actor { import context.dispatcher import scala.concurrent.duration._ import scala.concurrent.Await // bad sign!
// BAD!!! val fThings: Future[Things] = computeThings() val t: Things = Await.result(fThings, atMost = 3.seconds) val d: Details = Await.result(moreDetailsFor(t), atMost = 3.seconds)
Await してはいけない代わりに map 関数を使う
![Page 51: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/51.jpg)
6番: Never Await, for/flatMap instead! // ... extends Actor { import context.dispatcher import scala.concurrent.duration._ import scala.concurrent.Await // bad sign!
// BAD!!! val fThings: Future[Things] = computeThings() val t: Things = Await.result(fThings, atMost = 3.seconds) val d: Details = Await.result(moreDetailsFor(t), atMost = 3.seconds)
// Good: val fThingsWithDetails = for { t <- computeThings() d <- moreDetailsFor(t) } yield t -> d
fThingsWithDetails foreach { case (things, details) => // case (things: Things, details: Details) => println(s"$things with $details") }
Await してはいけない代わりに map 関数を使う
![Page 52: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/52.jpg)
6番: Never Await, for/flatMap instead! // ... extends Actor { import context.dispatcher import scala.concurrent.duration._ import scala.concurrent.Await // bad sign!
// BAD!!! val fThings: Future[Things] = computeThings() val t: Things = Await.result(fThings, atMost = 3.seconds) val d: Details = Await.result(moreDetailsFor(t), atMost = 3.seconds)
// Good: val fThingsWithDetails = for { t <- computeThings() d <- moreDetailsFor(t) } yield t -> d
fThingsWithDetails foreach { case (things, details) => // case (things: Things, details: Details) => println(s"$things with $details") }
// adding timeout: val timeoutFuture = akka.pattern.after(3.seconds, context.system.scheduler) { Future.failed(new TimeoutException("My timeout details...")) }
Future.firstCompletedOf(fThingsWithDetails :: timeoutFuture :: Nil) foreach { case (things, details) => // case (things: Things, details: Details) => println(s"$things with $details") }
Await してはいけない代わりに map 関数を使う
![Page 53: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/53.jpg)
7番: Avoid Java Serialization
![Page 54: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/54.jpg)
7番: Avoid Java Serialization
Java Serialization is the default one in Akka, since it’s easy to get started with it – no configuration needed.
If you need performance and are running on multiple nodes, you must change the serialization.
Popular formats are ProtoBuf or Kryo.
Kryo is easier, but harder to evolve schema with.ProtoBuf is harder to maintain but great schema evolution.
Java Serialization は遅い性能を出したければ、ProtoBuf か Kryo
![Page 55: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/55.jpg)
7番: Avoid Java SerializationBenchmarking serialization impact on “ping pong” case.
(Two actors sending a message between them.)
in-process messaging, super fast. no serialization overhead.
Java Serialization は遅い性能を出したければ、ProtoBuf か Kryo
![Page 56: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/56.jpg)
7番: Avoid Java Serialization
more work => increased latency => decreased throughput.
over-the-network messaging,slower due to network and serialization.
Java Serialization は遅い性能を出したければ、ProtoBuf か Kryo
![Page 57: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/57.jpg)
7番: Avoid Java Serialization
Java Serialization is known to be:very slow & footprint heavy
Java Serialization は遅い性能を出したければ、ProtoBuf か Kryo
![Page 58: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/58.jpg)
7番: Avoid Java Serialization
It is on by default in Akka… Why?a) zero setup => simple to “play around”b) historical reasons - hard to remove the default
Since 2.4 a warning is logged:
WARNING: Using the default Java serializer for class [{}] which is not recommended because of performance implications. Use another serializer or disable this warning using the setting 'akka.actor.warn-about-java-serializer-usage'
Java Serialization は遅い性能を出したければ、ProtoBuf か Kryo
![Page 59: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/59.jpg)
7番: Avoid Java Serializationsbt> jmh:run -f 1 -tu us -wi 20 -i 10 -jvm /home/ktoso/opt/jdk1.8.0_65/bin/java -jvmArgsAppend -XX:+PreserveFramePointer -bm avgt .*pingPong.*
[info] # JMH 1.10.3 (released 184 days ago, please consider updating!) [info] # VM version: JDK 1.8.0_65, VM 25.65-b01 [info] # VM invoker: /home/ktoso/opt/jdk1.8.0_65/bin/java [info] # VM options: -XX:+PreserveFramePointer [info] # Warmup: 20 iterations, 5 s each [info] # Measurement: 10 iterations, 1 s each [info] # Timeout: 10 min per iteration [info] # Threads: 1 thread, will synchronize iterations [info] # Benchmark mode: Average time, time/op [info] # Benchmark: akka.actor.ForkJoinActorBenchmark.pingPong [info] # Parameters: (serializer = java)
github.com/ktoso/sbt-jmhopenjdk.java.net/projects/code-tools/jmh/
Java Serialization は遅い性能を出したければ、ProtoBuf か Kryo
![Page 60: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/60.jpg)
7番: Avoid Java Serialization[info] # Warmup Iteration 1: 35.717 us/op . . . [info] # Warmup Iteration 19: 25.164 us/op [info] # Warmup Iteration 20: 23.862 us/op [info] Iteration 1: 25.790 us/op . . . [info] Iteration 10: 26.168 us/op [info] Result "pingPong": [info] 25.464 ±(99.9%) 1.175 us/op [Average] [info] (min, avg, max) = (24.383, 25.464, 26.888), stdev = 0.777 [info] CI (99.9%): [24.289, 26.639] (assumes normal distribution)
[info] ForkJoinActorBenchmark.pingPong java avgt 10 25.464 ± 1.175 us/op [info] ForkJoinActorBenchmark.pingPong off avgt 10 0.967 ± 0.657 us/op
github.com/ktoso/sbt-jmhopenjdk.java.net/projects/code-tools/jmh/
Java Serialization は遅い性能を出したければ、ProtoBuf か Kryo
![Page 61: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/61.jpg)
7番: Avoid Java Serialization
Good serializers include (but are not limited to): Kryo, Google Protocol Buffers, SBE,Thrift, JSON even (sic!)
// dependencies"com.github.romix.akka" %% "akka-kryo-serialization" % "0.4.0"
// application.confextensions = [“com.romix.akka.serialization.kryo.KryoSerializationExtension$"]serializers { java = "akka.serialization.JavaSerializer" kryo = "com.romix.akka.serialization.kryo.KryoSerializer" }
akka.actor.serialization-bindings { “com.mycompany.Example”: kryo . . .}
[info] ForkJoinActorBenchmark.pingPong java avgt 10 25.464 ± 1.175 us/op [info] ForkJoinActorBenchmark.pingPong kryo avgt 10 4.348 ± 4.346 us/op [info] ForkJoinActorBenchmark.pingPong off avgt 10 0.967 ± 0.657 us/op
Java Serialization は遅い性能を出したければ、ProtoBuf か Kryo
![Page 62: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/62.jpg)
7番: Avoid Java Serialization
----sr--model.Order----h#-----J--idL--customert--Lmodel/Customer;L--descriptiont--Ljava/lang/String;L--orderLinest--Ljava/util/List;L--totalCostt--Ljava/math/BigDecimal;xp--------ppsr--java.util.ArrayListx-----a----I--sizexp----w-----sr--model.OrderLine--&-1-S----I--lineNumberL--costq-~--L--descriptionq-~--L--ordert--Lmodel/Order;xp----sr--java.math.BigDecimalT--W--(O---I--scaleL--intValt--Ljava/math/BigInteger;xr--java.lang.Number-----------xp----sr--java.math.BigInteger-----;-----I--bitCountI--bitLengthI--firstNonzeroByteNumI--lowestSetBitI--signum[--magnitudet--[Bxq-~----------------------ur--[B------T----xp----xxpq-~--xq-~--
Java Serialization
final case class Order(id: Long, description: String, totalCost: BigDecimal, orderLines: ArrayList[OrderLines], customer: Customer)
<order id="0" totalCost="0"><orderLines lineNumber="1" cost="0"><order>0</order></orderLines></order>XML…!
{"order":{"id":0,"totalCost":0,"orderLines":[{"lineNumber":1,"cost":0,"order":0}]}}JSON…!
------java-util-ArrayLis-----model-OrderLin----java-math-BigDecima---------model-Orde-----Kryo…!
Excellent post by James Sutherland @ http://java-persistence-performance.blogspot.com/2013/08/optimizing-java-serialization-java-vs.html
Java Serialization は遅い性能を出したければ、ProtoBuf か Kryo
![Page 63: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/63.jpg)
7番: Avoid Java Serialization for Persistence!!!
Java Serialization is a horrible idea if you’re going to store the messages for a long time.
For example, with Akka Persistence we store events “forever”.
Use a serialization format that can evolve over time in a compatible way. It can be JSON or ProtocolBuffers (or Thrift etc).
Java Serialization を永続化に使わないスキーマの変更しやすいフォーマットを選ぶべき
![Page 64: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/64.jpg)
7.5番: Trust no-one, benchmark everything!
Always measure and benchmark properly before judging performance of a tool / library.
Benchmarking is often very hard,use the right tools: - JMH (for Scala via: ktoso/sbt-jmh)- YourKit / JProfiler / …- Linux perf_events
7.5番
推測するな、計測せよベンチマークを書いてプロファイラでスレッドの挙動を診断
![Page 65: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/65.jpg)
8番: Let it Crash! Supervision, Failures & Errors
![Page 66: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/66.jpg)
http://www.reactivemanifesto.org/
8番: Let it Crash! Supervision, Failures & Errors
Error … which is an expected and coded-for condition—for example an error discovered during input validation, that will be communicated to the client …
Failure… is an unexpected event within a service that prevents it from continuing to function normally. A failure will generally prevent responses to the current, and possibly all following, client requests.
![Page 67: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/67.jpg)
http://www.reactivemanifesto.org/
8番: Let it Crash! Supervision, Failures & 「エラー」はビジネスロジックの問題「障害」はインフラの問題
「エラー」はビジネスロジックの問題「障害」はインフラの問題
![Page 68: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/68.jpg)
http://www.reactivemanifesto.org/
8番: Let it Crash! Supervision, Failures & Errors
「エラー」はビジネスロジックの問題「障害」はインフラの問題
![Page 69: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/69.jpg)
http://www.reactivemanifesto.org/
8番: Let it Crash! Supervision, Failures & Errors
Error: “Not enough cash.”
「エラー」はビジネスロジックの問題「障害」はインフラの問題
![Page 70: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/70.jpg)
http://www.reactivemanifesto.org/
8番: Let it Crash! Supervision, Failures & Errors
Error: “Unable to fulfil request”Failure: “Row 3 is broken”
「エラー」はビジネスロジックの問題「障害」はインフラの問題
![Page 71: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/71.jpg)
9番: Backoff Supervision
![Page 72: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/72.jpg)
9番: Backoff Supervision
![Page 73: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/73.jpg)
9番: Backoff Supervision
![Page 74: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/74.jpg)
9番: Backoff Supervision
![Page 75: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/75.jpg)
9番: Backoff Supervision
Our goal is to “let things crash”and “recover gracefully”
Not to hammer the DB while it tries to recover!
クラッシュさせた上で、しなやかな回復を目指す
![Page 76: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/76.jpg)
9番: Backoff Supervision
クラスタでは BackoffSupervisor
全アクターが同時に再起動し DB に殺到するのを防ぐ
![Page 77: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/77.jpg)
9番: Backoff Supervision
クラスタでは BackoffSupervisor
全アクターが同時に再起動し DB に殺到するのを防ぐ
![Page 78: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/78.jpg)
9番: Backoff SupervisionIF we allowed immediate restarts…
we could end up in “infinite replay+fail hell”.
(we don’t. since Persistence went stable in 2.4.x)
クラスタでは BackoffSupervisor
全アクターが同時に再起動し DB に殺到するのを防ぐ
![Page 79: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/79.jpg)
9番: Backoff Supervision
クラスタでは BackoffSupervisor
全アクターが同時に再起動し DB に殺到するのを防ぐ
![Page 80: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/80.jpg)
9番: Backoff Supervision
Many PersistentActors Fail and Stop.
クラスタでは BackoffSupervisor
全アクターが同時に再起動し DB に殺到するのを防ぐ
![Page 81: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/81.jpg)
9番: Backoff Supervision
クラスタでは BackoffSupervisor
全アクターが同時に再起動し DB に殺到するのを防ぐ
![Page 82: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/82.jpg)
9番: Backoff Supervision
Backoff Supervisor counts failuresand starts “the same” entity after exponential timeouts.
クラスタでは BackoffSupervisor
全アクターが同時に再起動し DB に殺到するのを防ぐ
![Page 83: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/83.jpg)
9番: Backoff Supervision
クラスタでは BackoffSupervisor
全アクターが同時に再起動し DB に殺到するのを防ぐ
![Page 84: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/84.jpg)
10番: Design using State Machines
![Page 85: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/85.jpg)
10番: Design using State Machines
def receive = { case Thingy() => // ... case AnotherThingy() => // ... case DoOtherThings() => // ... case PleaseGoAway() => // ... case CarryOn() => // ... case MakeSomething() => // ... // ... }
有限状態機械を作るFSM トレイトか become メソッドを使う
![Page 86: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/86.jpg)
10番: Design using State Machines
def receive = { case Thingy() => // ... case AnotherThingy() => // ... case DoOtherThings() => // ... case PleaseGoAway() => // ... case CarryOn() => // ... case MakeSomething() => // ... // ... }
Good: Actors avoid the “pyramid of doom”.
Pyramid of doom in someasync programming styles.
有限状態機械を作るFSM トレイトか become メソッドを使う
![Page 87: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/87.jpg)
10番: Design using State Machines
def receive = { case Thingy() => // ... case AnotherThingy() => // ... case DoOtherThings() => // ... case PleaseGoAway() => // ... case CarryOn() => // ... case MakeSomething() => // ... // ... }
That well works because“everything is a message”:
有限状態機械を作るFSM トレイトか become メソッドを使う
![Page 88: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/88.jpg)
10番: Design using State Machines def receive = awaitingInstructions
def awaitingInstructions: Receive = terminationHandling orElse { case CarryOn() => // ... case MakeSomething(metadata) => // ... context become makeThings(meta) }
def makeThings(metadata: Metadata): Receive = terminationHandling orElse { case Thingy() => // make a thingy ... case AnotherThingy() => // make another thingy ... case DoOtherThings(meta) => // ... context become awaitingInstructions }
def terminationHandling: Receive = { case PleaseGoAway() => // ... context stop self }
有限状態機械を作るFSM トレイトか become メソッドを使う
DoOtherThings
MakeSomething
![Page 89: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/89.jpg)
10番: Design using State MachinesWe also provide an FSM (Finite State Machine) helper trait.
You may enjoy it sometimes, give it a look.
DoOtherThings
MakeSomething
http://doc.akka.io/docs/akka/2.4.1/scala/fsm.html
class Buncher extends FSM[State, Data] { startWith(Idle, Uninitialized) when(Idle) { case Event(SetTarget(ref), Uninitialized) => stay using Todo(ref, Vector.empty) } // transition elided ... when(Active, stateTimeout = 1 second) { case Event(Flush | StateTimeout, t: Todo) => goto(Idle) using t.copy(queue = Vector.empty) } // unhandled elided ... initialize()}
有限状態機械を作るFSM トレイトか become メソッドを使う
![Page 90: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/90.jpg)
11番: Cluster Convergence and Joining
![Page 91: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/91.jpg)
11番: Cluster Convergence and Joining
http://doc.akka.io/docs/akka/2.4.1/common/cluster.html
Cluster Gossip Convergence
When a node can prove that the cluster state it is observinghas been observed by all other nodes in the cluster.
![Page 92: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/92.jpg)
11番: Cluster Convergence and Joining
http://doc.akka.io/docs/akka/2.4.1/common/cluster.html
Cluster Gossip Convergence When a node can prove that the cluster state it is observing
has been observed by all other nodes in the cluster.
Convergence is required for “Leader actions”,which include Join-ing and Remove-ing a node.
Down-ing can happen without convergence.
![Page 93: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/93.jpg)
11番: Cluster Convergence and Joining
http://doc.akka.io/docs/akka/2.4.1/common/cluster.html
![Page 94: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/94.jpg)
11番: Cluster Convergence and Joining
http://doc.akka.io/docs/akka/2.4.1/common/cluster.html
akka.cluster.allow-weakly-up-members=on
![Page 95: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/95.jpg)
11番: Cluster Convergence and Joining
![Page 96: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/96.jpg)
11番: Cluster Convergence and Joining
![Page 97: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/97.jpg)
11番: Cluster Convergence and Joining
![Page 98: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/98.jpg)
11番: Cluster Convergence and Joining
![Page 99: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/99.jpg)
11番: Cluster Convergence and Joining
![Page 100: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/100.jpg)
11番: Cluster Convergence and Joining
Everyone has ‘seen’ Kurt joining,
move him to Up.
![Page 101: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/101.jpg)
11番: Cluster Convergence and Joining
Kurt is now with usin the Cluster.
![Page 102: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/102.jpg)
11番: Cluster Convergence and Joining
I can’t hear Kurt…He’s unreachable…
![Page 103: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/103.jpg)
11番: Cluster Convergence and Joining
Kurt does has not seen Rei… I can not
mark him as Up!
allow-weakly-up-members=off // default
![Page 104: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/104.jpg)
11番: Cluster Convergence and Joining
I’ll mark Rei as “WeaklyUp” until Kurt
is back.
allow-weakly-up-members=on
allow-weakly-up-members
![Page 105: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/105.jpg)
11番: Cluster Convergence and Joining
Kurt is back! Once he has seen Rei I’ll mark
Rei as Up.
allow-weakly-up-members=on
allow-weakly-up-members
![Page 106: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/106.jpg)
12番: Cluster Partitions and “Down”
![Page 107: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/107.jpg)
12番: Cluster Partitions and “Down”
![Page 108: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/108.jpg)
12番: Cluster Partitions and “Down”
I’m going
home…
![Page 109: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/109.jpg)
12番: Cluster Partitions and “Down”
Make sure the others have heard you say goodbye before you leave.
Vanishes immediately.
![Page 110: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/110.jpg)
12番: Cluster Partitions and “Down”
Make sure the others have heard you say goodbye before you leave.
“Where’s Bill? I did not hear him say Goodbye!”
“Failure Detector” used to determine UNREACHABLE.
![Page 111: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/111.jpg)
12番: Cluster Partitions and “Down”
Failure detection only triggers “UNREACHABLE”.Nodes can come back from that state.
![Page 112: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/112.jpg)
12番: Cluster Partitions and “Down”
Declaring DOWN is done by either timeouts (which is rather unsafe) [auto-downing].Or by “voting” or “majority” among the members of the cluster [split-brain-resolver].
![Page 113: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/113.jpg)
12番: Cluster Partitions and “Down”
![Page 114: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/114.jpg)
12番: Cluster Partitions and “Down”
お 前 は
も う 死 ん で い る
.
.
.
.
Node declared “DOWN” comes back…
![Page 115: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/115.jpg)
12番: Cluster Partitions and “Down”
お 前 は
も う 死 ん で い る
.
.
.
.
![Page 116: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/116.jpg)
12番: Cluster Partitions and “Down”
お 前 は
も う 死 ん で い る
.
.
.
.
Why do we do that?In order to guarantee consistency via “single writer principle”.
Note: Akka Distributed Data has no need for “single writer”, it’s CRDT based. But it’s harder to model things as CRDT, so it’s a trade off.
![Page 117: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/117.jpg)
12番: Cluster Partitions and “Down”
Notice that we do not mention “Quarantined”.That is a state in Akka Remoting, not Cluster.It’s a terminal state from which one can never recover.
TL;DR;use Akka Cluster instead of Remoting.it’s pretty much always the thing you need (better than remoting).
![Page 118: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/118.jpg)
13番: A fishing rod is a Tool. Akka is a Toolkit.
![Page 119: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/119.jpg)
13番: A fishing rod is a Tool. Akka is a Toolkit.
Akka strives is Toolkit,not a Framework.
“Give a man a fish and you feed him for a dayteach a man to fish and you feed him for a lifetime.”
![Page 120: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/120.jpg)
13番: Akka is a Toolkit, pick the right tools for the job.
“Constraints Liberate, Liberties Constrain”
Runar Bjarnason
Runar’s excellent talk @ Scala.World 2015
![Page 121: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/121.jpg)
13番: Akka is a Toolkit, pick the right tools for the job.
Runar’s excellent talk @ Scala.World 2015
The less powerful abstraction must be built on top of
more powerful abstractions.
![Page 122: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/122.jpg)
13番: Akka is a Toolkit, pick the right tools for the job.
Runar’s excellent talk @ Scala.World 2015
Asynchronous processing toolbox:
Akka は道具箱。正しい道具を選ぶべし。レゴを組み合わせるようにしてアプリを作れる
![Page 123: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/123.jpg)
13番: Akka is a Toolkit, pick the right tools for the job.
Runar’s excellent talk @ Scala.World 2015
Asynchronous processing toolbox:
Akka は道具箱。正しい道具を選ぶべし。レゴを組み合わせるようにしてアプリを作れる
![Page 124: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/124.jpg)
13番: Akka is a Toolkit, pick the right tools for the job.
Asynchronous processing toolbox:
Akka は道具箱。正しい道具を選ぶべし。レゴを組み合わせるようにしてアプリを作れる
![Page 125: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/125.jpg)
13番: Akka is a Toolkit, pick the right tools for the job.
Single value, no streaming by definition.Local abstraction. Execution contexts.
Akka は道具箱。正しい道具を選ぶべし。レゴを組み合わせるようにしてアプリを作れる
![Page 126: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/126.jpg)
13番: Akka is a Toolkit, pick the right tools for the job.
Mostly static processing layouts.Well typed and Back-pressured!
Akka は道具箱。正しい道具を選ぶべし。レゴを組み合わせるようにしてアプリを作れる
![Page 127: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/127.jpg)
13番: Akka is a Toolkit, pick the right tools for the job.
Plain Actor’s younger brother, experimental.Location transparent, well typed.Technically unconstrained in actions performed
Akka は道具箱。正しい道具を選ぶべし。レゴを組み合わせるようにしてアプリを作れる
![Page 128: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/128.jpg)
13番: Akka is a Toolkit, pick the right tools for the job.
Runar’s excellent talk @ Scala.World 2015
Location transparent. Various resilience mechanisms.
(watching, persistent recovering, migration, pools)
Untyped and unconstrained in actions performed.
Akka は道具箱。正しい道具を選ぶべし。レゴを組み合わせるようにしてアプリを作れる
![Page 129: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/129.jpg)
13番: Akka is a Toolkit, pick the right tools for the job.
Akka it a Toolkit. Not a Framework.
Another example is persisting data.Akka Persistence is specifically geared towards Event Sourcing.
If you know you you want a raw Key-Value Store and do not need Event Sourcing’s capabilities, don’t use Akka Persistence – it would be the wrong tool for the job.
If you use it for Event Sourcing though… it’ll work very well for you.There it is the right tool for the job.
用途に合わない道具は使うべきではない例えば CQRS が適切でない時は生 DB アクセスを使えば済む
![Page 130: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/130.jpg)
14番: Happy hAkking, Community!
人にはやさしく
コミュニティーに積極的に参加する
![Page 131: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/131.jpg)
14番: Happy hAkking, Community!
akka.io – websitegithub.com/akka/akka/issues – help out!
“community-contrib” or “small” for starters
groups.google.com/group/akka-user – mailing list
gitter.im/akka/akka – chat about using Akkagitter.im/akka/dev – chat about developing Akka
![Page 132: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/132.jpg)
Links• http://stackoverflow.com/questions/34641861/akka-http-blocking-
in-a-future-blocks-the-server/34645097#34645097• The wonderful Zen paintings to buy here:
http://paintingwholesalechina.com/products/chinese-culture-zen-no-1-academic-chinese-painting
• http://doc.akka.io/docs/akka/2.4.1/common/cluster.html• http://www.mit.edu/~xela/tao.html• http://doc.akka.io/docs/akka/2.4.1/common/cluster.html• http://doc.akka.io/docs/akka/2.4.1/scala/cluster-usage.html• akka.io et al.
![Page 133: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/133.jpg)
https://www.typesafe.com/products/typesafe-reactive-platform
Certified builds & Long Term Support
Advanced commercial features:Monitoring, Split Brain Resolver, ConductR,
Play User Quotas, Play SOAP
Reactive Platform
![Page 134: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/134.jpg)
ありがとう!
ktoso @ typesafe.com twitter: ktosopl
github: ktosoteam blog: letitcrash.com
home: akka.io
Thus spake the Master Programmer:
“After three days without programming,life becomes meaningless.”
![Page 135: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/135.jpg)
Q/A (Now’s the time to ask things!)
ktoso @ typesafe.com twitter: ktosopl
github: ktosoteam blog: letitcrash.com
home: akka.io
![Page 136: Zen of Akka](https://reader034.vdocuments.mx/reader034/viewer/2022051404/586f9ad31a28abcc238b55bd/html5/thumbnails/136.jpg)
©Typesafe 2016 – All Rights Reserved