Реактивные шаблоны проектирования - Роланд Кун - E-Book

Реактивные шаблоны проектирования E-Book

Роланд Кун

0,0

Beschreibung

Реактивное программирование - совершенно новая и многообещающая парадигма, позволяющая эффективно решать задачи, связанные с созданием распределенных систем и программированием для JVM. Эта книга расскажет, как организовать поток задач, наладить обмен сообщениями между элементами программы, обеспечить параллельную и конкурентную обработку и создавать надежные, отказоустойчивые и гибкие приложения. Перед вами - основополагающая работа по шаблонам проектирования (design patterns) этой парадигмы. Книга проиллюстрирована многочисленными примерами и ориентирована на опытных Java- и Scala-разработчиков

Sie lesen das E-Book in den Legimi-Apps auf:

Android
iOS
von Legimi
zertifizierten E-Readern
Kindle™-E-Readern
(für ausgewählte Pakete)

Seitenzahl: 561

Veröffentlichungsjahr: 2023

Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:

Android
iOS
Bewertungen
0,0
0
0
0
0
0
Mehr Informationen
Mehr Informationen
Legimi prüft nicht, ob Rezensionen von Nutzern stammen, die den betreffenden Titel tatsächlich gekauft oder gelesen/gehört haben. Wir entfernen aber gefälschte Rezensionen.



Роланд Кун, Брайан Ханафи, Джейми Аллен
Реактивные шаблоны проектирования

Переводчик С. Черников

Технический редактор Н. Рощина

Литературный редактор Н. Рощина

Художники А. Барцевич, С. Заматевская , Г. Синякина (Маклакова)

Корректоры Е. Павлович, Е. Рафалюк-Бузовская

Верстка Г. Блинов

Роланд Кун, Брайан Ханафи, Джейми Аллен

Реактивные шаблоны проектирования. — СПб.: Питер, 2018.

ISBN 978-5-4461-0474-1

© ООО Издательство "Питер", 2018

Все права защищены. Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме без письменного разрешения владельцев авторских прав.

Оглавление

