Предисловие.....................................................................................................11
Благодарности..................................................................................................12
О книге...............................................................................................................13
Кому адресована эта книга ............................................................................ 13
Содержание книги .......................................................................................... 13
Соглашения об оформлении программного кода ........................................ 15
Требования к программному обеспечению ................................................. 15
Автор в сети..................................................................................................... 15
Об авторах ....................................................................................................... 16
Об иллюстрации на обложке.......................................................................... 16
Глава 1. Введение в Akka ................................................................................18
1.1. Что такое Akka?......................................................................................... 22
1.2. Акторы: краткий обзор............................................................................ 22
1.3. Два подхода к масштабированию: подготовка примера ...................... 24
1.4. Традиционное масштабирование........................................................... 26
1.4.1. Традиционный подход к масштабированию и хранению:
переместить все в базу данных .................................................................. 26
1.4.2. Традиционное масштабирование и интерактивная работа: опрос........ 29
1.4.3. Традиционное масштабирование и интерактивная работа:
обработка ошибок ....................................................................................... 31
1.5. Масштабирование с Akka......................................................................... 32
1.5.1. Подход к масштабированию и хранению с Akka: отправка и прием
сообщений ................................................................................................... 33
1.5.2. Масштабирование с Akka и интерактивная работа: отправка
сообщений ................................................................................................... 36
1.5.3. Масштабирование с Akka и отказы: асинхронное разделение............... 37
1.5.4. Подход Akka: отправка и получение сообщений ..................................... 37
1.6. Акторы: универсальная модель программирования ............................ 39
1.6.1. Модель асинхронного выполнения........................................................... 40
1.6.2. Операции с акторами................................................................................. 41
1.7. Акторы Akka.............................................................................................. 44
1.7.1 ActorSystem .................................................................................................. 45
1.7.2. ActorRef, почтовый ящик и актор .............................................................. 47
1.7.3. Диспетчеры ................................................................................................. 47
1.7.4. Акторы и сеть .............................................................................................. 49
1.8. В заключение............................................................................................ 49
Глава 2. Подготовка и запуск .........................................................................51
2.1. Клонирование, сборка и интерфейс тестирования ............................... 52
6  Оглавление
2.1.1. Сборка с помощью sbt................................................................................ 53
2.1.2. Забегая вперед: REST-сервер GoTicks.com................................................ 54
2.2. Исследование акторов в приложении..................................................... 59
2.2.1. Структура приложения .............................................................................. 59
2.2.2. Актор, осуществляющий продажу: TicketSeller........................................ 64
2.2.3. Актор BoxOffice .......................................................................................... 65
2.2.4. Актор RestApi.............................................................................................. 67
2.3. Вперед, в облако ....................................................................................... 70
2.3.1. Создание приложения в облаке Heroku .................................................... 71
2.3.2. Развертывание и запуск в Heroku ............................................................. 72
2.4. В заключение............................................................................................ 73
Глава 3. Разработка с акторами через тестирование.................................75
3.1. Тестирование акторов.............................................................................. 76
3.2. Односторонние взаимодействия ............................................................ 78
3.2.1. Примеры SilentActor .................................................................................. 79
3.2.2. Пример SendingActor ................................................................................. 84
3.2.3. Пример SideEffectingActor ......................................................................... 89
3.3. Двусторонние взаимодействия............................................................... 92
3.4. В заключение............................................................................................ 93
Глава 4. Отказоустойчивость..........................................................................95
4.1. Что такое отказоустойчивость................................................................. 95
4.1.1. Простые объекты и исключения ............................................................... 98
4.1.2. И пусть падает .......................................................................................... 103
4.2. Жизненный цикл актора ....................................................................... 107
4.2.1. Событие start ............................................................................................ 107
4.2.2. Событие stop............................................................................................. 108
4.2.3. Событие restart ......................................................................................... 109
4.2.4. Объединяем фрагменты жизненного цикла вместе.............................. 111
4.2.5. Мониторинг жизненного цикла .............................................................. 113
4.3. Супервизор ............................................................................................. 114
4.3.1. Иерархия супервизора ............................................................................. 114
4.3.2. Предопределенные стратегии................................................................. 117
4.3.3. Собственные стратегии............................................................................ 118
4.4. В заключение.......................................................................................... 124
Глава 5. Объекты Future................................................................................125
5.1. Примеры использования объектов Future ........................................... 126
5.2. Объекты Future не блокируют выполнение потока............................. 131
5.2.1. Объекты Promise – это обещания............................................................ 135
5.3. Обработка ошибок в объектах Future ................................................... 138
5.4. Комбинирование объектов Future ........................................................ 143
5.5. Объединение объектов Future с акторами ........................................... 152
Оглавление  7
5.6. В заключение.......................................................................................... 153
Глава 6. Первое распределенное приложение .........................................155
6.1. Горизонтальное масштабирование ...................................................... 156
6.1.1. Общая терминология ............................................................................... 156
6.1.2. Причины использования модели распределенного
программирования ................................................................................... 158
6.2. Горизонтальное масштабирование и удаленные взаимодействия.... 159
6.2.1. Реорганизация приложения GoTicks.com............................................... 161
6.2.2. Удаленные взаимодействия в REPL ........................................................ 161
6.2.3. Удаленный поиск...................................................................................... 167
6.2.4. Удаленное развертывание ....................................................................... 175
6.2.5. Тестирование с multi-JVM........................................................................ 180
6.3. В заключение.......................................................................................... 186
Глава 7. Настройка, журналирование и развертывание..........................188
7.1. Настройка................................................................................................ 188
7.1.1. Попытка настройки Akka ......................................................................... 189
7.1.2. Использование значений по умолчанию................................................ 192
7.1.3. Настройка Akka ......................................................................................... 195
7.1.4. Настройка для нескольких систем........................................................... 196
7.2. Журналирование .................................................................................... 199
7.2.1. Журналирование в приложении Akka..................................................... 199
7.2.2. Использование журналирования ............................................................ 201
7.2.3. Управление журналированием из Akka .................................................. 202
7.3. Развертывание приложений на основе акторов .................................. 204
7.4. В заключение .......................................................................................... 208
Глава 8. Шаблоны структуризации акторов...............................................210
8.1. Конвейеры и фильтры ........................................................................... 211
8.1.1. Шаблон: конвейеры и фильтры............................................................... 211
8.1.2. Конвейеры и фильтры в Akka .................................................................. 212
8.2. Параллельная обработка дроблением с последующим
объединением результатов .................................................................... 216
8.2.1. Область применения................................................................................ 216
8.2.2. Распараллеливание задач в Akka ............................................................ 218
8.2.3. Реализация компонента дробления с использованием списка
получателей ............................................................................................... 219
8.2.4. Реализация компонента объединения с использованием
агрегатора .................................................................................................. 221
8.2.5. Объединение компонентов в реализацию шаблона параллельной
обработки дроблением ............................................................................. 227
8.3. Маршрутизация...................................................................................... 229
8.4. В заключение.......................................................................................... 234
8  Оглавление
Глава 9. Маршрутизация сообщений..........................................................236
9.1. Шаблон «Маршрутизатор»..................................................................... 237
9.2. Балансировка нагрузки с помощью маршрутизаторов Akka.............. 238
9.2.1. Маршрутизатор с пулом .......................................................................... 242
9.2.2. Маршрутизатор с группой....................................................................... 250
9.2.3. Маршрутизатор ConsistentHashing ......................................................... 257
9.3. Реализация шаблона маршрутизатора с применением акторов........ 262
9.3.1. Маршрутизация по содержимому........................................................... 262
9.3.2. Маршрутизация на основе состояния..................................................... 263
9.3.3. Реализации маршрутизаторов ................................................................ 265
9.4. В заключение.......................................................................................... 266
Глава 10. Каналы обмена сообщениями....................................................268
10.1. Типы каналов........................................................................................ 269
10.1.1. Точка-точка............................................................................................. 269
10.1.2. Издатель/подписчик .............................................................................. 270
10.2. Специальные каналы........................................................................... 280
10.2.1. DeadLetter................................................................................................ 281
10.2.2. Гарантированная доставка .................................................................... 283
10.3. В заключение ........................................................................................ 289
Глава 11. Конечные автоматы и агенты.....................................................291
11.1. Использование конечного автомата................................................... 292
11.1.1. Краткое введение в конечные автоматы.............................................. 292
11.1.2. Создание модели конечного автомата ................................................. 294
11.2. Реализация модели конечного автомата............................................ 295
11.2.1. Реализация переходов............................................................................ 296
11.2.2. Реализация действий при входе в состояния....................................... 301
11.2.3. Таймеры в конечном автомате.............................................................. 305
11.2.4. Завершение конечного автомата .......................................................... 308
11.3. Реализация общего состояния с помощью агентов........................... 309
11.3.1. Простой доступ к общим данным с помощью агентов ....................... 310
11.3.2. Ожидание изменения состояния........................................................... 312
11.4. В заключение ........................................................................................ 313
Глава 12. Интеграция с другими системами..............................................315
12.1. Конечные точки сообщений................................................................ 315
12.1.1. Нормализатор......................................................................................... 317
12.1.2. Модель канонических данных............................................................... 319
12.2. Реализация конечных точек с использованием Apache Camel......... 322
12.2.1. Реализация конечной точки-потребителя для приема сообщений
из внешней системы ................................................................................. 323
12.2.2. Реализация конечной точки-производителя для отправки
сообщений во внешнюю систему............................................................. 330
Оглавление  9
12.3. Реализация HTTP-интерфейса............................................................ 335
12.3.1. Пример HTTP-интерфейса..................................................................... 336
12.3.2. Реализация конечной точки REST на основе akka-http....................... 338
12.4. В заключение ........................................................................................ 344
Глава 13. Потоковые приложения...............................................................346
13.1. Основы потоковой обработки............................................................. 347
13.1.1. Копирование файлов.............................................................................. 351
13.1.2. Материализация запускаемых графов ................................................. 355
13.1.3. Обработка событий в потоке ................................................................. 360
13.1.4. Обработка ошибок в потоках................................................................. 364
13.1.5. Создание протокола с BidiFlow.............................................................. 366
13.2. Потоковая передача данных через HTTP ........................................... 369
13.2.1. Прием потока данных по HTTP............................................................. 370
13.2.2. Возврат потока данных по HTTP........................................................... 372
13.2.3. Согласование контента .......................................................................... 373
13.3. Ветвление и слияние со специализированным языком описания
графов...................................................................................................... 378
13.3.1. Ветвление потоков ................................................................................. 378
13.3.2. Слияние потоков .................................................................................... 381
13.4. Посредничество между производителями и потребителями........... 384
13.4.1. Использование буферов......................................................................... 385
13.5. Обособление частей графа, действующих с разной скоростью........ 389
13.5.1. Медленный потребитель, накопление событий в блоках ................... 389
13.5.2. Быстрый потребитель, дополнительные показатели .......................... 390
13.6. В заключение ........................................................................................ 391
Глава 14. Кластеры.........................................................................................393
14.1. Зачем нужны кластеры? ...................................................................... 393
14.2. Членство в кластере ............................................................................. 395
14.2.1. Присоединение к кластеру .................................................................... 396
14.2.2. Выход из кластера .................................................................................. 404
14.3. Обработка заданий в кластере ............................................................ 410
14.3.1. Запуск кластера ...................................................................................... 412
14.3.2. Распределение заданий с использованием маршрутизаторов........... 414
14.3.3. Надежная обработка заданий................................................................ 417
14.3.4. Тестирование кластера........................................................................... 424
14.4. В заключение ........................................................................................ 428
Глава 15. Хранимые акторы.........................................................................430
15.1. Восстановление состояния с технологией Event Sourcing................. 432
15.1.1. Обновление записей на месте ............................................................... 432
15.1.2. Сохранение состояния без изменения.................................................. 433
15.1.3. Event Sourcing для акторов .................................................................... 435
10  Оглавление
15.2. Хранимые акторы ................................................................................ 436
15.2.1. Хранимый актор..................................................................................... 437
15.2.2. Тестирование .......................................................................................... 441
15.2.3. Моментальные снимки.......................................................................... 443
15.2.4. Запрос хранимых событий .................................................................... 449
15.2.5. Сериализация ......................................................................................... 451
15.3. Кластер на основе хранимых акторов ............................................... 457
15.3.1. Расширение cluster singleton................................................................. 461
15.3.2. Расширение cluster sharding .................................................................. 465
15.4. В заключение ........................................................................................ 470
Глава 16. Советы по повышению производительности ..........................471
16.1. Анализ производительности............................................................... 472
16.1.1. Производительность системы............................................................... 472
16.1.2. Показатели производительности.......................................................... 474
16.2. Оценка производительности акторов ................................................ 477
16.2.1. Сбор данных в почтовом ящике............................................................ 478
16.2.2. Сбор и обработка данных ...................................................................... 485
16.3. Улучшение производительности устранением узких мест............... 487
16.4. Настройка диспетчера ......................................................................... 489
16.4.1. Выявление проблем с пулами потоков ................................................. 489
16.4.2. Использование нескольких экземпляров диспетчеров....................... 491
16.4.3. Изменение размера пула потоков статически..................................... 493
16.4.4. Изменение размера пула потоков динамически ................................. 496
16.5. Изменение поведения механизма освобождения потоков .............. 498
16.5.1. Ограничения механизма освобождения потоков................................ 500
16.6. В заключение ........................................................................................ 502
Глава 17. Заглядывая вперед .......................................................................504
17.1. Модуль akka-typed ................................................................................ 505
17.2. Akka Distributed Data ............................................................................ 509
17.3. В заключение ........................................................................................ 509
Предметный указатель .................................................................................511