SlideShare a Scribd company logo
1 of 55
Download to read offline
Akka в Яндекс
JPoint 2014
Вадим Цесько
http://incubos.org
@incubos
18 апреля 2014 г.
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 1 / 55
Введение Предыстория
Предыстория
2 года назад
См. доклад «Потоковая обработка данных с помощью
модели акторов (Actor Model)» на ADD-3a
a
http://addconf.ru/talk.sdf/add/add_3/talks/12823
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 2 / 55
Введение Содержание
Содержание
Actor Model на примере Akka
Происхождение
Концепции и API
Примеры кода
Примеры систем в Яндекс
Конвейерная обработка данных
Реактивные иерархические системы
Опыт разработки и эксплуатации
Подводные камни
Проблемы и некоторые решения
Дополнительные тулы
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 3 / 55
Actor Model Происхождение
Происхождение
Carl Hewitt1
, Peter Bishop and Richard Steiger. A
Universal Modular Actor Formalism for Artificial
Intelligence. 1973.
Gul Agha. Actors: A Model of Concurrent
Computation in Distributed Systems. 1986.
Изначально для описания параллельных
вычислений
Позднее в качестве основы для многочисленных
реализаций
1
http://letitcrash.com/post/20964174345/
carl-hewitt-explains-the-essence-of-the-actor
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 4 / 55
Actor Model Actor
Actor
Всё это актор
Функционируют параллельно
Асинхронно обмениваются сообщениями
При обработке сообщения актор может
отправить конечное число сообщений другим акторам
создать конечное число новых акторов
назначить поведение для обработки следующего
сообщения
Порядок доставки сообщений не специфицирован
Акторы имеют «адреса»
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 5 / 55
Actor Model Concurrency vs Parallelism
Concurrency vs Parallelism
Actor Model не про Parallelism, а про Concurrency2
Concurrency
Способность выполняться параллельно.
Parallelism
Действительно параллельное выполнение.
2
Rob Pike. Concurrency is not Parallelism:
https://player.vimeo.com/video/49718712
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 6 / 55
Actor Model Реализации
Реализации
Языки3
с «родной» поддержкой: Erlang, Scala, ...
Библиотеки для языков: Scala, Java, F#, ...
Будем рассматривать
Akka (Scala API).
3
http://en.wikipedia.org/wiki/Actor_model
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 7 / 55
Actor Model Akka
О проекте
Jonas Bon´er:
Java Champion
Terracotta JVM clustering, JRockit JVM,
AspectWerkz AOP, Eclipse AspectJ
Ресурсы:
http://akka.io/docs/
http://letitcrash.com/
Код:
https://github.com/akka/akka
Apache V2 license
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 8 / 55
Actor Model Akka
Производительность
Внимание
Синтетические тесты
Erlang R14B04 vs Akka 2.0-SNAPSHOT4
:
1M mps vs 2.1M mps
Akka 2.05
:
50M mps
48-core, 128 GB, ForkJoinPool
4
http://letitcrash.com/post/14783691760/akka-vs-erlang
5
http://letitcrash.com/post/20397701710/
50-million-messages-per-second-on-a-single-machine
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 9 / 55
Actor Model Akka
Особенности реализации
300 байт на актор
Актор: состояние, поведение, почтовый ящик,
список детей, стратегия супервизора
Множество акторов на множестве нитей
Нет гарантированной доставки, семантика
at-most-once, порядок сохраняется
Сообщения обрабатываются строго по порядку
Иерархия: создаваемые акторы — дети,
родитель — супервизор
Актор скрыт за переносимой ActorRef
Подход «Let it crash»
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 10 / 55
Actor Model Akka
Пути
Примеры
akka://system/user/a/b
akka.tcp://system@server.yandex.ru:2552/user/a/b
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 11 / 55
Actor Model Akka
Конструирование ссылок
Создание акторов: ActorRefProvider.actorOf
Поиск акторов:
ActorRefProvider.actorSelection
Каждый актор знает себя, родителя и детей
Можно делать так:
1 context.actorSelection("../brother") ! msg
2 context.actorSelection("/user/service") ! msg
3 context.actorSelection("../*") ! msg
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 12 / 55
Actor Model Akka
Определение актора
1 class Partitioner(partitionStorage: ActorRef) extends Actor {
2
3 def receive = {
4 case PartitionFeed(partner, offers) =>
5 partition(partner, offers)
6 case msg =>
7 log.error("Unsupported message received: {}", msg)
8 }
9
10 def partition(partner: Partner, offers: Traversable[Offer]) {
11 ...
12
13 partitionStorage ! UpdatePartitions(partner, partitioning)
14 }
15 }
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 13 / 55
Actor Model Akka
Создание актора
1 val system = ActorSystem("sharder")
2
3 val partitionStorage = ...
4
5 val partitioner =
6 system.actorOf(
7 FromConfig.props(
8 Props[Partitioner](new Partitioner(partitionStorage))
9 .withDispatcher("dispatcher.cpu")),
10 "partitioner")
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 14 / 55
Actor Model Akka
Конфигурация диспетчера
Конфигурация в HOCON6
:
1 dispatchers.cpu {
2 type = Dispatcher
3 executor = "fork-join-executor"
4
5 fork-join-executor {
6 parallelism-min = 4
7 parallelism-factor = 1.0
8 }
9 }
6
Human-Optimized Config Object Notation:
https://github.com/typesafehub/config
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 15 / 55
Actor Model Akka
HOCON
Независимая самоценная библиотека:
Чистая Java без зависимостей
Поддерживает Java properties и JSON superset
Merge и include из файлов, URL, classpath
Мощная поддержка вложенности
Поддержка duration (10 seconds) и size (512K)
Конвертация типов
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 16 / 55
Actor Model Akka
Диспетчеры
Dispatcher
PinnedDispatcher
BalancingDispatcher
CallingThreadDispatcher
на
fork-join-executor
thread-pool-executor
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 17 / 55
Actor Model Akka
Почтовые ящики
UnboundedMailbox
BoundedMailbox
UnboundedPriorityMailbox
BoundedPriorityMailbox
1 trait MessageQueue {
2 def enqueue(receiver: ActorRef, handle: Envelope): Unit
3 def dequeue(): Envelope
4 def numberOfMessages: Int
5 def hasMessages: Boolean
6 def cleanUp(owner: ActorRef, deadLetters: MessageQueue): Unit
7 }
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 18 / 55
Actor Model Akka
Пулы акторов
1 akka.actor.deployment {
2 /partitioner {
3 router = smallest-mailbox-pool
4 nr-of-instances = 4
5 }
6 }
1 akka.actor.deployment {
2 /unifier {
3 router = round-robin-pool
4 resizer {
5 lower-bound = 2
6 upper-bound = 16
7 }
8 }
9 }
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 19 / 55
Actor Model Akka
Типы роутеров
Реализации Pool и Group:
RoundRobin
Random
SmallestMailbox
Broadcast
ScatterGatherFirstCompleted
Самописные
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 20 / 55
Actor Model Akka
Конфигурирование из кода
1 val shardActorPaths: immutable.Seq[String] = ...
2
3 val shard = system.actorOf(
4 RoundRobinGroup(shardActorPaths).props(),
5 "shard")
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 21 / 55
Actor Model Akka
Удалённые акторы
1 akka {
2 actor {
3 provider = "akka.remote.RemoteActorRefProvider"
4 }
5
6 remote {
7 enabled-transports = ["akka.remote.netty.tcp"]
8
9 netty.tcp {
10 hostname = "server.yandex.ru"
11 port = 2553
12 }
13 }
14 }
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 22 / 55
Actor Model Akka
Тестирование акторов
Модульное тестирование с TestActorRef
Интеграционное тестирование с Probe
Проверки с сопоставлением по шаблону
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 23 / 55
Actor Model Akka
Пример теста
1 val probe = TestProbe()
2 val burstScaler = TestActorRef(new BurstScaler(probe.ref))
3
4 before {
5 burstScaler.underlyingActor.sent =
6 burstScaler.underlyingActor.sent.empty
7 }
8
9 "A BurstScaler" should {
10 "always forward the first message" in {
11 probe.within(1 second) {
12 burstScaler ! 1
13 probe.expectMsg(1)
14 }
15 }
16 }
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 24 / 55
Actor Model Akka
Супервизор
Решение при сбое:
1 Resume
2 Restart
3 Stop
4 Escalate
Принятое решение (1-3) действует рекурсивно
Функция Exception ⇒ Directive
Terminated, preStart, preRestart, postStop,
postRestart
OneForOneStrategy и AllForOneStrategy
Ограничение количества перезапусков
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 25 / 55
Actor Model Akka
Супервизор по умолчанию
1 final val defaultDecider: Decider = {
2 case _: ActorInitializationException => Stop
3 case _: ActorKilledException => Stop
4 case _: DeathPactException => Stop
5 case _: Exception => Restart
6 }
7
8 final val defaultStrategy: SupervisorStrategy =
9 OneForOneStrategy()(defaultDecider)
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 26 / 55
Системы Классификация
Классификация
Конвейерная индексация
Яндекс.{Авто, Недвижимость, Работа}
etc.
Иерархическая обработка пользовательских
запросов
Spray7
Маршрутизация и обработка кликов и показов
Матчинг объявлений на подписки
etc.
7
http://spray.io
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 27 / 55
Системы Конвейер
Конвейер
Масштабируемость
Устойчивость к сбоям
Ограниченные очереди
Back pressure
Выделенные диспетчеры
Детерминированное
потребление памяти
Графики размеров очередей
Декомпозиция стадий
Масштабирование пулами
Загрузка CPU 100%
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 28 / 55
Системы Конвейер
Яндекс.Авто: Архитектура
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 29 / 55
Системы Конвейер
Яндекс.Авто: Гиперконвейер
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 30 / 55
Системы Конвейер
Яндекс.Авто: Цифры
4 ДЦ, 4 машины для индексации, 60 машин
для поиска (общие для разных сервисов)
Больше 2М объявлений
Время в конвейере — до 5 мин
Принудительная переиндексация — каждые
15 мин
Объём поискового индекса — больше 2 ГБ
Scala — 8 KLOC, Java — 210 KLOC
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 31 / 55
Системы Конвейер
Инструментированные очереди
Metrics8
+ Graphite:
8
http://metrics.codahale.com/
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 32 / 55
Системы Конвейер
Диагностика
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 33 / 55
Системы Конвейер
Интересное
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 34 / 55
Системы Конвейер
Специфика
Для прореживания потока задач:
BurstScaler
InstrumentedUnboundedSkipClonesMailbox
InstrumentedSkippingBoundedMailbox
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 35 / 55
Системы Конвейер
Горизонтальное масштабирование (1)
Планировали масштабировать индексацию так:
Добавляем машины-indexer’ы
Используем RoundRobin- или Random-пул
Не работает
Одна из машин патологически тупит — сильно
тормозит весь конвейер
AdaptiveBalancer
Измеряем время пропихивания данных и штрафуем на
некоторое время втупливающие ноды
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 36 / 55
Системы Конвейер
Горизонтальное масштабирование (2)
Обновление данных на поисковых машинах:
Несколько ДЦ + ненадёжная сеть
Эволюция
BroadcastPool
ZeroMQ (EPGM, TCP)
JGroups (Multicast + Relay)
Akka-based Spanning Tree
Доставляем хотя бы одной ноде в каждом ДЦ
Нода распространяет данные внутри ДЦ
Всё на akka-remote + ZooKeeper
Тюнинг и патчинг akka-remote
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 37 / 55
Системы Иерархическая обработка
Иерархическая обработка
Масштабируемость
Высокая доступность
Естественные подсистемы
Часто динамическая
топология
Actor per request
Request-reply
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 38 / 55
Системы Иерархическая обработка
Иерархические системы
Внутренние сервисы
Иерархия акторов для каждого активного
пользователя/подписки/визита/запроса
Динамическая выгрузка/подгрузка сущностей
Распределение пользователей на бакеты (и ноды)
через ZooKeeper + Curator9
(Consistent Hashing10
)
9
http://curator.apache.org
10
http://en.wikipedia.org/wiki/Consistent_hashing
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 39 / 55
Системы Иерархическая обработка
Компонент сервиса уведомлений
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 40 / 55
Системы Иерархическая обработка
О чём нужно думать
Наблюдаемость
Логгирование
Агрегатные графики
Мониторинги
Поведение при перегрузке
Детектирование перегрузки
Ограничение ресурсов
Превентивный reject
Восстановление после перегрузки
Выравнивание нагрузки
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 41 / 55
Проблемы Deadlocks
Deadlocks
Ограниченные ресурсы:
Очереди
Диспетчеры
Пулы нитей (в т. ч. в akka-remote)
Косвенная синхронизация между акторами
Типы:
Локальные
Распределённые
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 42 / 55
Проблемы OOMs
OOMs
Возможные причины:
Перегрузка + неограниченные очереди
Логические утечки памяти (в т. ч. через
замыкания, см. ActorContext.sender)
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 43 / 55
Проблемы Logging
Logging
ActorLogging
Slf4jLogger (Logback) vs akka.loglevel
Перегрузка EventBus
OOM
Решение
Использовать slf4j-api напрямую
Обёртки для наполнения MDC спецификой Akka
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 44 / 55
Проблемы Dead Letters
Dead Letters
Внимание
В любой непонятной ситуации сообщение пойдёт в
DeadLetter
Рекомендация
Подписываться на DeadLetter, логгировать,
вылавливать и мониторить «интересные» сообщения
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 45 / 55
Проблемы Blocking
Blocking
Актор на время обработки сообщения берёт нитку
из диспетчера
Thread starvation при блокировании в акторе
Особенно «интересные» результаты на
default-dispatcher
Рекомендация
Запускайте блокирующихся акторов на собственном
выделенном диспетчере
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 46 / 55
Проблемы Akka и JMM
Akka и JMM
Happens before
Message send happens before receive
Actor receive happens before previous receive
Следствия:
Не нужно защищать состояние актора
Возможны гонки на изменяемых сообщениях
Используйте неизменяемые структуры данных11
11
Chris Okasaki. Purely Functional Data Structures. 1999.
http://www.cs.cmu.edu/~rwh/theses/okasaki.pdf
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 47 / 55
Проблемы Наблюдаемось
Наблюдаемось
Статическая топология
Никаких проблем
Динамическая топология
Пока только с привлечением мозга
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 48 / 55
Проблемы Akka
Akka
Бинарная несовместимость на пустом месте
API иногда колбасит (диспетчеры и очереди)
До многих вещей не дотянуться — приходится
копипастить и патчить
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 49 / 55
Проблемы Scala
Scala
spray-routing (shapeless) крепкий орешек для
IDEA
Closures (call-by-name, laziness) — утечки памяти,
гонки и гейзенбаги
Незащищённое состояние актора
В т. ч. sender()
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 50 / 55
Заключение Рассмотрели
Рассмотрели
Actor Model в реализации Akka
Конвейерные и иерархические системы на Akka
Некоторые проблемы и решения
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 51 / 55
Заключение В итоге
В итоге
Прошли путь от Akka 1.x до 2.3.x
1.5 года в production
Множество граблей, но жить можно
Исключительно простой и выразительный
формализм
Удобно проектировать, разрабатывать и
тестировать
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 52 / 55
Заключение Ссылки
Ссылки
«Потоковая обработка данных с помощью модели
акторов (Actor Model)» на ADD-312
Typesafe Activator13
Principles of Reactive Programming14
Книги:
Jamie Allen. Effective Akka. 2013
Derek Wyatt. Akka Concurrency. 2013
Series: The Neophyte’s Guide to Scala15
EAI Patterns Series16
12
http://addconf.ru/talk.sdf/add/add_3/talks/12823
13
http://typesafe.com/activator
14
https://class.coursera.org/reactive-001/class
15
http://letitcrash.com/post/64667109914/
series-the-neophytes-guide-to-scala
16
http://letitcrash.com/post/59190266995/
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 53 / 55
Вопросы?
Вопросы?
http://incubos.org/contacts/
@incubos
vadim.tsesko@gmail.com
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 54 / 55
Alan Kay on OOP, 1967
Alan Kay on OOP, 1967
I thought of objects being like biological cells and/or
individual computers on a network, only able to
communicate with messages (so messaging came at the
very beginning – it took a while to see how to do
messaging in a programming language efficiently enough
to be useful).
OOP to me means only messaging, local retention and
protection and hiding of state-process, and extreme
late-binding of all things. It can be done in Smalltalk and
in LISP. There are possibly other systems in which this is
possible, but I’m not aware of them.
Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 55 / 55

