Введение в Akka

66

description

 

Transcript of Введение в Akka

Page 1: Введение в Akka
Page 2: Введение в Akka

Ресурсы

• Оф. сайт – http://akka.io• Документация – http://doc.akka.io/docs/akka/snapshot/• ScalaDoc – http://doc.akka.io/api/akka/snapshot/• Введение (30 минут) – Typesafe Activator template “Hello

Akka!”• Курс (8 часов) – Principles of Reactive Programming (Weeks

5,6,7)• Реактивный манифест – http://habrahabr.ru/post/195562/• Книга (не введение) – Effective Akka: Patterns and Best

Practices by Jamie Allen

Page 3: Введение в Akka

Модули Akka

akka-actor – Classic Actors, Typed Actors, IO Actor etc.akka-agent – Agents, integrated with Scala STMakka-camel – Apache Camel integrationakka-cluster – Cluster membership management, elastic routers.akka-kernel – Akka microkernel for running a bare-bones mini application serverakka-osgi – base bundle for using Akka in OSGi containers, containing the akka-actor classesakka-osgi-aries – Aries blueprint for provisioning actor systemsakka-remote – Remote Actorsakka-slf4j – SLF4J Logger (event bus listener)akka-testkit – Toolkit for testing Actor systemsakka-zeromq – ZeroMQ integration

Page 4: Введение в Akka

Примеры

• spray – веб-сервер и фреймворк для написания HTTP/REST приложений

• xitrum – веб-фреймворк• Klout – сервис анализ социальных связей• Amazon• Blizzard• Autodesk• ...

Page 5: Введение в Akka

ПроблемаБлокирующие вызовы:• Blocking IO• Примитивы синхронизации (мьютексы, семафоры, CountDownLatch, …)• Thread.sleep()• Future.get()

Итог:• Простаивание ресурсов• Дедлоки• Сильная связанность

компонентов• Ухудшается

отзывчивость системы• Теряется возможность

масштабирования

Page 6: Введение в Akka

РешениеРешение – акторы, взаимодействующие между собой асинхронно посредством сообщений (и только сообщений).

Акторы похожи на людей в комнате, говорящих друг с другом.

Page 7: Введение в Akka

РешениеРешение – акторы, взаимодействующие между собой асинхронно посредством сообщений (и только сообщений).

Акторы похожи на людей в комнате, говорящих друг с другом.

Page 8: Введение в Akka

Actor trait

type Receive = PartialFunction[Any, Unit]

trait Actor { def receive: Receive = ??? ...}

Page 9: Введение в Akka

Пример Actor’а

class Time extends Actor { def receive = { case "What is the time?" => sender ! "12:43" }}

Page 10: Введение в Akka

Пример stateful Actor’а

class Counter extends Actor { var count = 0 def receive = { case "incr" => count += 1 case ("get", customer: ActorRef) => customer ! count }}

Page 11: Введение в Akka

Демонстрация

Parent

BankAccount

Page 12: Введение в Akka

Демонстрация

Parent

BankAccount

akka://Main/user/app#-1327529947

akka://Main/user/app/acc1#1803679474

Page 13: Введение в Akka

Stopping Actors

context.stop(actor)

actor ! PoisonPill

или

В обоих случаях посылается сообщение.В первом случае все сообщения в очереди выбрасываются.Во втором – сообщение кладется в конец очереди.

Page 14: Введение в Akka

Закрепим знания

• Все акторы инкапсулированы и независимы (больше инкапсуляции, чем в традиционном ООП). Нету способа взаимодействия с акторами кроме отправки сообщений.

• Сообщения должны быть иммутабельными.• Избегать блокировок в акторах. Нужно использовать

асинхронное API для работы с файлами, БД, …• Отправка сообщений не является надёжной.• Порядок отправки и принятия сообщений неопределён

(кроме случая, когда актор посылает другому актору подряд сообщения).

Page 15: Введение в Akka

Иерархии акторов

Большая корпорация

Отдел маркетинга Бухгалтерия

Отдел разработки

Проект1

БД UI

Напоминают иерархию большой корпорации

Page 16: Введение в Akka

Supervision

Большая корпорация

Отдел маркетинга Бухгалтерия

Отдел разработки

Проект1