Предисловие
Введение
Благодарности
Роланд Кун
Джейми Аллен
Брайан Ханафи
Об этой книге
Для кого эта книга
Как читать книгу
Условные обозначения
Исходный код для примеров
Об авторах
Часть I. Основные сведения
1. Зачем нужна реактивность
1.1. Анатомия реактивного приложения
1.2. Справляемся с нагрузкой
1.3. Обработка сбоев
1.4. Придание системе отзывчивости
1.5. Избегаем архитектуры вида «большой ком грязи»
1.6. Взаимодействие нереактивных компонентов
1.7. Резюме
2. Подробный разбор манифеста реактивного программирования
2.1. Реакция на действия пользователей
2.2. Применение параллелизма
2.3. Ограничения параллельного выполнения
2.4. Реакция на сбой
2.5. Утрата строгой согласованности
2.6. Необходимость в реактивных шаблонах проектирования
2.7. Резюме
3. Инструменты реактивного программирования
3.1. Первые реактивные решения
3.2. Функциональное программирование
3.3. Отзывчивость на действия пользователя
3.4. Инструментарий для реактивного программирования
3.5. Резюме
Часть II. Кратко о философии реактивного программирования
4. Обмен сообщениями
4.1. Сообщения
4.2. Вертикальное масштабирование
4.3. Различия между передачей событий и сообщений
4.4. Сравнение синхронности и асинхронности
4.5. Управление потоком
4.6. Гарантии доставки
4.7. События и сообщения
4.8. Синхронный обмен сообщениями
4.9. Резюме
5. Прозрачность размещения
5.1. Что такое прозрачность размещения
5.2. Обманчивость прозрачной удаленности
5.3. Открытый обмен сообщениями приходит на помощь
5.4. Оптимизация локального обмена сообщениями
5.5. Потеря сообщений
5.6. Горизонтальная масштабируемость
5.7. Прозрачность размещения упрощает тестирование
5.8. Динамическое связывание
5.9. Резюме
6. Разделяй и властвуй
6.1. Иерархическое разбиение проблем
6.2. Разница между зависимостями и дочерними модулями
6.3. Построение собственной большой корпорации
6.4. Преимущества спецификации и тестирования
6.5. Горизонтальное и вертикальное масштабирование
6.6. Резюме
7. Принципиальная обработка сбоев
7.1. Владение подразумевает взятие на себя обязательств
7.2. Владение подразумевает управление жизненным циклом
7.3. Устойчивость на всех уровнях
7.4. Резюме
9. Вынужденная неопределенность
9.1. Логическое программирование и декларативный способ передачи данных
9.2. Функциональное реактивное программирование
9.3. Отсутствие общих данных упрощает параллелизм
9.4. Конкурентность с разделяемым состоянием
9.5. Так что же нам делать?
9.6. Резюме
10. Поток сообщений
10.1. Продвижение данных
10.2. Моделирование процессов вашей предметной области
10.3. Определение ограничений устойчивости
10.4. Оценка потенциальной нагрузки и масштаба развертывания
10.5. Планирование управления потоками
10.6. Резюме
Часть III. Шаблоны проектирования
11. Тестирование реактивных приложений
11.1. Как тестировать
11.2. Тестовая среда
11.3. Асинхронное тестирование
11.4. Тестирование недетерминистских систем
11.5. Тестирование гибкости
11.6. Тестирование устойчивости
11.7. Тестирование отзывчивости
11.8. Резюме
12. Шаблоны отказоустойчивости и восстановления
12.1. Шаблон «Простой компонент»
12.2. Шаблон «Ядро ошибок»
12.3. Шаблон «Допустимый отказ»
12.4. Шаблон «Предохранитель»
12.5. Резюме
13. Шаблоны репликации
13.1. Шаблон репликации «Активный к пассивному»
13.2. Шаблоны репликации с несколькими активными копиями
13.3. Шаблон репликации «Активный к активному»
13.4. Резюме
14. Шаблоны управления ресурсами
14.1. Шаблон инкапсуляции ресурсов
14.2. Шаблон заимствования ресурсов
14.3. Шаблон «Составная команда»
14.4. Шаблон «Пул ресурсов»
14.5. Шаблоны управляемой блокировки
14.6. Резюме
15. Шаблоны потока сообщений
15.1. Шаблон «Запрос — отклик»
15.2. Шаблон «Самодостаточное сообщение»
15.3. Шаблон запроса
15.4. Шаблон «Прямоток»
15.5. Шаблон «Агрегатор»
15.6. Шаблон «Повествование»
15.7. Шаблон «Рукопожатие» (он же шаблон надежной доставки)
15.8. Резюме
16. Шаблоны управления потоком
16.1. Модель «Извлечение»
16.2. Шаблон управляемой очереди
16.3. Шаблон отказа
16.4. Шаблон «Регулирование»
16.5. Резюме
17. Шаблоны управления состоянием и обеспечения устойчивости
17.1. Шаблон реализации предметной области
17.2. Шаблон сегментирования
17.3. Шаблон «Порождение событий»
17.4. Шаблон «Поток событий»
17.5. Резюме
Приложения
Приложение А. Создание схем для реактивных систем
Приложение Б. Иллюстрированный пример
Б.1. Географическое разделение
Б.2. Планирование потока информации
Б.3. А если что-то пойдет не так?
Б.4. Чему нас научил этот пример
Б.5. Дальнейшие шаги
Приложение В. Манифест реактивного программирования
В.1. Основной текст
В.2. Глоссарий

Моим детям.

Роланд

Предисловие

Я благодарен Роланду за то, что он нашел время для написания этой фундаментальной книги, и мне сложно представить, кто смог бы справиться с этим лучше его. У Роланда необычайно ясное и глубокое мышление, он участвовал в разработке манифеста реактивного программирования, на протяжении нескольких лет был техническим руководителем проекта Akka, помогал в создании популярного курса на Coursera, посвященного реактивному программированию и проектированию, а также читал лекции на эту тему. Это лучший автор технической литературы, которого я когда-либо встречал.

