Устойчивый к искажениям алгоритм распознавания штрих-кода EAN-13
Введение в Akka
1.
2. Ресурсы
• Оф. сайт – 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
3. Модули Akka
akka-actor – Classic Actors, Typed Actors, IO Actor etc.
akka-agent – Agents, integrated with Scala STM
akka-camel – Apache Camel integration
akka-cluster – Cluster membership management, elastic routers.
akka-kernel – Akka microkernel for running a bare-bones mini application server
akka-osgi – base bundle for using Akka in OSGi containers, containing the akka-actor classes
akka-osgi-aries – Aries blueprint for provisioning actor systems
akka-remote – Remote Actors
akka-slf4j – SLF4J Logger (event bus listener)
akka-testkit – Toolkit for testing Actor systems
akka-zeromq – ZeroMQ integration
4. Примеры
• spray – веб-сервер и фреймворк для написания HTTP/REST
приложений
• xitrum – веб-фреймворк
• Klout – сервис анализ социальных связей
• Amazon
• Blizzard
• Autodesk
• ...
5. Проблема
Блокирующие вызовы:
• Blocking IO
• Примитивы синхронизации (мьютексы, семафоры, CountDownLatch, …)
• Thread.sleep()
• Future.get()
Итог:
• Простаивание ресурсов
• Дедлоки
• Сильная связанность
компонентов
• Ухудшается
отзывчивость системы
• Теряется возможность
масштабирования
6. Решение
Решение – акторы, взаимодействующие между
собой асинхронно посредством сообщений (и
только сообщений).
Акторы похожи на людей в комнате, говорящих
друг с другом.
7. Решение
Решение – акторы, взаимодействующие между
собой асинхронно посредством сообщений (и
только сообщений).
Акторы похожи на людей в комнате, говорящих
друг с другом.
8. Actor trait
type Receive = PartialFunction[Any, Unit]
trait Actor {
def receive: Receive = ???
...
}
9. Пример Actor’а
class Time extends Actor {
def receive = {
case "What is the time?" => sender ! "12:43"
}
}
10. Пример stateful Actor’а
class Counter extends Actor {
var count = 0
def receive = {
case "incr" => count += 1
case ("get", customer: ActorRef) => customer ! count
}
}
13. Stopping Actors
context.stop(actor)
actor ! PoisonPill
или
В обоих случаях посылается сообщение.
В первом случае все сообщения в очереди выбрасываются.
Во втором – сообщение кладется в конец очереди.
14. Закрепим знания
• Все акторы инкапсулированы и независимы (больше
инкапсуляции, чем в традиционном ООП). Нету способа
взаимодействия с акторами кроме отправки сообщений.
• Сообщения должны быть иммутабельными.
• Избегать блокировок в акторах. Нужно использовать
асинхронное API для работы с файлами, БД, …
• Отправка сообщений не является надёжной.
• Порядок отправки и принятия сообщений неопределён
(кроме случая, когда актор посылает другому актору подряд
сообщения).
19. Supervision
class Manager extends Actor {
override val supervisorStrategy = OneForOneStrategy() {
case _: DBException => Restart // reconnect to DB
case _: NullPointerException => Stop
case _: ServiceDownException => Escalate
}
def receive = ???
}
25. Жизненный цикл Actor’а
• start
• (restart)*
• stop
context.actorOf(…)
new Actor
preStart
Restart
26. Жизненный цикл Actor’а
• start
• (restart)*
• stop
context.actorOf(…)
new Actor
preStart
Restart
preRestart
27. Жизненный цикл Actor’а
• start
• (restart)*
• stop
context.actorOf(…)
new Actor
preStart
Restart
preRestart
new Actor
28. Жизненный цикл Actor’а
• start
• (restart)*
• stop
context.actorOf(…)
new Actor
preStart
Restart
preRestart
new Actor
postRestart
29. Жизненный цикл Actor’а
• start
• (restart)*
• stop
context.actorOf(…)
new Actor
preStart
Restart
preRestart
new Actor
postRestart
stop
30. Жизненный цикл Actor’а
• start
• (restart)*
• stop
context.actorOf(…)
new Actor
preStart
Restart
preRestart
new Actor
postRestart
stop
Stop
postStop
31. Жизненный цикл Actor’а
• start
• (restart)*
• stop
context.actorOf(…)
new Actor
preStart
Restart
preRestart
new Actor
postRestart
stop
Stop
postStop
Может произойти *0, ∞) раз
32. Закрепим знания
• Акторы организуются в иерархии.
• Акторы обязаны обрабатывать ошибки своих дочерних
акторов. Тем самым достигается отказоустойчивость системы.
• Рестарты акторов не наблюдаемы из внешнего мира.
• При рестарте актора рестартуется всё его поддерево.
• Рестарты в листьях дерева иерархии происходят чаще.
• Рискованные задачи желательно делегировать дочерним
акторам, если родительский актор имеет важное состояние.
33. Поиск акторов
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")
}
}
}
47. Random
• Может вызвать разбалансировку.
• Применимо, когда bottleneck в самом маршрутизаторе.
• Применимо, когда есть несколько маршрутизаторов.
• Воркеры должны быть равнозначными.
• Сообщения должны быть равнозначными.
50. Smallest mailbox
• Равномерная балансировка.
• Сообщения должны быть равнозначными.
• Неприменимо для удалённых воркеров.
• Относительно высокая цена маршрутизации – нужно каждый
раз считать размер очереди.
54. Broadcast
• Можно назначать различные задачи.
• Повышается надежность (некоторые воркеры могут упасть
при выполнении задач).
• Требуется в n раз больше ресурсов, где n – количество
воркеров.
63. Consistent Hash
• Задачи одного и того же типа отправляются одним и тем же
воркерам.
• Позволяет избежать разделяемого состояния между
воркерами. Например, сообщения, относящиеся к одному и
тому же пользователю, всегда будут обработаны одним и тем
же актором.
• Не гарантирует равномерность нагрузки.
64. Закрепим знания
• Асинхронная передача сообщений обеспечивает
вертикальное масштабирование: обрабатывая сообщение,
актор не блокирует его, а уступает поток для обработки
следующего сообщения.
• Прозрачность местонахождения акторов (location
transparency) обеспечивает горизонтальное
масштабирование.
65. Нетронутые темы
• Кластеризация
• Персистентность
• Мониторинг жизненного цикла акторов
• Конечные автоматы (FSM)
• Spray – фреймворк для разработки HTTP/REST приложений
• Тестирование акторов
• Работа с TCP/UDP
• Агенты
• Интеграция с Apache Camel
• ...