Модель параллельных вычислений на основе акторов была предложена в 1973 г. Модель предоставляет собой элегантный и выразительный формализм для описания и разработки асинхронных параллельных распределённых систем. Одной из наиболее популярных и зарекомендовавших себя реализаций модели является среда выполнения Erlang, успешно использующаяся во многих промышленных системах.
Мы рассмотрим модель акторов и опыт промышленного использования её реализации на языке Scala в фреймворке Akka, позаимствовавшем успешные решения из мира Erlang, на примере систем потоковой обработки данных, разрабатываемых в Яндекс.
Несмотря на многие достоинства, которыми обладает модель акторов, разработчикам приходится самостоятельно решать задачи, возникающие на практике и связанные с ограничениями и допущениями модели акторов, её конкретной реализации и распределенных систем в целом.
Потоковая обработка данных с помощью модели акторов (Actor Model)
1. Потоковая обработка данных с
помощью Actor Model
Вадим Цесько
incubos@yandex.ru
twitter.com/incubos
12 мая 2012 г.
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 1 / 42
2. Введение Система
Класс систем
Мы разрабатываем
Яндекс.Авто
Яндекс.Недвижимость
Яндекс.Работа
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 2 / 42
3. Введение Система
Класс систем
Мы разрабатываем
Яндекс.Авто
Яндекс.Недвижимость
Яндекс.Работа
ETL-процесс:
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 2 / 42
4. Введение Система
Класс систем
Мы разрабатываем
Яндекс.Авто
Яндекс.Недвижимость
Яндекс.Работа
ETL-процесс:
1 Extract — загрузка внешних данных
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 2 / 42
5. Введение Система
Класс систем
Мы разрабатываем
Яндекс.Авто
Яндекс.Недвижимость
Яндекс.Работа
ETL-процесс:
1 Extract — загрузка внешних данных
2 Transform — унификация, кластеризация, ...
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 2 / 42
6. Введение Система
Класс систем
Мы разрабатываем
Яндекс.Авто
Яндекс.Недвижимость
Яндекс.Работа
ETL-процесс:
1 Extract — загрузка внешних данных
2 Transform — унификация, кластеризация, ...
3 Load — построение и раскладка индекса
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 2 / 42
7. Введение Система
Статистика
Данные:
До 104 источников
До 107 сущностей
20% обновляется ежедневно
2x рост за год
1
http://stat.yandex.ru
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 3 / 42
8. Введение Система
Статистика
Данные:
До 104 источников
До 107 сущностей
20% обновляется ежедневно
2x рост за год
Пользователи1 :
Яндекс.Авто — 4.5 млн. чел.
Яндекс.Недвижимость — 2 млн. чел.
Яндекс.Работа — 3.3 млн. чел.
1
http://stat.yandex.ru
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 3 / 42
9. Введение Система
Было
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 4 / 42
10. Введение Система
За кадром
Кластер поисковых машин
Раскладка
Балансировка
Дополнительные процессы и данные
Статистика
Картинки
Цены
Качество
Админки/партнёрки
История
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 5 / 42
11. Введение Система
Мотивация
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 6 / 42
12. Введение Система
Мотивация
Масштабируемость с ростом объёма данных
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 6 / 42
13. Введение Система
Мотивация
Масштабируемость с ростом объёма данных
Инкрементальная индексация
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 6 / 42
14. Введение Система
Мотивация
Масштабируемость с ростом объёма данных
Инкрементальная индексация
(мягкий) real-time
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 6 / 42
15. Введение Система
Стало
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 7 / 42
16. Введение Распределённые системы
Свойства must have
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 8 / 42
17. Введение Распределённые системы
Свойства must have
Масштабируемость
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 8 / 42
18. Введение Распределённые системы
Свойства must have
Масштабируемость
Гибкость
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 8 / 42
19. Введение Распределённые системы
Свойства must have
Масштабируемость
Гибкость
Устойчивость к сбоям
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 8 / 42
20. Введение Распределённые системы
Свойства must have
Масштабируемость
Гибкость
Устойчивость к сбоям
Тестируемость
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 8 / 42
21. Введение Распределённые системы
Свойства must have
Масштабируемость
Гибкость
Устойчивость к сбоям
Тестируемость
Наблюдаемость
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 8 / 42
22. Введение Actor Model
Происхождение
Carl Hewitt, Peter Bishop and Richard Steiger. A
Universal Modular Actor Formalism for Artificial
Intelligence. 1973.
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 9 / 42
23. Введение Actor Model
Происхождение
Carl Hewitt, Peter Bishop and Richard Steiger. A
Universal Modular Actor Formalism for Artificial
Intelligence. 1973.
Изначально для описания параллельных
вычислений
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 9 / 42
24. Введение Actor Model
Происхождение
Carl Hewitt, Peter Bishop and Richard Steiger. A
Universal Modular Actor Formalism for Artificial
Intelligence. 1973.
Изначально для описания параллельных
вычислений
Позднее основа для реализаций
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 9 / 42
25. Введение Actor Model
Происхождение
Carl Hewitt, Peter Bishop and Richard Steiger. A
Universal Modular Actor Formalism for Artificial
Intelligence. 1973.
Изначально для описания параллельных
вычислений
Позднее основа для реализаций
Don’t panic
Алгебры, логики, семантики и остальное оставим за
кадром.
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 9 / 42
26. Введение Actor Model
Что такое Actor
Всё это актор2
2
http://letitcrash.com/post/20964174345/
carl-hewitt-explains-the-essence-of-the-actor
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 10 / 42
27. Введение Actor Model
Что такое Actor
Всё это актор2
Функционируют параллельно
2
http://letitcrash.com/post/20964174345/
carl-hewitt-explains-the-essence-of-the-actor
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 10 / 42
28. Введение Actor Model
Что такое Actor
Всё это актор2
Функционируют параллельно
Асинхронно обмениваются сообщениями
2
http://letitcrash.com/post/20964174345/
carl-hewitt-explains-the-essence-of-the-actor
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 10 / 42
29. Введение Actor Model
Что такое Actor
Всё это актор2
Функционируют параллельно
Асинхронно обмениваются сообщениями
При обработке сообщения актор может
отправить конечное число сообщений другим акторам
создать конечное число новых акторов
назначить поведение для обработки следующего
сообщения
2
http://letitcrash.com/post/20964174345/
carl-hewitt-explains-the-essence-of-the-actor
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 10 / 42
30. Введение Actor Model
Что такое Actor
Всё это актор2
Функционируют параллельно
Асинхронно обмениваются сообщениями
При обработке сообщения актор может
отправить конечное число сообщений другим акторам
создать конечное число новых акторов
назначить поведение для обработки следующего
сообщения
Порядок доставки сообщений не специфицирован
2
http://letitcrash.com/post/20964174345/
carl-hewitt-explains-the-essence-of-the-actor
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 10 / 42
31. Введение Actor Model
Что такое Actor
Всё это актор2
Функционируют параллельно
Асинхронно обмениваются сообщениями
При обработке сообщения актор может
отправить конечное число сообщений другим акторам
создать конечное число новых акторов
назначить поведение для обработки следующего
сообщения
Порядок доставки сообщений не специфицирован
Акторы имеют «адреса»
2
http://letitcrash.com/post/20964174345/
carl-hewitt-explains-the-essence-of-the-actor
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 10 / 42
32. Введение Actor Model
Реализации Actor Model
3
http://en.wikipedia.org/wiki/Actor_model
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 11 / 42
33. Введение Actor Model
Реализации Actor Model
Языки3 с «родной» поддержкой:
Erlang
Scala
...
3
http://en.wikipedia.org/wiki/Actor_model
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 11 / 42
34. Введение Actor Model
Реализации Actor Model
Языки3 с «родной» поддержкой:
Erlang
Scala
...
Библиотеки для языков:
Scala
Java
F#
...
3
http://en.wikipedia.org/wiki/Actor_model
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 11 / 42
35. Введение Actor Model
Реализации Actor Model
Языки3 с «родной» поддержкой:
Erlang
Scala
...
Библиотеки для языков:
Scala
Java
F#
...
Мы выбрали
Akka (Scala API).
3
http://en.wikipedia.org/wiki/Actor_model
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 11 / 42
36. Практика Akka
О проекте
Jonas Bon´r:
e
Java Champion
Terracotta JVM clustering, JRockit JVM,
AspectWerkz AOP, Eclipse AspectJ
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 12 / 42
37. Практика Akka
О проекте
Jonas Bon´r:
e
Java Champion
Terracotta JVM clustering, JRockit JVM,
AspectWerkz AOP, Eclipse AspectJ
Ресурсы:
http://akka.io/docs/
http://letitcrash.com/
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 12 / 42
38. Практика Akka
О проекте
Jonas Bon´r:
e
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
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 12 / 42
39. Практика Akka
Производительность
Внимание
Синтетические тесты
4
http://letitcrash.com/post/14783691760/akka-vs-erlang
5
http://letitcrash.com/post/20397701710/
50-million-messages-per-second-on-a-single-machine
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 13 / 42
40. Практика Akka
Производительность
Внимание
Синтетические тесты
Erlang R14B04 vs Akka 2.0-SNAPSHOT4 :
4
http://letitcrash.com/post/14783691760/akka-vs-erlang
5
http://letitcrash.com/post/20397701710/
50-million-messages-per-second-on-a-single-machine
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 13 / 42
41. Практика Akka
Производительность
Внимание
Синтетические тесты
Erlang R14B04 vs Akka 2.0-SNAPSHOT4 :
1M mps vs 2.1M mps
4
http://letitcrash.com/post/14783691760/akka-vs-erlang
5
http://letitcrash.com/post/20397701710/
50-million-messages-per-second-on-a-single-machine
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 13 / 42
42. Практика Akka
Производительность
Внимание
Синтетические тесты
Erlang R14B04 vs Akka 2.0-SNAPSHOT4 :
1M mps vs 2.1M mps
Akka 2.05 :
4
http://letitcrash.com/post/14783691760/akka-vs-erlang
5
http://letitcrash.com/post/20397701710/
50-million-messages-per-second-on-a-single-machine
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 13 / 42
43. Практика Akka
Производительность
Внимание
Синтетические тесты
Erlang R14B04 vs Akka 2.0-SNAPSHOT4 :
1M mps vs 2.1M mps
Akka 2.05 :
50M mps
4
http://letitcrash.com/post/14783691760/akka-vs-erlang
5
http://letitcrash.com/post/20397701710/
50-million-messages-per-second-on-a-single-machine
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 13 / 42
44. Практика 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
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 13 / 42
45. Практика Akka
Особенности реализации Actor Model
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 14 / 42
46. Практика Akka
Особенности реализации Actor Model
300 байт на актор
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 14 / 42
47. Практика Akka
Особенности реализации Actor Model
300 байт на актор
Актор: состояние, поведение, почтовый ящик,
список детей, стратегия супервизора
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 14 / 42
48. Практика Akka
Особенности реализации Actor Model
300 байт на актор
Актор: состояние, поведение, почтовый ящик,
список детей, стратегия супервизора
Множество акторов на множестве нитей
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 14 / 42
49. Практика Akka
Особенности реализации Actor Model
300 байт на актор
Актор: состояние, поведение, почтовый ящик,
список детей, стратегия супервизора
Множество акторов на множестве нитей
Нет гарантированной доставки, семантика
at-most-once, порядок сохраняется
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 14 / 42
50. Практика Akka
Особенности реализации Actor Model
300 байт на актор
Актор: состояние, поведение, почтовый ящик,
список детей, стратегия супервизора
Множество акторов на множестве нитей
Нет гарантированной доставки, семантика
at-most-once, порядок сохраняется
Сообщения обрабатываются строго по порядку
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 14 / 42
51. Практика Akka
Особенности реализации Actor Model
300 байт на актор
Актор: состояние, поведение, почтовый ящик,
список детей, стратегия супервизора
Множество акторов на множестве нитей
Нет гарантированной доставки, семантика
at-most-once, порядок сохраняется
Сообщения обрабатываются строго по порядку
Иерархия: создаваемые акторы — дети,
родитель — супервизор
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 14 / 42
52. Практика Akka
Особенности реализации Actor Model
300 байт на актор
Актор: состояние, поведение, почтовый ящик,
список детей, стратегия супервизора
Множество акторов на множестве нитей
Нет гарантированной доставки, семантика
at-most-once, порядок сохраняется
Сообщения обрабатываются строго по порядку
Иерархия: создаваемые акторы — дети,
родитель — супервизор
Актор скрыт за переносимой ActorRef
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 14 / 42
53. Практика Akka
Ссылки
Чисто локальные
Локальные ссылки
Ссылки для маршрутизации (Router)
Ссылки на удалённых акторов
Особые: PromiseActorRef, DeadLetterActorRef,
EmptyLocalActorRef (DeadLetterActorRef)
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 15 / 42
54. Практика Akka
Ссылки
Чисто локальные
Локальные ссылки
Ссылки для маршрутизации (Router)
Ссылки на удалённых акторов
Особые: PromiseActorRef, DeadLetterActorRef,
EmptyLocalActorRef (DeadLetterActorRef)
Примеры путей
akka://system/user/service/worker
akka://system@server.yandex.ru:2552/user/service
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 15 / 42
55. Практика Akka
Конструирование ссылок
Создание акторов: ActorSystem.actorOf или
ActorContext.actorOf
Поиск акторов: ActorSystem.actorFor или
ActorContext.actorFor
Каждый актор знает себя, родителя и детей
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 16 / 42
56. Практика Akka
Конструирование ссылок
Создание акторов: ActorSystem.actorOf или
ActorContext.actorOf
Поиск акторов: ActorSystem.actorFor или
ActorContext.actorFor
Каждый актор знает себя, родителя и детей
Можно делать так:
1 context.actorFor("../brother") ! msg
2 context.actorFor("/user/service") ! msg
3 context.actorSelection("../*") ! msg
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 16 / 42
57. Практика Akka
Именование в локальной системе
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 17 / 42
58. Практика Akka
Пути
Типы путей:
Логический
Физический
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 18 / 42
59. Практика Akka
Пути
Типы путей:
Логический
Физический
Особые пути:
/user
/system
/deadLetters
/temp
/remote
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 18 / 42
60. Практика Akka
Удалённое развёртывание
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 19 / 42
61. Практика Akka
Actor Best Practices
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 20 / 42
62. Практика Akka
Actor Best Practices
Не блокироваться
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 20 / 42
63. Практика Akka
Actor Best Practices
Не блокироваться
Неизменяемые сообщения
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 20 / 42
64. Практика Akka
Actor Best Practices
Не блокироваться
Неизменяемые сообщения
Нет разделяемому состоянию
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 20 / 42
65. Практика Akka
Actor Best Practices
Не блокироваться
Неизменяемые сообщения
Нет разделяемому состоянию
«Опасные» подзадачи в дочерние акторы
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 20 / 42
66. Практика Akka
Actor Best Practices
Не блокироваться
Неизменяемые сообщения
Нет разделяемому состоянию
«Опасные» подзадачи в дочерние акторы
События жизненного цикла
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 20 / 42
67. Практика Akka
Используемые фичи
Actors
Logging
Scheduler
Dispatchers
Routing
Remoting
Serialization
Testing
FSM
Fault Tolerance
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 21 / 42
68. Практика Akka
Неиспользуемые фичи
Typed Actors
Event Bus
Futures
Dataflow Concurrency
STM
Agents
Transactors
Durable Mailboxes (file, Redis, ZooKeeper, Mongo)
Akka Cluster
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 22 / 42
69. Практика Примеры
Определение актора
1 class Partitioner(partitionStorage: ActorRef) extends Actor {
2
3 lazy val log = Logging(context.system, this)
4
5 def receive = {
6 case PartitionFeed(partner, offers) =>
7 partition(partner, offers)
8 case msg =>
9 log.error("Unsupported message received: {}", msg)
10 }
11
12 def partition(partner: Partner, offers: Traversable[Offer]) {
13 ...
14
15 partitionStorage ! UpdatePartitions(partner, partitioning)
16 }
17 }
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 23 / 42
70. Практика Примеры
Создание актора
1 val system = ActorSystem("sharder")
2
3 val partitionStorage = ...
4
5 val partitioner = system.actorOf(Props(
6 new Partitioner(
7 partitionStorage
8 )).withDispatcher("dispatcher.cpu")
9 .withRouter(FromConfig()),
10 "partitioner")
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 24 / 42
71. Практика Примеры
Конфигурация диспетчера
Конфигурация в HOCON6 :
1 dispatcher {
2 cpu {
3 type = Dispatcher
4 executor = "fork-join-executor"
5 mailbox-capacity = 4
6 mailbox-push-timeout-time = 5m
7
8 fork-join-executor {
9 parallelism-min = 4
10 parallelism-factor = 1.0
11 }
12 }
13 }
6
Human-Optimized Config Object Notation:
https://github.com/typesafehub/config
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 25 / 42
72. Практика Примеры
Диспетчеры и ящики
Диспетчеры:
Dispatcher
PinnedDispatcher
BalancingDispatcher
CallingThreadDispatcher
Почтовые ящики:
UnboundedMailbox
BoundedMailbox
UnboundedPriorityMailbox
BoundedPriorityMailbox
Durable Mailboxes
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 26 / 42
74. Практика Примеры
Маршрутизаторы
RoundRobinRouter
RandomRouter
SmallestMailboxRouter
BroadcastRouter
ScatterGatherFirstCompletedRouter
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 28 / 42
75. Практика Примеры
Конфигурирование из кода
1 val shardActors =
2 shards.map(system.actorFor(_)).toIndexedSeq
3
4 val shard = system.actorOf(
5 Props[PartitionReceiver]
6 .withRouter(RoundRobinRouter(shardActors))
7 .withDispatcher("dispatcher.shard"),
8 "shard")
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 29 / 42
76. Практика Примеры
Распределённые акторы
1 akka {
2 actor {
3 provider = "akka.remote.RemoteActorRefProvider"
4 }
5
6 remote {
7 transport = "akka.remote.netty.NettyRemoteTransport"
8
9 netty {
10 hostname = "server.yandex.ru"
11 port = 2553
12 }
13 }
14 }
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 30 / 42
77. Практика Примеры
Пример теста
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 }
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 31 / 42
78. Практика Примеры
Тестирование акторов
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 32 / 42
79. Практика Примеры
Тестирование акторов
Модульное тестирование с TestActorRef
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 32 / 42
80. Практика Примеры
Тестирование акторов
Модульное тестирование с TestActorRef
Интеграционное тестирование с Probe
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 32 / 42
81. Практика Примеры
Тестирование акторов
Модульное тестирование с TestActorRef
Интеграционное тестирование с Probe
Проверки с сопоставлением по шаблону
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 32 / 42
82. Практика Примеры
Тестирование акторов
Модульное тестирование с TestActorRef
Интеграционное тестирование с Probe
Проверки с сопоставлением по шаблону
Замедление времени
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 32 / 42
83. Практика Примеры
Тестирование акторов
Модульное тестирование с TestActorRef
Интеграционное тестирование с Probe
Проверки с сопоставлением по шаблону
Замедление времени
Детализированные логи akka.actor.debug.*
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 32 / 42
84. Практика Примеры
Тестирование акторов
Модульное тестирование с TestActorRef
Интеграционное тестирование с Probe
Проверки с сопоставлением по шаблону
Замедление времени
Детализированные логи akka.actor.debug.*
CallingThreadDispatcher
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 32 / 42
85. Практика Примеры
Супервизор
Решение при сбое:
1 Resume
2 Restart
3 Stop
4 Escalate
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 33 / 42
86. Практика Примеры
Супервизор
Решение при сбое:
1 Resume
2 Restart
3 Stop
4 Escalate
Принятое решение (1-3) действует рекурсивно
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 33 / 42
87. Практика Примеры
Супервизор
Решение при сбое:
1 Resume
2 Restart
3 Stop
4 Escalate
Принятое решение (1-3) действует рекурсивно
Функция Exception ⇒ Directive
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 33 / 42
88. Практика Примеры
Супервизор
Решение при сбое:
1 Resume
2 Restart
3 Stop
4 Escalate
Принятое решение (1-3) действует рекурсивно
Функция Exception ⇒ Directive
Terminated, preStart, preRestart, postStop,
postRestart
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 33 / 42
89. Практика Примеры
Супервизор
Решение при сбое:
1 Resume
2 Restart
3 Stop
4 Escalate
Принятое решение (1-3) действует рекурсивно
Функция Exception ⇒ Directive
Terminated, preStart, preRestart, postStop,
postRestart
OneForOneStrategy и AllForOneStrategy
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 33 / 42
90. Практика Примеры
Супервизор
Решение при сбое:
1 Resume
2 Restart
3 Stop
4 Escalate
Принятое решение (1-3) действует рекурсивно
Функция Exception ⇒ Directive
Terminated, preStart, preRestart, postStop,
postRestart
OneForOneStrategy и AllForOneStrategy
Ограничение количества перезапусков
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 33 / 42
91. Практика Примеры
Супервизор по умолчанию
1 final val defaultStrategy: SupervisorStrategy = {
2 def defaultDecider: Decider = {
3 case _: ActorInitializationException => Stop
4 case _: ActorKilledException => Stop
5 case _: Exception => Restart
6 case _ => Escalate
7 }
8 OneForOneStrategy()(defaultDecider)
9 }
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 34 / 42
92. Практика Примеры
Наблюдаемость
Typesafe Console для мониторинга
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 35 / 42
93. Практика Примеры
Наблюдаемость
Typesafe Console для мониторинга
Graphite + statsd + statsd-over-slf4j
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 35 / 42
94. Практика Примеры
Свойства must have
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 36 / 42
95. Практика Примеры
Свойства must have
Масштабируемость
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 36 / 42
96. Практика Примеры
Свойства must have
Масштабируемость
Гибкость
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 36 / 42
97. Практика Примеры
Свойства must have
Масштабируемость
Гибкость
Устойчивость к сбоям
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 36 / 42
98. Практика Примеры
Свойства must have
Масштабируемость
Гибкость
Устойчивость к сбоям
Тестируемость
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 36 / 42
99. Практика Примеры
Свойства must have
Масштабируемость
Гибкость
Устойчивость к сбоям
Тестируемость
Наблюдаемость
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 36 / 42
100. Практика Опыт
Акторы
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 37 / 42
101. Практика Опыт
Акторы
Храните состояние вовне
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 37 / 42
102. Практика Опыт
Акторы
Храните состояние вовне
Стройте всю систему на акторах
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 37 / 42
103. Практика Опыт
Акторы
Храните состояние вовне
Стройте всю систему на акторах
Пишите асинхронный код
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 37 / 42
104. Практика Опыт
Акторы
Храните состояние вовне
Стройте всю систему на акторах
Пишите асинхронный код
Избегайте косвенного взаимодействия акторов
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 37 / 42
105. Практика Опыт
Акторы
Храните состояние вовне
Стройте всю систему на акторах
Пишите асинхронный код
Избегайте косвенного взаимодействия акторов
Баги есть, но быстро чинят
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 37 / 42
106. Практика Опыт
Память и ящики
7
http://letitcrash.com/post/17707262394/
why-no-mailboxsize-in-akka-2
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 38 / 42
107. Практика Опыт
Память и ящики
Неограниченные ящики ⇒ неограниченная память
при перегрузке
7
http://letitcrash.com/post/17707262394/
why-no-mailboxsize-in-akka-2
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 38 / 42
108. Практика Опыт
Память и ящики
Неограниченные ящики ⇒ неограниченная память
при перегрузке
Ограниченные ящики ⇒ возможные deadlock’и
при наличии циклов
7
http://letitcrash.com/post/17707262394/
why-no-mailboxsize-in-akka-2
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 38 / 42
109. Практика Опыт
Память и ящики
Неограниченные ящики ⇒ неограниченная память
при перегрузке
Ограниченные ящики ⇒ возможные deadlock’и
при наличии циклов
⇒ стройте системы без циклов
7
http://letitcrash.com/post/17707262394/
why-no-mailboxsize-in-akka-2
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 38 / 42
110. Практика Опыт
Память и ящики
Неограниченные ящики ⇒ неограниченная память
при перегрузке
Ограниченные ящики ⇒ возможные deadlock’и
при наличии циклов
⇒ стройте системы без циклов
Существует диспетчер по умолчанию
7
http://letitcrash.com/post/17707262394/
why-no-mailboxsize-in-akka-2
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 38 / 42
111. Практика Опыт
Память и ящики
Неограниченные ящики ⇒ неограниченная память
при перегрузке
Ограниченные ящики ⇒ возможные deadlock’и
при наличии циклов
⇒ стройте системы без циклов
Существует диспетчер по умолчанию
Нет доступа к размеру ящика7
7
http://letitcrash.com/post/17707262394/
why-no-mailboxsize-in-akka-2
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 38 / 42
112. Практика Опыт
Удалённые акторы
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 39 / 42
113. Практика Опыт
Удалённые акторы
Remote deploy пока не работает в полной мере
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 39 / 42
114. Практика Опыт
Удалённые акторы
Remote deploy пока не работает в полной мере
На клиенте нужно иметь код удалённо
развёртываемого актора (WTF?!)
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 39 / 42
115. Практика Опыт
Удалённые акторы
Remote deploy пока не работает в полной мере
На клиенте нужно иметь код удалённо
развёртываемого актора (WTF?!)
Маршрутизатор smallest-mailbox не работает
для удалённых акторов
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 39 / 42
116. Заключение Недостатки реализации
Недостатки реализации
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 40 / 42
117. Заключение Недостатки реализации
Недостатки реализации
Отсутствует явная структура системы
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 40 / 42
118. Заключение Недостатки реализации
Недостатки реализации
Отсутствует явная структура системы
Нет статической проверки протоколов
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 40 / 42
119. Заключение Недостатки реализации
Недостатки реализации
Отсутствует явная структура системы
Нет статической проверки протоколов
Пока неполноценная реализация удалённого
деплоя и апгрейда
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 40 / 42
120. Заключение Недостатки реализации
Недостатки реализации
Отсутствует явная структура системы
Нет статической проверки протоколов
Пока неполноценная реализация удалённого
деплоя и апгрейда
Нет развитых средств анализа
производительности системы
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 40 / 42
121. Заключение Достоинства подхода
Достоинства подхода
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 41 / 42
122. Заключение Достоинства подхода
Достоинства подхода
Выразительное описание поведения и
взаимодействия
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 41 / 42
123. Заключение Достоинства подхода
Достоинства подхода
Выразительное описание поведения и
взаимодействия
Простое конфигурирование
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 41 / 42
124. Заключение Достоинства подхода
Достоинства подхода
Выразительное описание поведения и
взаимодействия
Простое конфигурирование
Гибкое управления выполнением
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 41 / 42
125. Заключение Достоинства подхода
Достоинства подхода
Выразительное описание поведения и
взаимодействия
Простое конфигурирование
Гибкое управления выполнением
Масштабируется локально и распределённо
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 41 / 42
126. Заключение Достоинства подхода
Достоинства подхода
Выразительное описание поведения и
взаимодействия
Простое конфигурирование
Гибкое управления выполнением
Масштабируется локально и распределённо
Работает
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 41 / 42
127. Заключение 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.
Вадим Цесько (Яндекс) Потоковая обработка на Actor Model 12 мая 2012 г. 42 / 42