Несомненно, я в восторге от этой книги. В ней описываются все важные особенности реактивной архитектуры и ее проектирования, а материал подается в удобной форме и уже с первой главы сопровождается практическими примерами. Перед вами этакий каталог шаблонов, в котором объясняется общий подход к проектированию системы и рассказывается, как в ней все между собой соединяется. По структуре книга очень похожа на издание Мартина Фаулера «Шаблоны архитектуры промышленных приложений» (Patterns of Enterprise ApplicationArchitecture), вышедшее 15 лет назад.

На протяжении своей карьеры я не раз убеждался в неоспоримых преимуществах устойчивости и слабой связанности, а также в удобстве приложений, изначально основанных на обмене сообщениями, особенно в сравнении с более традиционными подходами, которые не учитывают природу распределенных систем. В 2013 году я решил документально закрепить свой опыт и усвоенные уроки — так на свет появился манифест реактивного программирования. Все началось с набора общих заметок, которые, как мне помнится, я представил на одной из рабочих встреч в компании Typesafe (ныне Lightbend). Так совпало, что эта встреча была совмещена с конференцией Scala Days New York, где Роланд Кун, Мартин Одерски и Эрик Мейер снимали неудачное, но, как потом оказалось, довольно смешное рекламное видео для своего курса по реактивному программированию на Coursera. История, повествующая о реактивных принципах, пришлась по душе другим инженерам и была опубликована в июле 2013 года. С тех пор манифест получил множество прекрасных отзывов от сообщества. Позже усилиями Роланда, Мартина Томпсона, Дейва Ферли и моими он был переписан и значительно улучшен, и в сентябре 2014 года была опубликована версия 2.0. К концу 2016-го под манифестом подписались более 17 000 человек. Одновременно мы наблюдали, как реактивный подход из практически никому не известной методики, которая применялась лишь несколькими корпорациями во второстепенных проектах, превращается в часть общей стратегии множества больших игроков в различных областях, включая межплатформенное ПО, финансовые сервисы, торговые площадки, социальные сети, тотализаторы/игры и т.д.

В манифесте реактивного программирования реактивные системы определяются как набор архитектурных принципов проектирования, направленных на удовлетворение спроса, который может появиться у приложения как сегодня, так и в будущем. Эти принципы совершенно точно нельзя назвать новыми: их начали разрабатывать в 1970–1980-х годах Джим Грей и Пэт Хелланд во время плодо­творной работы над Tandem System, а также Джо Армстронг и Роберт Вирдинг при создании языка Erlang. Однако эти первопроходцы опередили свое время: только за последние пять лет индустрия была вынуждена пересмотреть стандартные подходы к разработке промышленных систем и научиться применять добытые тяжким трудом знания о реактивных принципах в современном мире с его многоядерными архитектурами, облачными вычислениями и Интернетом вещей.

Сейчас реактивные принципы стали ощутимо влиять на индустрию, и, как часто бывает с успешными идеями, их начали по-разному интерпретировать. В этом нет ничего плохого, ведь, чтобы не утратить свою актуальность, идеи должны эволюционировать. Тем не менее это может вызвать путаницу и исказить изначальную цель. Одним из примеров может служить появление ошибочного мнения о том, что для достижения реактивности достаточно программировать в асинхронном и неблокирующем стиле, используя функции обратного вызова или потоковые комбинаторы — методики, которые, несомненно, являются частью реактивного подхода. Но если концентрироваться только на них и ни на чем другом, можно лишиться многих преимуществ, которыми обладают реактивные принципы. Данная книга помогает получить более широкое, системное представление, фокусируясь не столько на функциях отдельных компонентов самих по себе, сколько на архитектуре совместных, устойчивых и гибких систем, которые называются реактивными.

Этому изданию, которому суждено стать классикой, место на полке любого профессионального программиста рядом с такими книгами, как «Приемы объектно-ориентированного программирования. Паттерны проектирования»1 и «Предметно-ориентированное проектирование»2. Лично я насладился чтением, чего и вам желаю!

