Akka is a runtime framework for building resilient, distributed applications in Java or Scala. In this webinar, Konrad Malawski discusses the roadmap and features of the upcoming Akka 2.4.0 and reveals three upcoming enhancements that enterprises will receive in the latest certified, tested build of Typesafe Reactive Platform.
Akka Split Brain Resolver (SBR)
Akka SBR provides advanced recovery scenarios in Akka Clusters, improving on the safety of Akka’s automatic resolution to avoid cascading partitioning.
Akka Support for Docker and NAT
Run Akka Clusters in Docker containers or NAT with complete hostname and port visibility on Java 6+ and Akka 2.3.11+
Akka Long-Term Support
Receive Akka 2.4 support for Java 6, Java 7, and Scala 2.10
8. Reactive Platform Versioning
https://together.typesafe.com/products/reactivePlatform
How does this help?
• Huge integration test suite before release
• Certified to work well together
• Priority updates / additional features
• Back-ports, fixes, long-term support
Life cycle of each release: 2 years
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
11. support
(NAT support)
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
Available in:
RP 15v01p## (Akka 2.3.x),
OSS only in Akka 2.4.x (work in progress)
12. Docker / NAT support
docker run -d -p 8000:2551 akka-app
Akka App
172.17.0.11:2551
Outside world
example.com:8000
doc.akka.io/docs/akka/2.4.0-RC1/general/remoting.html#Peer-to-Peer_vs__Client-Server
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
13. Docker / NAT support
akka.remote {
netty.tcp {
hostname = example.com # external (logical) hostname
port = 8000 # external (logical) port
bind-hostname = 172.17.0.11 # internal (bind) hostname
bind-port = 2552 # internal (bind) port
}
}
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
doc.akka.io/docs/akka/2.4.0-RC1/general/remoting.html#Peer-to-Peer_vs__Client-Server
15. Split Brain Resolver (customer beta)
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
Installing the Reactive Platform with Split Brain Resolver
16. Split Brain Resolver
• Fundamental Problem in all distributed systems
• SBR helps to make decisions, is not a magic wand
• A set of pre-built strategies
for when to down nodes in a cluster.
• Strategies:
• Static Quorum (like zoo-keeper)
• Keep Majority
• Keep Oldest
• Keep Referee
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
http://doc.akka.io/docs/akka/rp-15v09p01/scala/split-brain-resolver.html
17. Split Brain Resolver
• The default behaviour of Akka Cluster is “Manual Downing”:
• A node needs to issue cluster.down(address)
• This decision can be powered by external monitoring,
or DevOps teams observing the cluster.
• It is Safe.
however involves the most human/automated work
• A naive implementation exists called “auto-downing”
• It is not very safe to be used in real clusters
• Definitely not a good choice for apps using Persistence
• It is not recommended for production deployments.
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
http://doc.akka.io/docs/akka/rp-15v09p01/scala/split-brain-resolver.html
21. Heartbeats
A
`n-1` is down!
I’ll take over `A`!
A
good if: n-1 really is down.
bad: if n-1 is just very unresponsive
Fundamentally, it is hard to distinguish the two states in distributed systems.
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
22. Static Quorum (3 (> (n/2 +1))
A
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
23. Static Quorum (3 (> (n/2 +1))
we need to down
ourselves
A
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
24. Keep Majority (aka. dynamic quorum)
A
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
25. Keep Majority (aka. dynamic quorum)
A
we need to down
ourselves
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
28. oldest node
Keep Oldest
A
can’t see oldest node!
down-if-alone
oldest node can change,
if “up until now oldest node” leaves the
cluster.
This is more dynamic than keep-referee.
30. Persistence: Cross-scala-version compat
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
Enhanced compatibility for persistent snapshot envelope.
(Payload compatibility depends on application.)
31. Persistence: Cross-scala-version compat
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
Enhanced compatibility for persistent snapshot envelope.
(Payload compatibility depends on application.)
• Scala 2.10 is not binary compatible with 2.11
• 10 => 11 is “major update” by design
32. Persistence: Cross-scala-version compat
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
Enhanced compatibility for persistent snapshot envelope.
(Payload compatibility depends on application.)
• More compatible deserialisation than the language
itself!
• Eases migration to latest Scala versions
• (Your journal may actually not be affected and be compatible
anyway.)
• Scala 2.10 is not binary compatible with 2.11
• 10 => 11 is “major update” by design
36. Java 6: Extended LTS
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
• Existing RP releases keep Java 1.6 compatibility
37. Java 6: Extended LTS
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
• Existing RP releases keep Java 1.6 compatibility
• Akka Streams & Http currently work with 1.6
• will be merged into Akka 2.4 (likely after 1.1)
• we can back-port and support for RP (Akka 2.3)
38. Java 6: Extended LTS
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
• Existing RP releases keep Java 1.6 compatibility
• Akka Streams & Http currently work with 1.6
• will be merged into Akka 2.4 (likely after 1.1)
• we can back-port and support for RP (Akka 2.3)
• Akka 2.4 does require Java 8
• Scala 2.11 + Scala 2.12 (once released)
• it will enter RP once released
39. Akka 2.4
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
40. Akka 2.4
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
• 2.3 => 2.4 is a major update
• additional effort made it binary compatible!
• it does require Java 1.8
• i.e. update your JDK, same sources “just work”
• Future:
• Version bump to 3.0 if binary incompatible
41. Cluster Tools
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
Now Stable!
42. Akka 2.4 Cluster Tools (Now Stable!)
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
• Distributed Pub Sub
• Smart message batching (1 send per node)
• Cluster Singleton
• useful for “master” or coordinator Actors
• Cluster Sharding
• useful for sharding load onto the cluster
• graceful shut-down
• balancing load across cluster
43. Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
doc.akka.io/docs/akka/2.4.0-RC1/scala/distributed-pub-sub.html
class Subscriber extends Actor with ActorLogging {
import DistributedPubSubMediator.{ Subscribe, SubscribeAck }
val mediator = DistributedPubSub(context.system).mediator
// subscribe to the topic named "content"
mediator ! Subscribe("content", self)
def receive = {
case SubscribeAck(Subscribe("content", None, `self`)) ⇒
context become ready
}
def ready: Actor.Receive = {
case s: String ⇒
log.info("Got {}", s)
}
}
Akka 2.4 Cluster Tools - PubSub (Now Stable!)
44. Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
class Publisher extends Actor {
import DistributedPubSubMediator.Publish
// activate the extension
val mediator = DistributedPubSub(context.system).mediator
def receive = {
case in: String ⇒
val out = in.toUpperCase
mediator ! Publish("content", out)
}
}
doc.akka.io/docs/akka/2.4.0-RC1/scala/distributed-pub-sub.html
Akka 2.4 Cluster Tools - PubSub (Now Stable!)
45. Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
A
B
C D
http://doc.akka.io/docs/akka/2.4.0-RC1/scala/cluster-singleton.html
Akka 2.4 Cluster Tools - Cluster Singleton (Now Stable!)
46. Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
A
B
C
D
role: backend-2 role: backend-2
http://doc.akka.io/docs/akka/2.4.0-RC1/scala/cluster-singleton.html
Akka 2.4 Cluster Tools - Cluster Singleton (Now Stable!)
47. Akka 2.4 Cluster Tools - Sharding (Now Stable!)
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
A B
C
D
doc.akka.io/docs/akka/2.4.0-RC1/scala/cluster-sharding.html
48. Akka 2.4 Cluster Tools - Sharding (Now Stable!)
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
val counterRegion: ActorRef = ClusterSharding(system).start(
typeName = "Counter",
entityProps = Props[Counter],
settings = ClusterShardingSettings(system),
extractEntityId = extractEntityId,
extractShardId = extractShardId)
val counterRegion: ActorRef =
ClusterSharding(system).shardRegion("Counter")
counterRegion ! Get(123)
expectMsg(0)
Start a shard region:
Other nodes in cluster send messages to it:
doc.akka.io/docs/akka/2.4.0-RC1/scala/cluster-sharding.html
50. var state = S0
persistenceId = “a”
Command
Journal
Akka 2.4 Persistence (Now Stable!)
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
51. var state = S0
persistenceId = “a”
Journal
Generate Events
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
Akka 2.4 Persistence (Now Stable!)
52. var state = S0
persistenceId = “a”
Journal
Generate Events
E1
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
Akka 2.4 Persistence (Now Stable!)
53. ACK “persisted”
Journal
E1
var state = S0
persistenceId = “a”
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
Akka 2.4 Persistence (Now Stable!)
54. “Apply” event
Journal
E1
var state = S0
persistenceId = “a”
E1
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
Akka 2.4 Persistence (Now Stable!)
55. Journal
E1
var state = S0
persistenceId = “a”
E1
Okey!
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
Akka 2.4 Persistence (Now Stable!)
56. Journal
E1
var state = S0
persistenceId = “a”
E1
Okey!
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
Akka 2.4 Persistence (Now Stable!)
57. Journal
E1
var state = S0
persistenceId = “a”
E1
Ok, he got my $.
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
Akka 2.4 Persistence (Now Stable!)
58. …sum of states…
Journal
E1 E2 E3 E4
E5 E6 E7 E8
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
Akka 2.4 Persistence (Now Stable!)
59. Snapshot Store
snapshot!
state until [E5]
S5Journal
E1 E2 E3 E4
E5 E6 E7 E8
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
Akka 2.4 Persistence (Now Stable!)
60. Snapshot Store
state until [E8]
S8Journal
E1 E2 E3 E4
E5 E6 E7 E8
S5
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
Akka 2.4 Persistence (Now Stable!)
61. state until [E8]
S8
Snapshot Store
Journal
E1 E2 E3 E4
E5 E6 E7 E8
crash!
S5
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
Akka 2.4 Persistence (Now Stable!)
62. Snapshot Store
Journal
E1 E2 E3 E4
E5 E6 E7 E8
crash!
S5
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
Akka 2.4 Persistence (Now Stable!)
63. “bring me up-to-date!”
Snapshot Store
Journal
E1 E2 E3 E4
E5 E6 E7 E8
restart!
replay!
S5
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
Akka 2.4 Persistence (Now Stable!)
64. “bring me up-to-date!”
Snapshot Store
restart!
replay!
S5
Journal
E1 E2 E3 E4
E5 E6 E7 E8
S5
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
Akka 2.4 Persistence (Now Stable!)
65. state until [E8]
Snapshot Store
S5
restart!
replay!
S8
Journal
E1 E2 E3 E4
E5 E6 E7 E8
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
Akka 2.4 Persistence (Now Stable!)
66. Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
Advanced support for long-term schema evolution.
EventAdapters & StringManifestSerializers
Akka 2.4 Persistence (Now Stable!)
67. Persistence Query
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
New module, experimental!
68. Akka 2.4 Persistence Queries (experimental)
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
API still work in progress, should be polished very soon.
val query: Source[RichEvent, QueryStats] =
readJournal.query(ByTagsWithStats(Set("red", "blue")))
query
.map { event => s"Event payload: ${event.payload}" }
.runWith(Sink.ignore)
69. Akka 2.4 Persistence Queries (experimental)
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
API still work in progress, should be polished very soon.
val query: Source[RichEvent, QueryStats] =
readJournal.query(ByTagsWithStats(Set("red", "blue")))
query
.map { event => s"Event payload: ${event.payload}" }
.runWith(Sink.ignore)
Journalwrite-side query-side
Query
Optimised
Journal
Simple view / result
70. Akka Typed
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
New module, experimental!
71. doc.akka.io/docs/akka/2.4.0-RC1/scala/typed-actors.html
class Greeter extends Actor {
def receive = {
case msg: Greet ⇒
println(s"Hello ${msg.whom}!")
sender() ! Greeted(msg.whom)
}
}
val system: ActorSystem =
ActorSystem(“akka-actor-system“)
val greeter =
system.actorOf(Props[Greeter])
system ! Greet("kapi", system.deadLetters)
Akka Actor
Akka 2.4 Typed (experimental)
72. Akka 2.4 Typed (experimental)
val greeter = Total[Greet] { msg ⇒
println(s"Hello ${msg.whom}!")
msg.replyTo ! Greeted(msg.whom)
Same
}
val system: ActorSystem[Greet] =
ActorSystem(“typed", Props(totalGreeter))
system ! Greet("kapi", system.deadLetters)
class Greeter extends Actor {
def receive = {
case msg: Greet ⇒
println(s"Hello ${msg.whom}!")
sender() ! Greeted(msg.whom)
}
}
val system: ActorSystem =
ActorSystem(“akka-actor-system“)
val greeter =
system.actorOf(Props[Greeter])
system ! Greet("kapi", system.deadLetters)
Akka Actor Akka Typed
doc.akka.io/docs/akka/2.4.0-RC1/scala/typed-actors.html
73. val greeter = Total[Greet] { msg ⇒
println(s"Hello ${msg.whom}!")
msg.replyTo ! Greeted(msg.whom)
Same
}
val system: ActorSystem[Greet] =
ActorSystem(“typed", Props(totalGreeter))
system ! Greet("kapi", system.deadLetters)
class Greeter extends Actor {
def receive = {
case msg: Greet ⇒
println(s"Hello ${msg.whom}!")
sender() ! Greeted(msg.whom)
}
}
val system: ActorSystem =
ActorSystem(“akka-actor-system“)
val greeter =
system.actorOf(Props[Greeter])
system ! Greet("kapi", system.deadLetters)
Akka Actor Akka Typed
The main concept is Behaviour[T]
Explicit protocols for the win!
doc.akka.io/docs/akka/2.4.0-RC1/scala/typed-actors.html
Akka 2.4 Typed (experimental)
74. val greeter = Total[Greet] { msg ⇒
println(s"Hello ${msg.whom}!")
msg.replyTo ! Greeted(msg.whom)
Same
}
val system: ActorSystem[Greet] =
ActorSystem(“typed", Props(totalGreeter))
system ! Greet("kapi", system.deadLetters)
class Greeter extends Actor {
def receive = {
case msg: Greet ⇒
println(s"Hello ${msg.whom}!")
sender() ! Greeted(msg.whom)
}
}
val system: ActorSystem =
ActorSystem(“akka-actor-system“)
val greeter =
system.actorOf(Props[Greeter])
system ! Greet("kapi", system.deadLetters)
Akka Actor Akka Typed
Since Behaviour[Greet] is typed,
msgis-a Greet.
doc.akka.io/docs/akka/2.4.0-RC1/scala/typed-actors.html
Akka 2.4 Typed (experimental)
75. val greeter = Total[Greet] { msg ⇒
println(s"Hello ${msg.whom}!")
msg.replyTo ! Greeted(msg.whom)
Same
}
val system: ActorSystem[Greet] =
ActorSystem(“typed", Props(totalGreeter))
system ! Greet("kapi", system.deadLetters)
class Greeter extends Actor {
def receive = {
case msg: Greet ⇒
println(s"Hello ${msg.whom}!")
sender() ! Greeted(msg.whom)
}
}
val system: ActorSystem =
ActorSystem(“akka-actor-system“)
val greeter =
system.actorOf(Props[Greeter])
system ! Greet("kapi", system.deadLetters)
Akka Actor Akka Typed
The Behaviour[T]is the receive.
doc.akka.io/docs/akka/2.4.0-RC1/scala/typed-actors.html
Akka 2.4 Typed (experimental)
76. val greeter = Total[Greet] { msg ⇒
println(s"Hello ${msg.whom}!")
msg.replyTo ! Greeted(msg.whom)
Same
}
val system: ActorSystem[Greet] =
ActorSystem(“typed", Props(totalGreeter))
system ! Greet("kapi", system.deadLetters)
class Greeter extends Actor {
def receive = {
case msg: Greet ⇒
println(s"Hello ${msg.whom}!")
sender() ! Greeted(msg.whom)
}
}
val system: ActorSystem =
ActorSystem(“akka-actor-system“)
val greeter =
system.actorOf(Props[Greeter])
system ! Greet("kapi", system.deadLetters)
Akka Actor Akka Typed
sender()is no more.
Explicit protocols for the win!
doc.akka.io/docs/akka/2.4.0-RC1/scala/typed-actors.html
Akka 2.4 Typed (experimental)
77. val greeter = Total[Greet] { msg ⇒
println(s"Hello ${msg.whom}!")
msg.replyTo ! Greeted(msg.whom)
Same
}
val system: ActorSystem[Greet] =
ActorSystem(“typed", Props(totalGreeter))
system ! Greet("kapi", system.deadLetters)
class Greeter extends Actor {
def receive = {
case msg: Greet ⇒
println(s"Hello ${msg.whom}!")
sender() ! Greeted(msg.whom)
}
}
val system: ActorSystem =
ActorSystem(“akka-actor-system“)
val greeter =
system.actorOf(Props[Greeter])
system ! Greet("kapi", system.deadLetters)
Akka Actor Akka Typed
sender()is no more.
Explicit protocols for the win!
final case class Greet(whom: String, replyTo: ActorRef[Greeted])
doc.akka.io/docs/akka/2.4.0-RC1/scala/typed-actors.html
Akka 2.4 Typed (experimental)
78. val greeter = Total[Greet] { msg ⇒
println(s"Hello ${msg.whom}!")
msg.replyTo ! Greeted(msg.whom)
Same
}
val system: ActorSystem[Greet] =
ActorSystem(“typed", Props(totalGreeter))
system ! Greet("kapi", system.deadLetters)
class Greeter extends Actor {
def receive = {
case msg: Greet ⇒
println(s"Hello ${msg.whom}!")
sender() ! Greeted(msg.whom)
}
}
val system: ActorSystem =
ActorSystem(“akka-actor-system“)
val greeter =
system.actorOf(Props[Greeter])
system ! Greet("kapi", system.deadLetters)
Akka Actor Akka Typed
ActorRef[T]is now typed!
doc.akka.io/docs/akka/2.4.0-RC1/scala/typed-actors.html
Akka 2.4 Typed (experimental)
79. val greeter = Total[Greet] { msg ⇒
println(s"Hello ${msg.whom}!")
msg.replyTo ! Greeted(msg.whom)
Same
}
val system: ActorSystem[Greet] =
ActorSystem(“typed", Props(totalGreeter))
system ! Greet("kapi", system.deadLetters)
class Greeter extends Actor {
def receive = {
case msg: Greet ⇒
println(s"Hello ${msg.whom}!")
sender() ! Greeted(msg.whom)
}
}
val system: ActorSystem =
ActorSystem(“akka-actor-system“)
val greeter =
system.actorOf(Props[Greeter])
system ! Greet("kapi", system.deadLetters)
Akka Actor Akka Typed
become()is required.
And replaced by returning the “next” Behaviour[T]
// context.become(receive)
doc.akka.io/docs/akka/2.4.0-RC1/scala/typed-actors.html
Akka 2.4 Typed (experimental)
80. val greeter = Total[Greet] { msg ⇒
println(s"Hello ${msg.whom}!")
msg.replyTo ! Greeted(msg.whom)
Same
}
val system: ActorSystem[Greet] =
ActorSystem(“typed", Props(totalGreeter))
system ! Greet("kapi", system.deadLetters)
class Greeter extends Actor {
def receive = {
case msg: Greet ⇒
println(s"Hello ${msg.whom}!")
sender() ! Greeted(msg.whom)
}
}
val system: ActorSystem =
ActorSystem(“akka-actor-system“)
val greeter =
system.actorOf(Props[Greeter])
system ! Greet("kapi", system.deadLetters)
Akka Actor Akka Typed
become()is required.
And replaced by returning the “next” Behaviour[T]
On a conceptual level at least,
we provide Static[T]if you don’t need become.
// context.become(receive)
doc.akka.io/docs/akka/2.4.0-RC1/scala/typed-actors.html
Akka 2.4 Typed (experimental)
81. val greeter = Total[Greet] { msg ⇒
println(s"Hello ${msg.whom}!")
msg.replyTo ! Greeted(msg.whom)
Same
}
val system: ActorSystem[Greet] =
ActorSystem(“typed", Props(totalGreeter))
system ! Greet("kapi", system.deadLetters)
class Greeter extends Actor {
def receive = {
case msg: Greet ⇒
println(s"Hello ${msg.whom}!")
sender() ! Greeted(msg.whom)
}
}
val system: ActorSystem =
ActorSystem(“akka-actor-system“)
val greeter =
system.actorOf(Props[Greeter])
system ! Greet("kapi", system.deadLetters)
Akka Actor Akka Typed
become()is required.
And replaced by returning the “next” Behaviour[T]
Special behaviors:
Same / Unhandled / Empty / Stopped / Ignore
// context.become(receive)
doc.akka.io/docs/akka/2.4.0-RC1/scala/typed-actors.html
Akka 2.4 Typed (experimental)
82. val greeter = Total[Greet] { msg ⇒
println(s"Hello ${msg.whom}!")
msg.replyTo ! Greeted(msg.whom)
Same
}
val system: ActorSystem[Greet] =
ActorSystem(“typed", Props(totalGreeter))
system ! Greet("kapi", system.deadLetters)
class Greeter extends Actor {
def receive = {
case msg: Greet ⇒
println(s"Hello ${msg.whom}!")
sender() ! Greeted(msg.whom)
}
}
val system: ActorSystem =
ActorSystem(“akka-actor-system“)
val greeter =
system.actorOf(Props[Greeter])
system ! Greet("kapi", system.deadLetters)
Akka Actor Akka Typed
“Root actor” is not user-defined for ActorSystem[T]
Encourages thinking about supervision.
doc.akka.io/docs/akka/2.4.0-RC1/scala/typed-actors.html
Akka 2.4 Typed (experimental)
83. Akka Distributed Data
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
New module, experimental!
84. Akka 2.4 Distributed Data (experimental)
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
for “small, fast data”
Implements various CRDTs and gossips changes through the
Cluster.
CRDTs = Conflict-free Replicated Data Types
Data structures that can be concurrently updated
and always eventually converge on the same value.
doc.akka.io/docs/akka/2.4.0-RC1/scala/distributed-data.html
85. Akka 2.4 Distributed Data (experimental)
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
for “small, fast data”
Implements various CRDTs and gossips changes through the
Cluster.
CRDTs = Conflict-free Replicated Data Types
Data structures that can be concurrently updated
and always eventually converge on the same value.
doc.akka.io/docs/akka/2.4.0-RC1/scala/distributed-data.html
86. Akka 2.4 Distributed Data (experimental)
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
value = 5
n1: 2
n2: 0
n3: 3
Akka Cluster (gossip)
GCounter example:
value = 5
n1: 2
n2: 0
n3: 3
value = 5
n1: 2
n2: 0
n3: 3
node-1 node-2
node-3
doc.akka.io/docs/akka/2.4.0-RC1/scala/distributed-data.html
87. Akka 2.4 Distributed Data (experimental)
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
value = 6
n1: 2+1
n2: 0
n3: 3
Akka Cluster (gossip)
GCounter example:
value = 5
n1: 2
n2: 0
n3: 3
value = 6
n1: 2
n2: 0
n3: 3+1
node-1 node-2
node-3
doc.akka.io/docs/akka/2.4.0-RC1/scala/distributed-data.html
88. Akka 2.4 Distributed Data (experimental)
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
node-1 node-2
node-3
value = 7
n1: 2+1
n2: 0
n3: 3+1
Akka Cluster (gossip)
GCounter example:
value = 5
n1: 2
n2: 0
n3: 3
value = 6
n1: 2
n2: 0
n3: 3+1
doc.akka.io/docs/akka/2.4.0-RC1/scala/distributed-data.html
89. Akka 2.4 Distributed Data (experimental)
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
node-1 node-2
node-3
value = 7
n1: 2+1
n2: 0
n3: 3+1
Akka Cluster (gossip)
GCounter example:
value = 7
n1: 2+1
n2: 0
n3: 3+1
value = 7
n1: 2+1
n2: 0
n3: 3+1
doc.akka.io/docs/akka/2.4.0-RC1/scala/distributed-data.html
90. Akka 2.4 Distributed Data (experimental)
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
implicit val node = Cluster(system)
val replicator = DistributedData(system).replicator
val Counter1Key = PNCounterKey("counter1")
replicator ! Update(Counter1Key, PNCounter(), WriteLocal)(_ + 1)
doc.akka.io/docs/akka/2.4.0-RC1/scala/distributed-data.html
91. Akka 2.4 Distributed Data (experimental)
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
Provided data types:
• Counters: GCounter, PNCounter
• Sets: GSet, ORSet
• Maps: ORMap, ORMultiMap, LWWMap, PNCounterMap
• Registers: LWWRegister, Flag
doc.akka.io/docs/akka/2.4.0-RC1/scala/distributed-data.html
92. Akka Streams & Http
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
1.0 (experimental) currently.
will join the Akka 2.4.x release.
93. Akka Streams & Http (experimental, to eventually join Akka 2.4.x)
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
Akka Streams
Asynchronous Back-pressured Stream Processing
An implementation of Reactive Streams.
Reactive Streams
an initiative co-lead by Typesafe, Netflix, Pivotal, RedHat),
allowing for inter-op of asynchronous streaming libraries.
Akka Http
Superseeds Spray.io, the well known high-performance Http serv
Fully based on Akka Streams.
http://doc.akka.io/docs/akka-stream-and-http-experimental/1.0/scala.html
95. Akka Streams <-> Actors – Advanced
val subscriber = ActorSubscriber(
system.actorOf(Props[SubStreamParent], ”parent”)
)
Source(1 to 100)
.map(_.toString)
.filter(_.length == 2)
.drop(2)
.conflate(seed => seed)((acc, i) => acc + i)
.groupBy(_.last)
.runWith(subscriber)
All the usual ops available for Linear Flows.
http://doc.akka.io/docs/akka-stream-and-http-experimental/1.0/scala.html
96. Links
• akka.io
• reactive-streams.org
• akka-user
• https://www.typesafe.com/subscription
• Streams and Http
• http://doc.akka.io/docs/akka-stream-and-http-
experimental/1.0/scala.html
• http://doc.akka.io/docs/akka-stream-and-http-
experimental/1.0/java.html
• Akka 2.4 RC1
• http://doc.akka.io/docs/akka/2.4.0-RC1/scala.html
• http://doc.akka.io/docs/akka/2.4.0-RC1/java.html
Akka 2.4 and RP commercial features
with Konrad `@ktosopl` Malawski
97. Perhaps you’d also like…
WEBINAR
Introducing Typesafe
ConductR
WATCH NOW
HAVE QUESTIONS?
Get in touch with
Typesafe today!
CONTACT US
ACTIVATOR TEMPLATE
Akka Distributed
Data Samples (Scala)
CHECK IT OUT
98. EXPERT TRAINING
Delivered on-site for Akka, Spark, Scala and Play
Help is just a click away. Get in touch
with Typesafe about our training courses.
• Intro Workshop to Apache Spark
• Fast Track & Advanced Scala
• Fast Track to Akka with Java or
Scala
• Fast Track to Play with Java or Scala
• Advanced Akka with Java or Scala
Ask us about local trainings available by
24 Typesafe partners in 14 countries
around the world.
CONTACT US Learn more about on-site training
The company soon to be previously known as Typesafe
cluster sharding is the actual feature people want - “just balance this stuff on my cluster”.
It works by consistent hashing.
cluster sharding is the actual feature people want - “just balance this stuff on my cluster”.
It works by consistent hashing.
cluster sharding is the actual feature people want - “just balance this stuff on my cluster”.
It works by consistent hashing.
cluster sharding is the actual feature people want - “just balance this stuff on my cluster”.
It works by consistent hashing.
cluster sharding is the actual feature people want - “just balance this stuff on my cluster”.
It works by consistent hashing.
cluster sharding is the actual feature people want - “just balance this stuff on my cluster”.
It works by consistent hashing.
cluster sharding is the actual feature people want - “just balance this stuff on my cluster”.
It works by consistent hashing.
cluster sharding is the actual feature people want - “just balance this stuff on my cluster”.
It works by consistent hashing.
cluster sharding is the actual feature people want - “just balance this stuff on my cluster”.
It works by consistent hashing.
cluster sharding is the actual feature people want - “just balance this stuff on my cluster”.
It works by consistent hashing.
cluster sharding is the actual feature people want - “just balance this stuff on my cluster”.
It works by consistent hashing.
ADVANCED TOPIC:
Here you can explain that if the actor crashes during processing of the command.
The sender would not get the reply back, and IT should retry to send the transaction again afterwards.
The PersistentActor should be able to de-duplicate incoming events - this is actually pretty easy, just sequence numbers or some kind of transaction ids.
here we pick the latest snapshot, and then events later than it