Работа с Akka Cluster - Александр Алексеев
-
Upload
aleksander-alekseev -
Category
Software
-
view
166 -
download
11
Transcript of Работа с Akka Cluster - Александр Алексеев
![Page 1: Работа с Akka Cluster - Александр Алексеев](https://reader035.fdocuments.net/reader035/viewer/2022082205/58f186491a28ab49378b45fb/html5/thumbnails/1.jpg)
Работа с Akka ClusterАлександр a.k.a @afiskon
![Page 2: Работа с Akka Cluster - Александр Алексеев](https://reader035.fdocuments.net/reader035/viewer/2022082205/58f186491a28ab49378b45fb/html5/thumbnails/2.jpg)
Что такое акторы?
● Легковесные процессы● Обмениваются сообщениями● Имеют очереди сообщений● Реализации: Erlang, Akka, Cloud Haskell
![Page 3: Работа с Akka Cluster - Александр Алексеев](https://reader035.fdocuments.net/reader035/viewer/2022082205/58f186491a28ab49378b45fb/html5/thumbnails/3.jpg)
Что такое Akka Cluster?
● Как просто Akka, только акторы находятся не на одной машине
● И немного больше...
![Page 4: Работа с Akka Cluster - Александр Алексеев](https://reader035.fdocuments.net/reader035/viewer/2022082205/58f186491a28ab49378b45fb/html5/thumbnails/4.jpg)
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 - Александр Алексеев](https://reader035.fdocuments.net/reader035/viewer/2022082205/58f186491a28ab49378b45fb/html5/thumbnails/5.jpg)
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 - Александр Алексеев](https://reader035.fdocuments.net/reader035/viewer/2022082205/58f186491a28ab49378b45fb/html5/thumbnails/6.jpg)
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 - Александр Алексеев](https://reader035.fdocuments.net/reader035/viewer/2022082205/58f186491a28ab49378b45fb/html5/thumbnails/7.jpg)
Ручное управление нодами
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 - Александр Алексеев](https://reader035.fdocuments.net/reader035/viewer/2022082205/58f186491a28ab49378b45fb/html5/thumbnails/8.jpg)
Автоматическое управление нодами
min-nr-of-members = 2auto-down-unreachable-after = 10s
Но кластер может развалиться на два при нетсплитах.
minClusterSize = floor(totalNodesNum / 2) + 1
![Page 9: Работа с Akka Cluster - Александр Алексеев](https://reader035.fdocuments.net/reader035/viewer/2022082205/58f186491a28ab49378b45fb/html5/thumbnails/9.jpg)
Акторы-синглтоны
● ClusterSingletonProxy● ClusterSingletonManager● http://doc.akka.
io/docs/akka/snapshot/contrib/cluster-singleton.html
Координация действий, выполнение по расписанию, миграции БД, и так далее
![Page 10: Работа с Akka Cluster - Александр Алексеев](https://reader035.fdocuments.net/reader035/viewer/2022082205/58f186491a28ab49378b45fb/html5/thumbnails/10.jpg)
Распределенные кэши (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 - Александр Алексеев](https://reader035.fdocuments.net/reader035/viewer/2022082205/58f186491a28ab49378b45fb/html5/thumbnails/11.jpg)
Распределенные кэши (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 - Александр Алексеев](https://reader035.fdocuments.net/reader035/viewer/2022082205/58f186491a28ab49378b45fb/html5/thumbnails/12.jpg)
Распределенные кэши (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 - Александр Алексеев](https://reader035.fdocuments.net/reader035/viewer/2022082205/58f186491a28ab49378b45fb/html5/thumbnails/13.jpg)
Метрики и мониторинг
● http://kamon.io/● https://www.datadoghq.com/
![Page 14: Работа с Akka Cluster - Александр Алексеев](https://reader035.fdocuments.net/reader035/viewer/2022082205/58f186491a28ab49378b45fb/html5/thumbnails/14.jpg)
Агрегация логов
● https://logentries.com/ ● https://logentries.com/insights/autoscaling/
![Page 15: Работа с Akka Cluster - Александр Алексеев](https://reader035.fdocuments.net/reader035/viewer/2022082205/58f186491a28ab49378b45fb/html5/thumbnails/15.jpg)
Поиск узких мест
● Метрики● Флаг writeTrace: Boolean● Пробрасываение контекста Kamon’ом● Класс-наследник Actor● Смотрим в логи через Logentries● Немного хитрой логики, когда писать● + https://www.yourkit.com/
![Page 16: Работа с Akka Cluster - Александр Алексеев](https://reader035.fdocuments.net/reader035/viewer/2022082205/58f186491a28ab49378b45fb/html5/thumbnails/16.jpg)
Полезные ссылки● 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
![Page 17: Работа с Akka Cluster - Александр Алексеев](https://reader035.fdocuments.net/reader035/viewer/2022082205/58f186491a28ab49378b45fb/html5/thumbnails/17.jpg)
Вопросы?
Александрhttp://eax.me/http://devzen.ru/