Йонас Бонер, технический директор и основатель Lightbend, создатель Akka

1Гамма Э., Хелм Р., Джонсон Р., Влиссидес Дж.Приемы объектно-ориентированного программирования. Паттерны проектирования. — СПб.: Питер, 2001.

2Эванс Э. Предметно-ориентированное проектирование. — М.: Вильямс, 2010.

Введение

Еще до того, как я присоединился к разработке Akka, Майк Стефенс из издательства Manning пытался убедить меня написать книгу об этом фреймворке. У меня был соблазн ответить положительно, но жена меня отрезвила, напомнив о предстоящей смене работы и переезде в другую страну: у меня не хватило бы сил еще и на такой проект. Но идея написания книги поселилась в моей голове. Тремя годами позже, после публикации манифеста реактивного программирования, мы с Мартином Одерски и Эриком Мейером преподавали принципы реактивного программирования на платформе Coursera, причем за два этапа курс прослушали 120 000 студентов. Идея этого курса родилась на встрече инженеров в компании Typesafe, во время которой я предложил Мартину поддержать подающее надежды течение реактивного программирования. Я продемонстрировал, как эффективно использовать соответствующие инструменты и при этом избежать подводных камней, — отвечая на вопросы в электронной рассылке по Akka, я получил неплохое представление о том, какие аспекты даются людям особенно тяжело.

Видеокурсы являются отличным способом привлечь большое количество студентов, они позволяют общаться с ними на форумах и в целом улучшают жизнь вокруг нас. К сожалению, этот формат вынуждает ограничивать глубину и масштаб дискуссии: в нашем распоряжении лишь семь еженедельных лекций. Поэтому мне все еще не терпелось формализовать и передать окружающим свои знания о реактивных системах, оформив их в виде книги. Мне было бы довольно просто написать об Akka, но я чувствовал, что книга, если я за нее возьмусь, не должна ограничиваться этим фреймворком. Я обожаю работать с Akka, этот проект буквально изменил мою жизнь, но это лишь инструмент для реализации распределенных высоконадежных систем, и одного его будет недостаточно.

С этого и началась книга, которую вы держите в руках. Задача была пугающей, и я знал, что мне понадобится помощь. К счастью, Джейми как раз заканчивал свою книгу Effective Akka3 и сразу же откликнулся на мое предложение. Ни у одного из нас не было возможности писать днем, поэтому вначале процесс продвигался медленно, мы отставали от графика. Мы собирались передать первые три главы для программы раннего доступа во время первого этапа курса «Принципы реактивного программирования», но не успели и анонсировали их несколькими месяцами позже. Поразительно, сколько недостающих деталей можно обнаружить, если изначально исходить из того, что материал, в сущности, уже известен и его просто нужно ввести в компьютер. Со временем Джейми еще больше загрузили на основной работе, и в какой-то момент он прекратил заниматься книгой. Позже Джейми присоединился к проекту в качестве технического редактора издательства Manning, и вскоре стало очевидно, что он может не только вносить хорошие предложения, но и воплощать их в жизнь. Мы сделали его официальным соавтором, и он помог мне придать рукописи завершенный вид.

В издании мы не просто рассказываем о том, когда и как использовать инструменты реактивного программирования, но и объясняем, что стоит за этими советами. Это позволит вам адаптировать изложенный материал к разным требованиям и новым приложениям и, надеюсь, вдохновит вас на дальнейшее исследование чудесного мира реактивных систем.

Роланд Кун

3Allen J.Effective Akka. — O’Reillly Media, 2013.

Благодарности

Роланд Кун

