Работа с Akka Cluster - Александр Алексеев

17
Работа с Akka Cluster Александр a.k.a @afiskon

Transcript of Работа с Akka Cluster - Александр Алексеев

Page 1: Работа с Akka Cluster - Александр Алексеев

Работа с Akka ClusterАлександр a.k.a @afiskon

Page 2: Работа с Akka Cluster - Александр Алексеев

Что такое акторы?

● Легковесные процессы● Обмениваются сообщениями● Имеют очереди сообщений● Реализации: Erlang, Akka, Cloud Haskell

Page 3: Работа с Akka Cluster - Александр Алексеев

Что такое Akka Cluster?

● Как просто Akka, только акторы находятся не на одной машине

● И немного больше...

Page 4: Работа с Akka Cluster - Александр Алексеев

build.sbtlibraryDependencies ++= Seq(

"com.typesafe.akka" %% "akka-actor" % akkaVersion,

"com.typesafe.akka" %% "akka-cluster" % akkaVersion

)

resolvers += "Akka Snapshots" at "http://repo.akka.io/snapshots/"

Page 5: Работа с Akka Cluster - Александр Алексеев

application.confakka {

actor.provider = "akka.cluster.ClusterActorRefProvider"

remote.netty.tcp {

hostname = "127.0.0.1"

port = 2551

}

cluster.seed-nodes = [

"akka.tcp://[email protected]:2551",

"akka.tcp://[email protected]:2552"

]

}

Page 6: Работа с Akka Cluster - Александр Алексеев

Cluster Listenerval 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 =>}

Page 7: Работа с Akka Cluster - Александр Алексеев

Ручное управление нодами

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://[email protected]:49603

Page 8: Работа с Akka Cluster - Александр Алексеев

Автоматическое управление нодами

min-nr-of-members = 2auto-down-unreachable-after = 10s

Но кластер может развалиться на два при нетсплитах.

minClusterSize = floor(totalNodesNum / 2) + 1

Page 9: Работа с Akka Cluster - Александр Алексеев

Акторы-синглтоны

● ClusterSingletonProxy● ClusterSingletonManager● http://doc.akka.

io/docs/akka/snapshot/contrib/cluster-singleton.html

Координация действий, выполнение по расписанию, миграции БД, и так далее

Page 10: Работа с Akka Cluster - Александр Алексеев

Распределенные кэши (1 из 3)deployment { /sessionManager/router { router = consistent-hashing-group nr-of-instances = 16 routees.paths = ["/user/sessionManager"] cluster { enabled = on allow-local-routees = on } }}

Page 11: Работа с Akka Cluster - Александр Алексеев

Распределенные кэши (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}

Page 12: Работа с Akka Cluster - Александр Алексеев

Распределенные кэши (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 }}

Page 13: Работа с Akka Cluster - Александр Алексеев

Метрики и мониторинг

● http://kamon.io/● https://www.datadoghq.com/

Page 14: Работа с Akka Cluster - Александр Алексеев

Агрегация логов

● https://logentries.com/ ● https://logentries.com/insights/autoscaling/

Page 15: Работа с Akka Cluster - Александр Алексеев

Поиск узких мест

● Метрики● Флаг writeTrace: Boolean● Пробрасываение контекста Kamon’ом● Класс-наследник Actor● Смотрим в логи через Logentries● Немного хитрой логики, когда писать● + https://www.yourkit.com/

Page 17: Работа с Akka Cluster - Александр Алексеев

Вопросы?

Александрhttp://eax.me/http://devzen.ru/