БД UI

Напоминают иерархию большой корпорации

Page 17: Введение в Akka

Supervision

Большая корпорация

Отдел маркетинга Бухгалтерия

Отдел разработки

Проект1

БД UI

Напоминают иерархию большой корпорации

Page 18: Введение в Akka

Supervision

Большая корпорация

Отдел маркетинга Бухгалтерия

Отдел разработки

Проект1

БД UI

Напоминают иерархию большой корпорации

Принимает решение

Page 19: Введение в Akka

Supervision

class Manager extends Actor { override val supervisorStrategy = OneForOneStrategy() { case _: DBException => Restart // reconnect to DB case _: NullPointerException => Stop case _: ServiceDownException => Escalate } def receive = ???}

Page 20: Введение в Akka

Жизненный цикл Actor’а

• start• (restart)*• stop

Page 21: Введение в Akka

Жизненный цикл Actor’а

• start• (restart)*• stop

context.actorOf(…)

Page 22: Введение в Akka

Жизненный цикл Actor’а

• start• (restart)*• stop

context.actorOf(…)new Actor

Page 23: Введение в Akka

Жизненный цикл Actor’а

• start• (restart)*• stop

context.actorOf(…)new Actor

preStart

Page 24: Введение в Akka

Жизненный цикл Actor’а

• start• (restart)*• stop

context.actorOf(…)new Actor

preStart

Page 25: Введение в Akka

Жизненный цикл Actor’а

• start• (restart)*• stop

context.actorOf(…)new Actor

preStart

Restart

Page 26: Введение в Akka

Жизненный цикл Actor’а

• start• (restart)*• stop

context.actorOf(…)new Actor

preStart

Restart

preRestart

Page 27: Введение в Akka

Жизненный цикл Actor’а

• start• (restart)*• stop

context.actorOf(…)new Actor

preStart

Restart

preRestart

new Actor

Page 28: Введение в Akka

Жизненный цикл Actor’а

• start• (restart)*• stop

context.actorOf(…)new Actor

preStart

Restart

preRestart

new Actor

postRestart

Page 29: Введение в Akka

Жизненный цикл Actor’а

• start• (restart)*• stop

context.actorOf(…)new Actor

preStart

Restart

preRestart

new Actor

postRestart stop

Page 30: Введение в Akka

Жизненный цикл Actor’а

• start• (restart)*• stop

context.actorOf(…)new Actor

preStart

Restart

preRestart

new Actor

postRestart stop

StoppostStop

Page 31: Введение в Akka

Жизненный цикл Actor’а

• start• (restart)*• stop

context.actorOf(…)new Actor

preStart

Restart

preRestart

new Actor

postRestart stop

StoppostStop

Может произойти [0, ∞) раз

Page 32: Введение в Akka

Закрепим знания

• Акторы организуются в иерархии.• Акторы обязаны обрабатывать ошибки своих дочерних

акторов. Тем самым достигается отказоустойчивость системы.• Рестарты акторов не наблюдаемы из внешнего мира.• При рестарте актора рестартуется всё его поддерево.• Рестарты в листьях дерева иерархии происходят чаще.• Рискованные задачи желательно делегировать дочерним

акторам, если родительский актор имеет важное состояние.

Page 33: Введение в Akka

Поиск акторовclass MyActor extends Actor { val path = "/user/app/b" context.actorSelection(path) ! Identify(42) def receive = { case ActorIdentity(42, Some(actorRef)) => { println(s"Actor with $path found: $actorRef") } case ActorIdentity(42, None) => { println(s"Actor with $path not found") } }}

Page 34: Введение в Akka

Поиск акторов

context.actorSelection("/user/app/b")

context.actorSelection("child")

context.actorSelection("../sibling")

context.actorSelection("akka.tcp://Main@host:port/user/app/b")

context.actorSelection("/user/app/*")

Поиск по абсолютному пути:

Поиск дочернего актора:

Поиск соседнего актора:

Поиск удалённого актора:

Поиск по wildcard’ам:

Page 35: Введение в Akka

Маршрутизация

Router

Routee1 Routee2 Routee3

? ? ?

Page 36: Введение в Akka

Round Robin

Router

Routee1 Routee2 Routee3

Page 37: Введение в Akka

Round Robin

Router

Routee1 Routee2 Routee3

Page 38: Введение в Akka

Round Robin

Router

Routee1 Routee2 Routee3

Page 39: Введение в Akka

Round Robin

Router

Routee1 Routee2 Routee3

Page 40: Введение в Akka

Round Robin

Router

Routee1 Routee2 Routee3

Page 41: Введение в Akka

Round Robin

• Сообщения должны быть равнозначными.• Воркеры должны быть равнозначными.

Page 42: Введение в Akka

Random

Router

Routee1 Routee2 Routee3

Page 43: Введение в Akka

Random

Router

Routee1 Routee2 Routee3

Page 44: Введение в Akka

Random

Router

Routee1 Routee2 Routee3

Page 45: Введение в Akka

Random

Router

Routee1 Routee2 Routee3

Page 46: Введение в Akka

Random

Router

Routee1 Routee2 Routee3

Page 47: Введение в Akka

Random

• Может вызвать разбалансировку.• Применимо, когда bottleneck в самом маршрутизаторе.• Применимо, когда есть несколько маршрутизаторов.• Воркеры должны быть равнозначными.• Сообщения должны быть равнозначными.

Page 48: Введение в Akka

Smallest mailbox

Router

Routee1 Routee2 Routee3

Page 49: Введение в Akka

Smallest mailbox

Router

Routee1 Routee2 Routee3

Page 50: Введение в Akka

Smallest mailbox

• Равномерная балансировка.• Сообщения должны быть равнозначными.• Неприменимо для удалённых воркеров.• Относительно высокая цена маршрутизации – нужно каждый

раз считать размер очереди.

Page 51: Введение в Akka

Broadcast

Router

Routee1 Routee2 Routee3

Page 52: Введение в Akka

Broadcast

Router

Routee1 Routee2 Routee3

Page 53: Введение в Akka

Broadcast

Router

Routee1 Routee2 Routee3

Page 54: Введение в Akka

Broadcast

• Можно назначать различные задачи.• Повышается надежность (некоторые воркеры могут упасть

при выполнении задач).• Требуется в n раз больше ресурсов, где n – количество

воркеров.

Page 55: Введение в Akka

ScatterGatherFirstCompletedOf

Router

Routee1 Routee2 Routee3

Page 56: Введение в Akka

ScatterGatherFirstCompletedOf

Router

Routee1 Routee2 Routee3

Самый быстрый ответ(остальные отвергаются)

Page 57: Введение в Akka

ScatterGatherFirstCompletedOf

• Применимо, когда нужно получить ответ как можно скорее.• Требуется в n раз больше ресурсов, где n – количество

воркеров.

Page 58: Введение в Akka

Consistent Hash

Router

Routee1 Routee2 Routee3

Page 59: Введение в Akka

Consistent Hash

Router

Routee1 Routee2 Routee3

Page 60: Введение в Akka

Consistent Hash

Router

Routee1 Routee2 Routee3

Page 61: Введение в Akka

Consistent Hash

Router

Routee1 Routee2 Routee3

Page 62: Введение в Akka

Consistent Hash

Router

Routee1 Routee2 Routee3

Page 63: Введение в Akka

Consistent Hash

• Задачи одного и того же типа отправляются одним и тем же воркерам.

• Позволяет избежать разделяемого состояния между воркерами. Например, сообщения, относящиеся к одному и тому же пользователю, всегда будут обработаны одним и тем же актором.

• Не гарантирует равномерность нагрузки.

Page 64: Введение в Akka

Закрепим знания

• Асинхронная передача сообщений обеспечивает вертикальное масштабирование: обрабатывая сообщение, актор не блокирует его, а уступает поток для обработки следующего сообщения.

• Прозрачность местонахождения акторов (location transparency) обеспечивает горизонтальное масштабирование.

Page 65: Введение в Akka

Нетронутые темы

• Кластеризация• Персистентность• Мониторинг жизненного цикла акторов• Конечные автоматы (FSM)• Spray – фреймворк для разработки HTTP/REST приложений• Тестирование акторов• Работа с TCP/UDP• Агенты• Интеграция с Apache Camel• ...

Page 66: Введение в Akka

Спасибо за внимание!