Прежде всего благодарю Джейми, без которого я бы не решился на этот проект. Но больше всего я благодарен Йонасу Бонеру, который создал фреймворк Akka и позволял мне заботиться о его развитии на протяжении многих лет, поддерживая на всех этапах этого пути. Я также глубоко признателен Виктору Кленгу за бесчисленные и бескомпромиссные дискуссии обо всем на свете, включая распределенные системы, и, что более важно, за то, что научил меня подавать пример и показал, что дьявол кроется в деталях. Йонас, Виктор и Патрик Нордуол заслуживают особой благодарности за то, что взяли на себя мои обязанности технического руководителя Akka, пока я находился в небольшом трехмесячном творческом отпуске, чтобы как следует поработать над этой книгой. Я высоко ценю то, что Брайан и Джейми сами вызвались и предложили помочь с таким масштабным проектом: работать вместе с товарищами, на которых всегда можно положиться, приятно и вдохновляюще.

Спасибо Шону Уолшу за полезные отзывы о ранней версии рукописи, а также Дункану Девору и Берту Бейтсу, которые помогли сформировать общую структуру описания шаблонов. Я также благодарен Эндре Варге, приложившему значительные усилия к разработке упражнения с KVStore для «Принципов реактивного программирования», которое послужило основой для примеров репликации состояния в главе 13. Спасибо и Пабло Медине за то, что помог мне с кодом примера CKite в разделе 13.2, и Томасу Локни, корректору, который зорко выискивал ошибки. Не пожалели своего времени рецензенты Джоэль Котарски, Валентин Синицын, Марк Элстон, Мигель Эдуардо Жиль Биро, Уильям И. Уилер, Джонатан Фримен, Франко Булгарелли, Брайан Гилберт, Карлос Куротто, Энди Хикс, Уильям Чен, Яцек Сокульски, доктор Кристиан Бридж-Харрингтон, Сатадру Рой, Ричард Йеппс, Сорбо Бахчи, Ненко Табаков, Мартин Анлоф, Коля Думманн, Гордон Фисхе, Себастьян Бойсвер и Хенрик Левборг. Я благодарен сообществу Akka, плодотворная работа которого позволила нам разобраться в распределенных системах.

Я хочу поблагодарить команду издательства Manning, сделавшую возможным появление этой книги, особенно Майка Стивенса за то, что надоедал мне, пока я не сдался, Дженни Стоут, убеждавшую меня продолжать, и Кэндис Гиллхули из рекламного отдела. Хотел бы отметить Бена Ковитца, крайне внимательного и скрупулезного литературного редактора. Также спасибо Тиффани Тейлор за удаление из готового текста еще большего количества лишних слов и Кэти Теннант за обнаружение и исправление непонятных пассажей.

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

Джейми Аллен

Я хочу поблагодарить свою жену Ен и детей Софи, Лайлу и Джеймса. А также признателен Роланду за то, что он позволил мне поучаствовать в этом проекте, и Брайану — за его знания и за то, что довел проект до логического завершения.

Брайан Ханафи

Спасибо моей жене Пэтти за постоянную поддержку и дочерям Ивонн и Барбаре за то, что помогли мне разобраться с историей «Доктора Кто» и иногда притворялись, что мои шутки смешны. Спасибо Сюзан Конант и Берту Бейтсу за помощь на первых порах и за то, что научили меня, как редактировать и преподавать в книжном формате. Наконец, я благодарю Роланда и Джейми, которые познакомили меня с реактивными принципами и пригласили присоединиться к проекту.

Об этой книге

Эта книга задумывалась как исчерпывающее руководство по реактивным системам, которое поможет понимать и проектировать их. Поэтому в ней обсуждаются не только сам манифест реактивного программирования, но и причины, которые привели к его появлению. Основная часть книги представляет собой собрание шаб­лонов проектирования, которые олицетворяют множество аспектов реактивной архитектуры. При этом даются отсылки на углубленный материал для дальнейшего изучения. И хотя представленные шаблоны составляют единое целое, их перечень не полон — он и не может быт быть таковым. Однако общие сведения, содержащиеся в книге, позволят читателю определять, вычленять и развивать новые шаблоны, если это потребуется.

Для кого эта книга

Эта книга создавалась для всех, кто заинтересован в реализации реактивных систем.

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