More Related Content

What's hot

Zabbix 3.4 - простая непростая дружба с сообществом / Алексей Владышев (Zabbix)
Zabbix 3.4 - простая непростая дружба с сообществом / Алексей Владышев (Zabbix)Zabbix 3.4 - простая непростая дружба с сообществом / Алексей Владышев (Zabbix)
Zabbix 3.4 - простая непростая дружба с сообществом / Алексей Владышев (Zabbix)
Ontico
 
Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)
Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)
Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)
Ontico
 
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
Ontico
 
Нагрузочное тестирование с помощью Яндекс.Танк - Алексей Лавренюк, PyCon RU 2...
Нагрузочное тестирование с помощью Яндекс.Танк - Алексей Лавренюк, PyCon RU 2...Нагрузочное тестирование с помощью Яндекс.Танк - Алексей Лавренюк, PyCon RU 2...
Нагрузочное тестирование с помощью Яндекс.Танк - Алексей Лавренюк, PyCon RU 2...
it-people
 
Нагрузочное тестирование с помощью Яндекс.Танка
Нагрузочное тестирование с помощью Яндекс.ТанкаНагрузочное тестирование с помощью Яндекс.Танка
Нагрузочное тестирование с помощью Яндекс.Танка
Aleksandr Boichenko
 
Java tricks for high-load server programming
Java tricks for high-load server programmingJava tricks for high-load server programming
Java tricks for high-load server programming
Andrei Pangin
 

