Работа с Akka Cluster
Александр a.k.a @afiskon
Что такое акторы?
● Легковесные процессы
● Обмениваются сообщениями
● Имеют очереди сообщений
● Реализации: Erlang, Akka, Cloud Haskell
Что такое Akka Cluster?
● Как просто Akka, только акторы находятся
не на одной машине
● И немного больше...
build.sbt
libraryDependencies ++= Seq(
"com.typesafe.akka" %% "akka-actor" % akkaVersion,
"com.typesafe.akka" %% "akka-cluster" % akkaVersion
)
resolvers += "Akka Snapshots" at "http://repo.akka.io/snapshots/"
application.conf
akka {
actor.provider = "akka.cluster.ClusterActorRefProvider"
remote.netty.tcp {
hostname = "127.0.0.1"
port = 2551
}
cluster.seed-nodes = [
"akka.tcp://system@127.0.0.1:2551",
"akka.tcp://system@127.0.0.1:2552"
]
}
Cluster Listener
val cluster = Cluster(context.system)
override def preStart() {
cluster.subscribe(self, InitialStateAsEvents, classOf[MemberEvent],
classOf[UnreachableMember])
}
def receive = LoggingReceive {
case MemberUp(member) =>
case UnreachableMember(member) =>
case MemberRemoved(member, prevStatus) =>
case _: MemberEvent =>
}
Ручное управление нодами
http://downloads.typesafe.com/akka/akka_2.11-2.3.9.zip
java -Dcom.sun.management.jmxremote.port=9999 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false …
akka-cluster 127.0.0.1 9999 cluster-status
akka-cluster 127.0.0.1 9999 down akka.tcp://system@127.0.0.1:49603
Автоматическое управление нодами
min-nr-of-members = 2
auto-down-unreachable-after = 10s
Но кластер может развалиться на два при
нетсплитах.
minClusterSize = floor(totalNodesNum / 2) + 1
Акторы-синглтоны
● ClusterSingletonProxy
● ClusterSingletonManager
● http://doc.akka.
io/docs/akka/snapshot/contrib/cluster-
singleton.html
Координация действий, выполнение по
расписанию, миграции БД, и так далее
Распределенные кэши (1 из 3)
deployment {
/sessionManager/router {
router = consistent-hashing-group
nr-of-instances = 16
routees.paths = ["/user/sessionManager"]
cluster {
enabled = on
allow-local-routees = on
}
}
}
Распределенные кэши (2 из 3)
import akka.routing.ConsistentHashingRouter.ConsistentHashable
trait RoutedMsgWithId {
val id: Long
}
case class RoutedMsg[T](key: T, msg: Any) extends ConsistentHashable {
val consistentHashKey = key
}
Распределенные кэши (3 из 3)
class SessionManager extends Actor with ActorLogging {
val managerRouter = context.actorOf(Props.empty.withRouter(FromConfig), "router")
override def receive = LoggingReceive {
case msg: RoutedMsgWithId =>
managerRouter forward RoutedMsg(msg.id, msg)
case r@RoutedMsg(sid: Long, msg: Any) =>
val actorName = s"session-$sid"
context.child(actorName) getOrElse {
context.actorOf(SessionActor.props(sid), actorName)
} forward msg
}
}
Метрики и мониторинг
● http://kamon.io/
● https://www.datadoghq.com/
Агрегация логов
● https://logentries.com/
● https://logentries.com/insights/autoscaling/
Поиск узких мест
● Метрики
● Флаг writeTrace: Boolean
● Пробрасываение контекста Kamon’ом
● Класс-наследник Actor
● Смотрим в логи через Logentries
● Немного хитрой логики, когда писать
● + https://www.yourkit.com/
Полезные ссылки
● http://doc.akka.io/docs/akka/snapshot/scala.html
● http://doc.akka.io/docs/akka-stream-and-http-
experimental/1.0-M4/scala.html
● https://groups.google.com/forum/#!forum/akka-user
● https://groups.google.com/forum/#!forum/kamon-user
● https://groups.google.com/forum/#!forum/scala-russian
● https://github.com/mr-mig/ru-it-chats
Вопросы?
Александр
http://eax.me/
http://devzen.ru/

Работа с Akka Сluster, @afiskon, scalaby#14