• Практикующие программисты оценят подробное обсуждение задач, которые решает каждый из шаблонов, шагов по их применению (проиллюстрированных полным исходным кодом) и инструкций по переносу и адаптации шаблона к разным сценариям.

• Студенты, желающие углубить свои знания (например, после просмотра курса лекций по принципам реактивного программирования), смогут ознакомиться с тем, как выводились реактивные принципы, и продолжить изучение, воспользовавшись отсылками к другой литературе.

Эта книга не требует предварительного знакомства с реактивными системами, она опирается на хорошо известные общие принципы разработки и ссылается на опыт решения тех или иных проблем, свойственных распределенным приложениям. В некоторых случаях вам может пригодиться базовое понимание функционального программирования — той его части, которая связана с не­изменяемыми значениями и чистыми функциями, но теорию категорий мы обошли стороной.

Как читать книгу

Материал книги подобран таким образом, что ее можно читать от первой до последней страницы как связное повествование, которое начинается с вводного примера и краткого обзора манифеста реактивного программирования и соответствующих инструментов, объясняет философию, стоящую за реактивными принципами, и достигает кульминации при описании шаблонов, относящихся к различным аспектам проектирования реактивных систем. Это длинный путь, на протяжении которого вам будут встречаться отсылки к источникам, содержащим дополнительную информацию. Чтение книги за один присест наделит вас интуицией относительно изложенного в ней материала и способностью в нем ориентироваться, но, скорее всего, это будет лишь вводный этап для дальнейшего изучения. Начав применять полученные знания в собственных проектах, вы вернетесь к этим страницам, чтобы глубже понять изученное.

Если вы уже знакомы с проблемными аспектами реактивных систем, можете пропустить главу 1 и пролистать главу 3, посвященную инструментам реактивного программирования, так как, скорее всего, уже имели дело с большинством из них. У нетерпеливых читателей может возникнуть соблазн начать сразу с части III, но мы рекомендуем сначала взглянуть на часть II — в ней больше теории и объясняется происхождение шаблонов, поэтому отсылки на нее часто можно встретить в их описании.

Мы ожидаем, что вы вернетесь к философским главам, особенно к главам 8 и 9, когда приобретете определенный опыт проектирования и реализации реактивных систем. Не стоит переживать, если при первом чтении этот материал покажется вам не очень понятным.

Условные обозначения

Английское слово future (дословно «будущее») наполняется совсем другим смыслом, если его использовать в качестве одной из концепций программирования. В связи с этим во всем мире его пишут с большой буквы (Future), даже если оно не выделяется как код.

С термином «актор» (ударение на первый слог) все немного иначе. В английском языке actor может обозначать как актера на сцене, так и человека, участвующего в каком-то действии или процессе. В русскоязычной технической литературе его принято писать с маленькой буквы, если речь идет о модели акторов, или с большой (Actor), если оно является частью кода.

Исходный код для примеров

Исходный код всех примеров, которые используются в этой книге, доступен для загрузки на сайте GitHub по адресу github.com/ReactiveDesignPatterns/CodeSamples/.

GitHub также позволяет обсуждать код и указывать на имеющиеся в нем проблемы — пожалуйста, воспользуйтесь этими возможностями. Вы также можете предлагать свои идеи по улучшению программного кода, чтобы ваши опыт и внимательность могли принести пользу и другим читателям.

Большинство примеров написаны на Java или Scala, и в них применяется утилита sbt для описания процесса сборки (подробную документацию можно найти на сайте www.scala-sbt.org). Для сборки и запуска демонстрационных программ вам потребуется пакет разработки Java с поддержкой Java 8.

Краткий обзор представленных здесь шаблонов, а также углубленный материал доступны по адресу www.reactivedesignpatterns.org.

Об авторах