What's hot (20)

Akka: как я перестал бояться и полюбил асинхронный код
Akka: как я перестал бояться и полюбил асинхронный кодAkka: как я перестал бояться и полюбил асинхронный код
Akka: как я перестал бояться и полюбил асинхронный код
 
Встречайте Zend Framework 2.0
Встречайте Zend Framework 2.0Встречайте Zend Framework 2.0
Встречайте Zend Framework 2.0
 
Java Ahead-Of-Time compilation
Java Ahead-Of-Time compilationJava Ahead-Of-Time compilation
Java Ahead-Of-Time compilation
 
Zabbix 3.4 - простая непростая дружба с сообществом / Алексей Владышев (Zabbix)
Zabbix 3.4 - простая непростая дружба с сообществом / Алексей Владышев (Zabbix)Zabbix 3.4 - простая непростая дружба с сообществом / Алексей Владышев (Zabbix)
Zabbix 3.4 - простая непростая дружба с сообществом / Алексей Владышев (Zabbix)
 
Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)
Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)
Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)
 
12 - Java. Разработка сетевых приложений на Java
12 - Java. Разработка сетевых приложений на Java12 - Java. Разработка сетевых приложений на Java
12 - Java. Разработка сетевых приложений на Java
 
Артём Ерошенко «Рецепт приготовления облачных тестингов»
Артём Ерошенко «Рецепт приготовления облачных тестингов»Артём Ерошенко «Рецепт приготовления облачных тестингов»
Артём Ерошенко «Рецепт приготовления облачных тестингов»
 