Роланд Кун изучал физику в Мюнхенском техническом университете, где получил докторскую степень. Он защитил диссертацию по измерению глюонной спиновой структуры нуклона в рамках исследования высокоэнергетических частиц в ЦЕРН (Женева, Швейцария). Для этого эксперимента ему пришлось построить и задействовать большие вычислительные кластеры с быстрой обработкой данных по сети, что заложило основу глубокого понимания им распределенных вычислений. После этого он четыре года работал в немецком центре астронавтики, создавая панели управления и наземную инфраструктуру для запуска военных спутников, а затем перешел в компанию Lightbend (бывшая Typesafe), где с ноября 2012 года по март 2016-го возглавлял команду Akka. Одновременно с этим совместно с Мартином Одерски и Эриком Мейером вел курс лекций по принципам реактивного программирования на платформе Coursera, который прослушали более 120 000 студентов. В соавторстве с Йонасом Бонером создал первую версию манифеста реактивного программирования, которая была опубликована в июне 2013 года. В настоящий момент Роланд является техническим директором и одним из создателей мюнхенской компании Actyx, которая занимается внедрением современных реактивных систем для мелких и средних предприятий по всей Европе.

Брайан Ханафи получил степень бакалавра естественных наук в Калифорнийском университете, Беркли. Он работает архитектором ключевых систем в Wells Fargo Bank и отвечает за разработку систем онлайн-банкинга и интернет-платежей, постоянно ратуя за использование самых современных технологий. До этого он был сотрудником Oracle и занимался новыми и перспективными продуктами и системами интерактивного телевидения и обработки текста. Свое первое электронное письмо он отправил в 1994 году, находясь за рулем автомобиля. До этого Брайан был партнером в фирмах Booz, Allen & Hamilton и Advanced Decision Systems, где применял технологии искусственного интеллекта при создании военных систем планирования. Он также является автором программного обеспечения для одной из первых систем отображения информации, встраиваемых в шлем пилота.

Джейми Аллен работает в Starbucks в качестве главного инженера проекта UCP, который призван полностью изменить цифровое взаимодействие всех клиентов компании со всеми моделями управления в каждой отдельной кофейне. Джейми — автор книги Effective Akka (O’Reilly, 2013). Ранее на протяжении более чем четырех лет он работал вместе с Роландом и Йонасом в Typesafe/Lightbend. С 2008 года занимается разработкой языка Scala и модели акторов, помогая множеству клиентов по всему миру понять и перенять реактивные подходы к созданию приложений.

Часть I. Основные сведения

Задумывались ли вы когда-нибудь о том, как реализованы всем известные веб-приложения? У социальных сетей и огромных торговых сайтов должен быть какой-то секретный ингредиент, благодаря которому они быстро и надежно работают, но в чем он заключается? Из этой книги вы узнаете о принципах и шаблонах проектирования, лежащих в основе систем, которые никогда не отказывают и способны обслуживать потребности миллиардов людей. И хотя системы, которые вы разрабатываете, возможно, не столь амбициозны, от них ожидают тех же качеств.

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

• Вы хотите, чтобы оно продолжало работать с увеличением количества пользователей и чтобы у вас была возможность добавлять и убавлять ресурсы, регулируя его производительность в соответствии с колеблющимся спросом (точный расчет будущей производительности сродни гаданию на кофейной гуще).

В главе 1 мы очертим процесс разработки приложения, демонстрирующего подобные качества (и не только). Мы проиллюстрируем проблемы, с которыми вы будете сталкиваться, и представим решения, основанные на конкретном примере — гипотетической реализации сервиса Gmail, но при этом не станем полагаться на какие-то отдельные технологии.

Данный пример является подготовкой к подробному обсуждению манифеста реактивного программирования (см. главу 2). Этот манифест выполнен в лаконичном, обобщенном виде, что позволяет сосредоточиться на его сути: определенных полезных свойствах программы, которые вместе представляют собой нечто большее, чем просто сумму отдельных характеристик. Мы продемонстрируем это, разбивая высокоуровневые свойства на более мелкие фрагменты и объясняя, как их можно вновь собрать.

Эту часть книги мы завершим главой 3, сделав краткий обзор необходимых инструментов: функционального программирования, моделей Future и Promise, взаимодействия последовательных процессов (Communicating Sequential Processes, CSP), шаблонов observer и observable (библиотека Reactive Extensions) и модели акторов.