In the sun.misc.Unsafe bowels
In the sun.misc.Unsafe bowelsIn the sun.misc.Unsafe bowels
In the sun.misc.Unsafe bowels
 
Spring puzzlers 2
Spring puzzlers 2Spring puzzlers 2
Spring puzzlers 2
 
10 - Java. Многопоточность в Java: основы
10 - Java. Многопоточность в Java: основы10 - Java. Многопоточность в Java: основы
10 - Java. Многопоточность в Java: основы
 
Продвинутое использование Celery — Александр Кошелев
Продвинутое использование Celery — Александр КошелевПродвинутое использование Celery — Александр Кошелев
Продвинутое использование Celery — Александр Кошелев
 
Uawebchallenge.yandex.tank
Uawebchallenge.yandex.tankUawebchallenge.yandex.tank
Uawebchallenge.yandex.tank
 
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
 
Нагрузочное тестирование с помощью Яндекс.Танк - Алексей Лавренюк, PyCon RU 2...
Нагрузочное тестирование с помощью Яндекс.Танк - Алексей Лавренюк, PyCon RU 2...Нагрузочное тестирование с помощью Яндекс.Танк - Алексей Лавренюк, PyCon RU 2...
Нагрузочное тестирование с помощью Яндекс.Танк - Алексей Лавренюк, PyCon RU 2...
 
Распределенные системы в Одноклассниках
Распределенные системы в ОдноклассникахРаспределенные системы в Одноклассниках
Распределенные системы в Одноклассниках
 
Нагрузочное тестирование с помощью Яндекс.Танка
Нагрузочное тестирование с помощью Яндекс.ТанкаНагрузочное тестирование с помощью Яндекс.Танка
Нагрузочное тестирование с помощью Яндекс.Танка
 
Хайлоад и безопасность в мире DevOps: совместимы ли? / Юрий Колесов (security...
Хайлоад и безопасность в мире DevOps: совместимы ли? / Юрий Колесов (security...Хайлоад и безопасность в мире DevOps: совместимы ли? / Юрий Колесов (security...
Хайлоад и безопасность в мире DevOps: совместимы ли? / Юрий Колесов (security...
 
Эволюция ZF: архитектура, шаблоны, рефакторинг
Эволюция ZF: архитектура, шаблоны, рефакторингЭволюция ZF: архитектура, шаблоны, рефакторинг
Эволюция ZF: архитектура, шаблоны, рефакторинг
 
Spring data jee conf
Spring data jee confSpring data jee conf
Spring data jee conf
 
Java tricks for high-load server programming
Java tricks for high-load server programmingJava tricks for high-load server programming
Java tricks for high-load server programming
 

Viewers also liked

Базы данных. Lucene
Базы данных. LuceneБазы данных. Lucene
Базы данных. Lucene
Vadim Tsesko
 
Multidimensional indexing
Multidimensional indexingMultidimensional indexing
Multidimensional indexing
Vadim Tsesko
 
Software Transactional Memory
Software Transactional MemorySoftware Transactional Memory
Software Transactional Memory
Vadim Tsesko
 
Базы данных. ZooKeeper
Базы данных. ZooKeeperБазы данных. ZooKeeper
Базы данных. ZooKeeper
Vadim Tsesko
 
Базы данных. HBase
Базы данных. HBaseБазы данных. HBase
Базы данных. HBase
Vadim Tsesko
 
Базы данных. CAP
Базы данных. CAPБазы данных. CAP
Базы данных. CAP
Vadim Tsesko
 

Viewers also liked (16)

YoctoDB в Яндекс.Вертикалях
YoctoDB в Яндекс.ВертикаляхYoctoDB в Яндекс.Вертикалях
YoctoDB в Яндекс.Вертикалях
 
Базы данных. MongoDB
Базы данных. MongoDBБазы данных. MongoDB
Базы данных. MongoDB
 
Базы данных. HDFS
Базы данных. HDFSБазы данных. HDFS
Базы данных. HDFS
 
Базы данных. Lucene
Базы данных. LuceneБазы данных. Lucene
Базы данных. Lucene
 
Multidimensional indexing
Multidimensional indexingMultidimensional indexing
Multidimensional indexing
 
Actor model
Actor modelActor model
Actor model
 
Базы данных. Distributed Commit
Базы данных. Distributed CommitБазы данных. Distributed Commit
Базы данных. Distributed Commit
 
Базы данных. Cassandra
Базы данных. CassandraБазы данных. Cassandra
Базы данных. Cassandra
 
Software Transactional Memory
Software Transactional MemorySoftware Transactional Memory
Software Transactional Memory
 
Базы данных. Haystack
Базы данных. HaystackБазы данных. Haystack
Базы данных. Haystack
 
Базы данных. ZooKeeper
Базы данных. ZooKeeperБазы данных. ZooKeeper
Базы данных. ZooKeeper
 
Базы данных. HBase
Базы данных. HBaseБазы данных. HBase
Базы данных. HBase
 
Базы данных. Hash & Cache
Базы данных. Hash & CacheБазы данных. Hash & Cache
Базы данных. Hash & Cache
 
Базы данных. CAP
Базы данных. CAPБазы данных. CAP
Базы данных. CAP
 
Базы данных. Введение
Базы данных. ВведениеБазы данных. Введение
Базы данных. Введение
 
Потоковая фильтрация событий
Потоковая фильтрация событийПотоковая фильтрация событий
Потоковая фильтрация событий
 

Similar to Фреймворк Akka и его использование в Яндексе

Конструктор / Денис Паясь (Яндекс)
Конструктор / Денис Паясь (Яндекс)Конструктор / Денис Паясь (Яндекс)
Конструктор / Денис Паясь (Яндекс)
Ontico
 

Similar to Фреймворк Akka и его использование в Яндексе (20)

Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 
Scala EE: Myth or Reality?
Scala EE: Myth or Reality?Scala EE: Myth or Reality?
Scala EE: Myth or Reality?
 
Regular expressions
Regular expressionsRegular expressions
Regular expressions
 
Java(script) on JVM
Java(script) on JVMJava(script) on JVM
Java(script) on JVM
 
Java(Script) on JVM
Java(Script) on JVMJava(Script) on JVM
Java(Script) on JVM
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPI
 
Работа с Akka Cluster - Александр Алексеев
Работа с Akka Cluster - Александр АлексеевРабота с Akka Cluster - Александр Алексеев
Работа с Akka Cluster - Александр Алексеев
 
Обзор ES2015(ES6)
Обзор ES2015(ES6)Обзор ES2015(ES6)
Обзор ES2015(ES6)
 
Software engineering seminars: gradle
 Software engineering seminars: gradle Software engineering seminars: gradle
Software engineering seminars: gradle
 
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2
 
Где кончается react native? / Павел Кондратенко (Rambler&Co)
Где кончается react native? / Павел Кондратенко (Rambler&Co)Где кончается react native? / Павел Кондратенко (Rambler&Co)
Где кончается react native? / Павел Кондратенко (Rambler&Co)
 
Документирование исходных текстов (javadoc)
Документирование исходных текстов (javadoc)Документирование исходных текстов (javadoc)
Документирование исходных текстов (javadoc)
 
Производительность параметрического поиска на основе опенсорс-платформы
Производительность параметрического поиска на основе опенсорс-платформыПроизводительность параметрического поиска на основе опенсорс-платформы
Производительность параметрического поиска на основе опенсорс-платформы
 
Scala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application DevelopmentScala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application Development
 
Scala On Rest
Scala On RestScala On Rest
Scala On Rest
 
Конструктор / Денис Паясь (Яндекс)
Конструктор / Денис Паясь (Яндекс)Конструктор / Денис Паясь (Яндекс)
Конструктор / Денис Паясь (Яндекс)
 
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
"CommonJS для браузера", Антон Шувалов, MoscowJS 15"CommonJS для браузера", Антон Шувалов, MoscowJS 15
"CommonJS для браузера", Антон Шувалов, MoscowJS 15
 
Модули в Java
Модули в JavaМодули в Java
Модули в Java
 
Марат Абдуллин "Хроники серверного Жаваскрипта"
Марат Абдуллин "Хроники серверного Жаваскрипта"Марат Абдуллин "Хроники серверного Жаваскрипта"
Марат Абдуллин "Хроники серверного Жаваскрипта"
 

Фреймворк Akka и его использование в Яндексе

  • 1. Akka в Яндекс JPoint 2014 Вадим Цесько http://incubos.org @incubos 18 апреля 2014 г. Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 1 / 55
  • 2. Введение Предыстория Предыстория 2 года назад См. доклад «Потоковая обработка данных с помощью модели акторов (Actor Model)» на ADD-3a a http://addconf.ru/talk.sdf/add/add_3/talks/12823 Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 2 / 55
  • 3. Введение Содержание Содержание Actor Model на примере Akka Происхождение Концепции и API Примеры кода Примеры систем в Яндекс Конвейерная обработка данных Реактивные иерархические системы Опыт разработки и эксплуатации Подводные камни Проблемы и некоторые решения Дополнительные тулы Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 3 / 55
  • 4. Actor Model Происхождение Происхождение Carl Hewitt1 , Peter Bishop and Richard Steiger. A Universal Modular Actor Formalism for Artificial Intelligence. 1973. Gul Agha. Actors: A Model of Concurrent Computation in Distributed Systems. 1986. Изначально для описания параллельных вычислений Позднее в качестве основы для многочисленных реализаций 1 http://letitcrash.com/post/20964174345/ carl-hewitt-explains-the-essence-of-the-actor Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 4 / 55
  • 5. Actor Model Actor Actor Всё это актор Функционируют параллельно Асинхронно обмениваются сообщениями При обработке сообщения актор может отправить конечное число сообщений другим акторам создать конечное число новых акторов назначить поведение для обработки следующего сообщения Порядок доставки сообщений не специфицирован Акторы имеют «адреса» Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 5 / 55
  • 6. Actor Model Concurrency vs Parallelism Concurrency vs Parallelism Actor Model не про Parallelism, а про Concurrency2 Concurrency Способность выполняться параллельно. Parallelism Действительно параллельное выполнение. 2 Rob Pike. Concurrency is not Parallelism: https://player.vimeo.com/video/49718712 Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 6 / 55
  • 7. Actor Model Реализации Реализации Языки3 с «родной» поддержкой: Erlang, Scala, ... Библиотеки для языков: Scala, Java, F#, ... Будем рассматривать Akka (Scala API). 3 http://en.wikipedia.org/wiki/Actor_model Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 7 / 55
  • 8. Actor Model Akka О проекте Jonas Bon´er: Java Champion Terracotta JVM clustering, JRockit JVM, AspectWerkz AOP, Eclipse AspectJ Ресурсы: http://akka.io/docs/ http://letitcrash.com/ Код: https://github.com/akka/akka Apache V2 license Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 8 / 55
  • 9. Actor Model Akka Производительность Внимание Синтетические тесты Erlang R14B04 vs Akka 2.0-SNAPSHOT4 : 1M mps vs 2.1M mps Akka 2.05 : 50M mps 48-core, 128 GB, ForkJoinPool 4 http://letitcrash.com/post/14783691760/akka-vs-erlang 5 http://letitcrash.com/post/20397701710/ 50-million-messages-per-second-on-a-single-machine Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 9 / 55
  • 10. Actor Model Akka Особенности реализации 300 байт на актор Актор: состояние, поведение, почтовый ящик, список детей, стратегия супервизора Множество акторов на множестве нитей Нет гарантированной доставки, семантика at-most-once, порядок сохраняется Сообщения обрабатываются строго по порядку Иерархия: создаваемые акторы — дети, родитель — супервизор Актор скрыт за переносимой ActorRef Подход «Let it crash» Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 10 / 55
  • 11. Actor Model Akka Пути Примеры akka://system/user/a/b akka.tcp://system@server.yandex.ru:2552/user/a/b Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 11 / 55
  • 12. Actor Model Akka Конструирование ссылок Создание акторов: ActorRefProvider.actorOf Поиск акторов: ActorRefProvider.actorSelection Каждый актор знает себя, родителя и детей Можно делать так: 1 context.actorSelection("../brother") ! msg 2 context.actorSelection("/user/service") ! msg 3 context.actorSelection("../*") ! msg Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 12 / 55
  • 13. Actor Model Akka Определение актора 1 class Partitioner(partitionStorage: ActorRef) extends Actor { 2 3 def receive = { 4 case PartitionFeed(partner, offers) => 5 partition(partner, offers) 6 case msg => 7 log.error("Unsupported message received: {}", msg) 8 } 9 10 def partition(partner: Partner, offers: Traversable[Offer]) { 11 ... 12 13 partitionStorage ! UpdatePartitions(partner, partitioning) 14 } 15 } Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 13 / 55
  • 14. Actor Model Akka Создание актора 1 val system = ActorSystem("sharder") 2 3 val partitionStorage = ... 4 5 val partitioner = 6 system.actorOf( 7 FromConfig.props( 8 Props[Partitioner](new Partitioner(partitionStorage)) 9 .withDispatcher("dispatcher.cpu")), 10 "partitioner") Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 14 / 55
  • 15. Actor Model Akka Конфигурация диспетчера Конфигурация в HOCON6 : 1 dispatchers.cpu { 2 type = Dispatcher 3 executor = "fork-join-executor" 4 5 fork-join-executor { 6 parallelism-min = 4 7 parallelism-factor = 1.0 8 } 9 } 6 Human-Optimized Config Object Notation: https://github.com/typesafehub/config Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 15 / 55
  • 16. Actor Model Akka HOCON Независимая самоценная библиотека: Чистая Java без зависимостей Поддерживает Java properties и JSON superset Merge и include из файлов, URL, classpath Мощная поддержка вложенности Поддержка duration (10 seconds) и size (512K) Конвертация типов Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 16 / 55
  • 18. Actor Model Akka Почтовые ящики UnboundedMailbox BoundedMailbox UnboundedPriorityMailbox BoundedPriorityMailbox 1 trait MessageQueue { 2 def enqueue(receiver: ActorRef, handle: Envelope): Unit 3 def dequeue(): Envelope 4 def numberOfMessages: Int 5 def hasMessages: Boolean 6 def cleanUp(owner: ActorRef, deadLetters: MessageQueue): Unit 7 } Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 18 / 55
  • 19. Actor Model Akka Пулы акторов 1 akka.actor.deployment { 2 /partitioner { 3 router = smallest-mailbox-pool 4 nr-of-instances = 4 5 } 6 } 1 akka.actor.deployment { 2 /unifier { 3 router = round-robin-pool 4 resizer { 5 lower-bound = 2 6 upper-bound = 16 7 } 8 } 9 } Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 19 / 55
  • 20. Actor Model Akka Типы роутеров Реализации Pool и Group: RoundRobin Random SmallestMailbox Broadcast ScatterGatherFirstCompleted Самописные Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 20 / 55
  • 21. Actor Model Akka Конфигурирование из кода 1 val shardActorPaths: immutable.Seq[String] = ... 2 3 val shard = system.actorOf( 4 RoundRobinGroup(shardActorPaths).props(), 5 "shard") Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 21 / 55
  • 22. Actor Model Akka Удалённые акторы 1 akka { 2 actor { 3 provider = "akka.remote.RemoteActorRefProvider" 4 } 5 6 remote { 7 enabled-transports = ["akka.remote.netty.tcp"] 8 9 netty.tcp { 10 hostname = "server.yandex.ru" 11 port = 2553 12 } 13 } 14 } Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 22 / 55
  • 23. Actor Model Akka Тестирование акторов Модульное тестирование с TestActorRef Интеграционное тестирование с Probe Проверки с сопоставлением по шаблону Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 23 / 55
  • 24. Actor Model Akka Пример теста 1 val probe = TestProbe() 2 val burstScaler = TestActorRef(new BurstScaler(probe.ref)) 3 4 before { 5 burstScaler.underlyingActor.sent = 6 burstScaler.underlyingActor.sent.empty 7 } 8 9 "A BurstScaler" should { 10 "always forward the first message" in { 11 probe.within(1 second) { 12 burstScaler ! 1 13 probe.expectMsg(1) 14 } 15 } 16 } Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 24 / 55
  • 25. Actor Model Akka Супервизор Решение при сбое: 1 Resume 2 Restart 3 Stop 4 Escalate Принятое решение (1-3) действует рекурсивно Функция Exception ⇒ Directive Terminated, preStart, preRestart, postStop, postRestart OneForOneStrategy и AllForOneStrategy Ограничение количества перезапусков Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 25 / 55
  • 26. Actor Model Akka Супервизор по умолчанию 1 final val defaultDecider: Decider = { 2 case _: ActorInitializationException => Stop 3 case _: ActorKilledException => Stop 4 case _: DeathPactException => Stop 5 case _: Exception => Restart 6 } 7 8 final val defaultStrategy: SupervisorStrategy = 9 OneForOneStrategy()(defaultDecider) Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 26 / 55
  • 27. Системы Классификация Классификация Конвейерная индексация Яндекс.{Авто, Недвижимость, Работа} etc. Иерархическая обработка пользовательских запросов Spray7 Маршрутизация и обработка кликов и показов Матчинг объявлений на подписки etc. 7 http://spray.io Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 27 / 55
  • 28. Системы Конвейер Конвейер Масштабируемость Устойчивость к сбоям Ограниченные очереди Back pressure Выделенные диспетчеры Детерминированное потребление памяти Графики размеров очередей Декомпозиция стадий Масштабирование пулами Загрузка CPU 100% Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 28 / 55
  • 29. Системы Конвейер Яндекс.Авто: Архитектура Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 29 / 55
  • 30. Системы Конвейер Яндекс.Авто: Гиперконвейер Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 30 / 55
  • 31. Системы Конвейер Яндекс.Авто: Цифры 4 ДЦ, 4 машины для индексации, 60 машин для поиска (общие для разных сервисов) Больше 2М объявлений Время в конвейере — до 5 мин Принудительная переиндексация — каждые 15 мин Объём поискового индекса — больше 2 ГБ Scala — 8 KLOC, Java — 210 KLOC Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 31 / 55
  • 32. Системы Конвейер Инструментированные очереди Metrics8 + Graphite: 8 http://metrics.codahale.com/ Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 32 / 55
  • 33. Системы Конвейер Диагностика Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 33 / 55
  • 34. Системы Конвейер Интересное Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 34 / 55
  • 35. Системы Конвейер Специфика Для прореживания потока задач: BurstScaler InstrumentedUnboundedSkipClonesMailbox InstrumentedSkippingBoundedMailbox Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 35 / 55
  • 36. Системы Конвейер Горизонтальное масштабирование (1) Планировали масштабировать индексацию так: Добавляем машины-indexer’ы Используем RoundRobin- или Random-пул Не работает Одна из машин патологически тупит — сильно тормозит весь конвейер AdaptiveBalancer Измеряем время пропихивания данных и штрафуем на некоторое время втупливающие ноды Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 36 / 55
  • 37. Системы Конвейер Горизонтальное масштабирование (2) Обновление данных на поисковых машинах: Несколько ДЦ + ненадёжная сеть Эволюция BroadcastPool ZeroMQ (EPGM, TCP) JGroups (Multicast + Relay) Akka-based Spanning Tree Доставляем хотя бы одной ноде в каждом ДЦ Нода распространяет данные внутри ДЦ Всё на akka-remote + ZooKeeper Тюнинг и патчинг akka-remote Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 37 / 55
  • 38. Системы Иерархическая обработка Иерархическая обработка Масштабируемость Высокая доступность Естественные подсистемы Часто динамическая топология Actor per request Request-reply Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 38 / 55
  • 39. Системы Иерархическая обработка Иерархические системы Внутренние сервисы Иерархия акторов для каждого активного пользователя/подписки/визита/запроса Динамическая выгрузка/подгрузка сущностей Распределение пользователей на бакеты (и ноды) через ZooKeeper + Curator9 (Consistent Hashing10 ) 9 http://curator.apache.org 10 http://en.wikipedia.org/wiki/Consistent_hashing Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 39 / 55
  • 40. Системы Иерархическая обработка Компонент сервиса уведомлений Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 40 / 55
  • 41. Системы Иерархическая обработка О чём нужно думать Наблюдаемость Логгирование Агрегатные графики Мониторинги Поведение при перегрузке Детектирование перегрузки Ограничение ресурсов Превентивный reject Восстановление после перегрузки Выравнивание нагрузки Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 41 / 55
  • 42. Проблемы Deadlocks Deadlocks Ограниченные ресурсы: Очереди Диспетчеры Пулы нитей (в т. ч. в akka-remote) Косвенная синхронизация между акторами Типы: Локальные Распределённые Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 42 / 55
  • 43. Проблемы OOMs OOMs Возможные причины: Перегрузка + неограниченные очереди Логические утечки памяти (в т. ч. через замыкания, см. ActorContext.sender) Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 43 / 55
  • 44. Проблемы Logging Logging ActorLogging Slf4jLogger (Logback) vs akka.loglevel Перегрузка EventBus OOM Решение Использовать slf4j-api напрямую Обёртки для наполнения MDC спецификой Akka Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 44 / 55
  • 45. Проблемы Dead Letters Dead Letters Внимание В любой непонятной ситуации сообщение пойдёт в DeadLetter Рекомендация Подписываться на DeadLetter, логгировать, вылавливать и мониторить «интересные» сообщения Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 45 / 55
  • 46. Проблемы Blocking Blocking Актор на время обработки сообщения берёт нитку из диспетчера Thread starvation при блокировании в акторе Особенно «интересные» результаты на default-dispatcher Рекомендация Запускайте блокирующихся акторов на собственном выделенном диспетчере Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 46 / 55
  • 47. Проблемы Akka и JMM Akka и JMM Happens before Message send happens before receive Actor receive happens before previous receive Следствия: Не нужно защищать состояние актора Возможны гонки на изменяемых сообщениях Используйте неизменяемые структуры данных11 11 Chris Okasaki. Purely Functional Data Structures. 1999. http://www.cs.cmu.edu/~rwh/theses/okasaki.pdf Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 47 / 55
  • 48. Проблемы Наблюдаемось Наблюдаемось Статическая топология Никаких проблем Динамическая топология Пока только с привлечением мозга Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 48 / 55
  • 49. Проблемы Akka Akka Бинарная несовместимость на пустом месте API иногда колбасит (диспетчеры и очереди) До многих вещей не дотянуться — приходится копипастить и патчить Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 49 / 55
  • 50. Проблемы Scala Scala spray-routing (shapeless) крепкий орешек для IDEA Closures (call-by-name, laziness) — утечки памяти, гонки и гейзенбаги Незащищённое состояние актора В т. ч. sender() Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 50 / 55
  • 51. Заключение Рассмотрели Рассмотрели Actor Model в реализации Akka Конвейерные и иерархические системы на Akka Некоторые проблемы и решения Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 51 / 55
  • 52. Заключение В итоге В итоге Прошли путь от Akka 1.x до 2.3.x 1.5 года в production Множество граблей, но жить можно Исключительно простой и выразительный формализм Удобно проектировать, разрабатывать и тестировать Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 52 / 55
  • 53. Заключение Ссылки Ссылки «Потоковая обработка данных с помощью модели акторов (Actor Model)» на ADD-312 Typesafe Activator13 Principles of Reactive Programming14 Книги: Jamie Allen. Effective Akka. 2013 Derek Wyatt. Akka Concurrency. 2013 Series: The Neophyte’s Guide to Scala15 EAI Patterns Series16 12 http://addconf.ru/talk.sdf/add/add_3/talks/12823 13 http://typesafe.com/activator 14 https://class.coursera.org/reactive-001/class 15 http://letitcrash.com/post/64667109914/ series-the-neophytes-guide-to-scala 16 http://letitcrash.com/post/59190266995/ Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 53 / 55
  • 55. Alan Kay on OOP, 1967 Alan Kay on OOP, 1967 I thought of objects being like biological cells and/or individual computers on a network, only able to communicate with messages (so messaging came at the very beginning – it took a while to see how to do messaging in a programming language efficiently enough to be useful). OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things. It can be done in Smalltalk and in LISP. There are possibly other systems in which this is possible, but I’m not aware of them. Вадим Цесько (Яндекс) Akka в Яндекс 18 апреля 2014 г. 55 / 55