Kafka в действии
Покупка
Тематика:
Программирование на Java
Издательство:
ДМК Пресс
Перевод:
Киселев Артём Николаевич
Год издания: 2022
Кол-во страниц: 310
Дополнительно
Вид издания:
Практическое пособие
Уровень образования:
Дополнительное образование
ISBN: 978-5-93700-118-4
Артикул: 817214.01.99
Это практическое руководство показывает, как использовать распределенную потоковую платформу Apache Kafka для удовлетворения различных бизнес-требований. Рассказывается, как устроена Kafka и где она может пригодиться на практике; описываются характеристики проектов, в которых может пригодиться эта платформа. Рассматриваются основные ее компоненты — клиенты и кластер, представлены варианты улучшения работающего кластера.
Книга адресована разработчикам, желающим ознакомиться с идеей потоковой обработки данных. Для изучения примеров кода понадобятся базовые знания командной строки; желательно иметь навыки программирования на языке Java.
- Полная коллекция по информатике и вычислительной технике
- ДМК Пресс. Информационные системы и технологии
- ДМК Пресс. ИТ-технологии для профессионалов
- Интермедиатор. Информационные системы и технологии (сводная)
- Интермедиатор. ИТ-технологии для профессионалов (сводная)
- Программирование
- Программирование на Java
Тематика:
ББК:
УДК:
ОКСО:
- ВО - Бакалавриат
- 09.03.01: Информатика и вычислительная техника
- 09.03.02: Информационные системы и технологии
- 09.03.04: Программная инженерия
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов.
Для полноценной работы с документом, пожалуйста, перейдите в
ридер.
Дилан Скотт, Виктор Гамов, Дейв Клейн Предисловие Юна Рао Kafka в действии
Kafka in Action DYLAN SCOTT VIKTOR GAMOV AND DAVE KLEIN FOREWORD BY JUN RAO
Kafka в действии ДИЛАН СКОТТ ВИКТОР ГАМОВ ДЕЙВ КЛЕЙН ПРЕДИСЛОВИЕ ЮНА РАО Москва, 2022
УДК 004.42 ББК 32.973 С44 Дилан Скотт, Виктор Гамов, Дейв Клейн С44 Kafka в действии / пер. с англ. А. Н. Киселева. – М.: ДМК Пресс, 2022. – 310 с.: ил. ISBN 978-5-93700-118-4 Это практическое руководство показывает, как использовать распределенную потоковую платформу Apache Kafka для удовлетворения различных бизнес-требований. Рассказывается, как устроена Kafka и где она может пригодиться на практике; описываются характеристики проектов, в которых может пригодиться эта платформа. Рассматриваются основные ее компоненты – клиенты и кластер, представлены варианты улучшения работающего кластера. Книга адресована разработчикам, желающим ознакомиться с идеей потоковой обработки данных. Для изучения примеров кода понадобятся базовые знания командной строки; желательно иметь навыки программирования на языке Java. УДК 004.42 ББК 32.973 Original English language edition published by Manning Publications, USA. Russian-language edition copyright (c) 2022 by DMK Press. All rights reserved. Все права защищены. Любая часть этой книги не может быть воспроизведена в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. © 2022 by Manning Publications Co. © Оформление, издание, перевод, ДМК Пресс, 2022 ISBN (анг.) 978-1-61729-523-2 ISBN (рус.) 978-5-93700-118-4
Дилан: Я посвящаю эту работу Харпер, которой я так горжусь, и Ноэль, каждый день доставляющей радость нашей семье. Я также хотел бы посвятить эту книгу своим родителям, сестре и супруге, которые всегда оказывали мне всяческую поддержку. Виктор: Эту работу я посвящаю своей супруге Марии за ее поддержку в процессе работы над этой книгой. Мне пришлось решать сложную задачу, выкраивая время то для того, то для другого. Без твоей поддержки у меня ничего бы не получилось. Я тебя люблю. Кроме того, хочу посвятить эту книгу (и выразить благодарность) моим детям, Эндрю и Майклу, за то, что они такие простодушные и прямолинейные. Когда люди спрашивают их, где работает папа, они отвечают: «Папа работает в Kafka». Дейв: Я посвящаю эту книгу своей супруге Дебби и нашим детям Захарии, Эбигейл, Бенджамину, Саре, Соломону, Ханне, Джоанне, Ребекке, Сюзанне, Ною, Самюэлю, Гидеону, Джошуа и Даниэлю. И наконец, все, что я делаю, я делаю во славу Творца и Спасителя нашего, Иисуса Христа.
Краткое оглавление 1 Введение в Kafka ................................................................... 26 2 Знакомство с Kafka ............................................................. 44 3 Разработка проекта на основе Kafka ............................. 75 4 Производители: источники данных ............................. 103 5 Потребители: извлечение данных ................................ 127 6 Брокеры ................................................................................. 155 7 Темы и разделы .................................................................... 176 8 Kafka как хранилище ......................................................... 193 9 Управление: инструменты и журналы ....................... 211 10 Защита Kafka ..................................................................... 236 11 Реестр схем .......................................................................... 256 12 Потоковая обработка с помощью Kafka Streams и ksqlDB ................................................................................. 270
Содержание Предисловие от издательства ................................................. 13 Предисловие ............................................................................ 14 Вступление ..............................................................................15 Благодарности ........................................................................ 16 Об этой книге .......................................................................... 18 Об авторах .............................................................................. 22 Об иллюстрации на обложке ................................................... 23 ЧАСТЬ I. НАЧАЛО ............................................................. 25 1 Введение в Kafka ............................................................. 26 1.1. Что такое Kafka? .......................................................................... 27 1.2. Использование Kafka .................................................................. 32 1.2.1. Kafka – разработчикам ..................................................... 32 1.2.2. Как преподнести Kafka вашему руководству ................ 34 1.3. Мифы о Kafka .............................................................................. 35 1.3.1. Kafka работает только с Hadoop® .................................. 35 1.3.2. Kafka ничем не отличается от других брокеров сообщений ....................................................................................... 36 1.4. Kafka в реальном мире ............................................................... 37 1.4.1. Ранние примеры................................................................ 37 1.4.2. Более поздние примеры .................................................. 39 1.4.3. Когда Kafka может быть неприменима .......................... 40 1.5. Онлайн-ресурсы .......................................................................... 41 Итоги ................................................................................................... 42 Ссылки ................................................................................................. 42 2 Знакомство с Kafka ........................................................ 44 2.1. Отправка и прием сообщения .................................................. 45 2.2. Что такое брокер? ....................................................................... 46 2.3. Экскурсия по Kafka ..................................................................... 51 2.3.1. Производители и потребители ...................................... 51 2.3.2. Темы .................................................................................... 55
2.3.3. ZooKeeper ........................................................................... 56 2.3.4. Высокоуровневая архитектура Kafka ............................. 58 2.3.5. Журнал коммитов ............................................................. 59 2.4. Различные пакеты исходного кода, и что они делают ......... 60 2.4.1. Kafka Streams ...................................................................... 60 2.4.2. Kafka Connect ..................................................................... 62 2.4.3. Пакет AdminClient ............................................................ 62 2.4.4. ksqlDB .................................................................................. 63 2.5. Клиенты Confluent ..................................................................... 63 2.6. Потоковая обработка и терминология ................................... 67 2.6.1. Потоковая обработка ....................................................... 69 2.6.2. Что означает семантика «точно один раз» ................... 69 Итоги ................................................................................................... 70 Ссылки ................................................................................................. 70 ЧАСТЬ II. ПРАКТИЧЕСКОЕ ПРИМЕНЕНИЕ KAFKA ....73 3 Разработка проекта на основе Kafka ..............................75 3.1. Разработка проекта на основе Kafka ........................................ 76 3.1.1. Использование существующей архитектуры данных ...............................................................................76 3.1.2. Первый шаг ........................................................................ 76 3.1.3. Встроенные возможности ............................................... 77 3.1.4. Данные для наших накладных ........................................ 80 3.2. События датчиков....................................................................... 82 3.2.1. Имеющиеся проблемы ..................................................... 82 3.2.2. Почему Kafka – правильный выбор ................................ 85 3.2.3. Первые мысли об архитектуре ....................................... 86 3.2.4. Требования к пользовательским данным ...................... 88 3.2.5. Общий план с учетом поставленных вопросов ............ 88 3.2.6. Обзор и оценка плана ....................................................... 92 3.3. Формат представления данных ................................................ 93 3.3.1. План для данных ............................................................... 93 3.3.2. Настройка зависимостей ................................................. 95 Итоги ................................................................................................. 101 Ссылки ............................................................................................... 101 4 Производители: источники данных .............................. 103 4.1. Пример ....................................................................................... 104 4.1.1. Примечания в отношении производителя ................. 107 4.2. Параметры производителя ..................................................... 108 4.2.1. Настройка списка брокеров .......................................... 109 Содержание 8
4.2.2. Быстрее или надежнее? .................................................. 110 4.2.3. Отметки времени ............................................................ 113 4.3. Генерирование кода с учетом наших требований................ 115 4.3.1. Версии клиентов и брокеров ........................................ 124 Итоги ................................................................................................. 125 Ссылки ............................................................................................... 125 5 Потребители: извлечение данных ................................. 127 5.1. Пример ....................................................................................... 128 5.1.1. Параметры потребителя ................................................ 129 5.1.2. Наши координаты в потоке событий .......................... 133 5.2. Как взаимодействуют потребители ....................................... 137 5.3. Трассировка ............................................................................... 138 5.3.1. Координатор группы ...................................................... 139 5.3.2. Стратегия назначения разделов ................................... 141 5.4. Маркировка местонахождения ............................................... 142 5.5. Чтение из сжатой темы ............................................................ 145 5.6. Реализация в коде наших заводских требований ................ 145 5.6.1. Варианты чтения ............................................................ 146 5.6.2. Требования ....................................................................... 148 Итоги ................................................................................................. 151 Ссылки ............................................................................................... 151 6 Брокеры ....................................................................... 155 6.1. Знакомство с брокерами .......................................................... 155 6.2. Роль ZooKeeper.......................................................................... 156 6.3. Конфигурационные параметры брокеров ........................... 158 6.3.1. Другие журналы Kafka: журналы приложений ........... 160 6.3.2. Журнал сервера ............................................................... 160 6.3.3. Управление состоянием ................................................. 160 6.4. Ведущие реплики разделов и их роль .................................... 162 6.4.1. Потеря данных ................................................................ 164 6.5. Взгляд внутрь Kafka ................................................................... 165 6.5.1. Обслуживание кластера ................................................. 167 6.5.2. Добавление брокера ....................................................... 167 6.5.3. Обновление кластера ..................................................... 167 6.5.4. Обновление клиентов .................................................... 168 6.5.5. Резервные копии ............................................................. 168 6.6. Примечание о системах с сохранением состояния............. 169 6.7. Упражнение ............................................................................... 171 Итоги ................................................................................................. 172 Ссылки ............................................................................................... 173 Содержание 9
Темы и разделы ............................................................. 176 7.1. Темы ............................................................................................ 176 7.1.1. Параметры создания темы ............................................ 180 7.1.2. Коэффициенты репликации ......................................... 182 7.2. Разделы ....................................................................................... 183 7.2.1. Размещение раздела ........................................................ 183 7.2.2. Просмотр журналов ........................................................ 184 7.3. Тестирование с помощью EmbeddedKafkaCluster ............... 186 7.3.1. Использование Kafka Testcontainers ............................ 188 7.4. Сжатые темы .............................................................................. 188 Итоги ................................................................................................. 191 Ссылки ............................................................................................... 191 8 Kafka как хранилище .................................................... 193 8.1. Как долго можно хранить данные .......................................... 194 8.2. Перемещение данных .............................................................. 195 8.2.1. Сохранение исходных событий ................................... 195 8.2.2. Отказ от пакетного мышления ..................................... 196 8.3. Инструменты ............................................................................. 196 8.3.1. Apache Flume ................................................................... 197 8.3.2. Red Hat® Debezium™ ..................................................... 199 8.3.3. Secor .................................................................................. 200 8.3.4. Пример сохранения данных ......................................... 201 8.4. Возврат данных в Kafka ............................................................ 201 8.4.1. Многоуровневое хранилище ......................................... 203 8.5. Архитектуры с использованием Kafka ................................... 203 8.5.1. Лямбда-архитектура ........................................................ 203 8.5.2. Каппа-архитектура .......................................................... 205 8.6. Окружения с несколькими кластерами ................................. 206 8.6.1. Масштабирование путем добавления кластеров ....... 206 8.7. Варианты хранения в облаке и в контейнерах .................... 207 8.7.1. Кластеры Kubernetes ...................................................... 207 Итоги ................................................................................................. 208 Ссылки ............................................................................................... 208 9 Управление: инструменты и журналы .......................... 211 9.1. Клиенты администрирования ................................................ 212 9.1.1. Решение задач администрирования в коде с помощью AdminClient ................................................. 212 9.1.2. kcat ..................................................................................... 214 9.1.3. Confluent REST Proxy API .............................................. 216 Содержание 10
9.2. Запуск Kafka как службы systemd ............................................ 217 9.3. Журналы ..................................................................................... 218 9.3.1. Журналы приложений Kafka ......................................... 219 9.3.2. Журналы ZooKeeper ....................................................... 220 9.4. Брандмауэры .............................................................................. 221 9.4.1. Публикуемые слушатели ................................................ 221 9.5. Метрики...................................................................................... 222 9.5.1. Консоль JMX .................................................................... 222 9.6. Способы трассировки .............................................................. 225 9.6.1. Логика на стороне производителя ............................... 226 9.6.2. Логика на стороне потребителя ................................... 228 9.6.3. Переопределение клиентов .......................................... 230 9.7. Общие инструменты мониторинга ........................................ 231 Итоги ................................................................................................. 232 Ссылки ............................................................................................... 232 ЧАСТЬ III. ДОПОЛНИТЕЛЬНЫЕ ВОЗМОЖНОСТИ ... 235 10 Защита Kafka .............................................................. 236 10.1. Основы безопасности ............................................................ 238 10.1.1. Шифрование с помощью SSL ...................................... 239 10.1.2. Настройка соединений SSL между брокерами и клиентами ............................................................................... 240 10.1.3. Настройка соединений SSL между брокерами ......... 244 10.2. Kerberos и Simple Authentication and Security Layer (SASL) ........................................................ 244 10.3. Авторизация в Kafka ............................................................... 245 10.3.1. Списки управления доступом ...................................... 246 10.3.2. Управление доступом на основе ролей...................... 247 10.4. ZooKeeper ................................................................................. 248 10.4.1. Настройка Kerberos ...................................................... 248 10.5. Квоты ........................................................................................ 249 10.5.1. Ограничение пропускной способности сети ........... 250 10.5.2. Ограничение частоты запросов ................................. 252 10.6. Данные в состоянии покоя .................................................... 252 10.6.1. Управляемые варианты ................................................ 253 Итоги ................................................................................................. 253 Ссылки ............................................................................................... 254 11 Реестр схем .................................................................. 256 11.1. Предлагаемая модель зрелости Kafka .................................. 257 11.1.1. Уровень 0 ........................................................................ 257 Содержание 11
11.1.2. Уровень 1 ........................................................................ 258 11.1.3. Уровень 2 ........................................................................ 259 11.1.4. Уровень 3 ........................................................................ 259 11.2. Реестр схем .............................................................................. 260 11.2.1. Установка Confluent Schema Registry ......................... 260 11.2.2. Конфигурация реестра ................................................ 261 11.3. Компоненты реестра схем ..................................................... 262 11.3.1. REST API ......................................................................... 262 11.3.2. Клиентская библиотека ............................................... 263 11.4. Правила совместимости ........................................................ 265 11.4.1. Проверка изменений схемы ........................................ 266 11.5. Альтернатива реестру схем ................................................... 267 Итоги ................................................................................................. 268 Ссылки ............................................................................................... 268 12 Потоковая обработка с помощью Kafka Streams и ksqlDB ....................................................................... 270 12.1. Kafka Streams ............................................................................ 271 12.1.1. KStreams API DSL .......................................................... 273 12.1.2. KTable API ....................................................................... 277 12.1.3. GlobalKTable API ........................................................... 278 12.1.4. Processor API .................................................................. 279 12.1.5. Настройка Kafka Streams .............................................. 281 12.2. ksqlDB: база данных потоковой передачи событий .......... 282 12.2.1. Запросы .......................................................................... 284 12.2.2. Локальная разработка .................................................. 284 12.2.3. Архитектура ksqlDB ...................................................... 286 12.3. Куда пойти дальше .................................................................. 287 12.3.1. Предложения по улучшению Kafka (KIP) ................. 287 12.3.2. Проекты Kafka, которые вы можете исследовать ... 288 12.3.3. Каналы сообщества Slack ............................................. 288 Итоги ................................................................................................. 288 Ссылки ............................................................................................... 289 Приложение A. Установка ..................................................... 290 Приложение B. Пример клиента ........................................... 299 Предметный указатель ......................................................... 304 Содержание 12
Предисловие от издательства Отзывы и пожелания Мы всегда рады отзывам наших читателей. Расскажите нам, что вы думаете об этой книге, – что понравилось или, может быть, не понравилось. Отзывы важны для нас, чтобы выпускать книги, которые будут для вас максимально полезны. Вы можете написать отзыв на нашем сайте www.dmkpress.com, зайдя на страницу книги и оставив комментарий в разделе «Отзывы и рецензии». Также можно послать письмо главному редактору по адресу dmkpress@gmail.com; при этом укажите название книги в теме письма. Если вы являетесь экспертом в какой-либо области и заинтересованы в написании новой книги, заполните форму на нашем сайте по адресу http://dmkpress.com/authors/publish_book/ или напишите в издательство по адресу dmkpress@gmail.com. Список опечаток Хотя мы приняли все возможные меры для того, чтобы обеспечить высокое качество наших текстов, ошибки все равно случаются. Если вы найдете ошибку в одной из наших книг – возможно, ошибку в основном тексте или программном коде, – мы будем очень благодарны, если вы сообщите нам о ней. Сделав это, вы избавите других читателей от недопонимания и поможете нам улучшить последующие издания этой книги. Если вы найдете какие-либо ошибки в коде, пожалуйста, сообщите о них главному редактору по адресу dmkpress@gmail.com, и мы исправим это в следующих тиражах. Нарушение авторских прав Пиратство в интернете по-прежнему остается насущной проблемой. Издательство «ДМК Пресс» очень серьезно относится к вопросам защиты авторских прав и лицензирования. Если вы столкнетесь в интернете с незаконной публикацией какой-либо из наших книг, пожалуйста, пришлите нам ссылку на интернет-ресурс, чтобы мы могли применить санкции. Ссылку на подозрительные материалы можно прислать по адресу dmkpress@gmail.com. Мы высоко ценим любую помощь по защите наших авторов, благодаря которой мы можем предоставлять вам качественные материалы.
Предисловие Начиная с первого выпуска, вышедшего в 2011 году, технологии Apache Kafka® помогли создать новую категорию систем передачи данных, и теперь они являются основой бесчисленного множества современных приложений, управляемых событиями. В своей книге «Kafka в действии» Дилан Скотт (Dylan Scott), Виктор Гамов (Viktor Gamov) и Дейв Клейн (Dave Klein) делятся навыками проектирования и реализации приложений на основе событий, реализованных с использованием Apache Kafka. Авторы имеют богатый опыт работы с Kafka в реальном мире, что выделяет эту книгу среди других. Давайте на минутку зададимся вопросом: «Зачем вообще нужна платформа Kafka?» Исторически сложилось так, что большинство приложений были основаны на системах хранения данных. Когда в мире происходили какие-то интересные события, они немедленно сохранялись в этих системах, но реакция на эти события происходила позже – либо когда пользователь явно запрашивал информацию, либо в ходе выполнения некоторых заданий пакетной обработки. В системах передачи данных приложения строятся путем предварительного определения того, что они должны делать при появлении новых событий. Когда случаются новые события, приложения автоматически реагируют на них практически мгновенно. Такие приложения, управляемые событиями, привлекательны тем, что позволяют предприятиям гораздо быстрее извлекать новую информацию из своих данных. Однако переход к приложениям, управляемым событиями, требует изменения мышления, что не всегда легко. Эта книга предлагает исчерпывающее описание событийно-ориентированного мышления, а также реалистичные практические примеры, которые вы сможете опробовать. «Kafka в действии» объясняет, как работает Kafka, и особое внимание уделяет созданию комплексных приложений, управляемых событиями, на основе Kafka. Здесь вы познакомитесь с компонентами, необходимыми для создания простого приложения Kafka, а также узнаете, как создавать сложные приложения с использованием таких библиотек, как Kafka Streams и ksqlDB. Также в этой книге рассказывается, как после создания приложения развернуть его в промышленном окружении, и освещаются такие ключевые темы, как мониторинг и безопасность. Я надеюсь, что вам понравится эта книга так же, как мне. Удачной передачи событий! – Юн Рао (Jun Rao), соучредитель Confluent
Вступление Один из вопросов, который часто задают нам, когда мы рассказываем о работе над технической книгой: почему был выбран именно формат печатной книги? Дилан, например, всегда предпочитал узнавать что-то новое, читая книги. Другой фактор – ностальгия, навеваемая воспоминаниями о первой технической книге по программированию, которую он прочитал, «Elements of Programming with Perl» Эндрю Л. Джонсона (Andrew L. Johnson), выпущенной издательством Manning в 2000 году. Эта книга особенно запомнилась ему, и он до сих пор вспоминает, насколько приятно было читать ее страницы. Мы надеемся доставить такое же удовольствие своим читателям, описывая Apache Kafka. Предвкушение познания чего-то нового почувствовал каждый из нас, когда мы впервые начали работать с Kafka. На наш взгляд, Kaf- ka существенно отличается от любых других брокеров сообщений или шин служб предприятия (Enterprise Service Bus, ESB), которые нам доводилось использовать раньше. Быстрота разработки производителей и потребителей сообщений, возможность повторной обработки данных и скорость, с которой независимые потребители перемещаются без удаления данных из других потребительских приложений, позволяют решать проблемы, встречавшиеся в прошлом, и впечатлили нас больше всего, когда мы стали изучать возможность применения Kafka. Мы видим, что Kafka меняет стандарты для платформ данных; она способна помочь перенести пакетные рабочие процессы и рабочие процессы извлечения, преобразования и загрузки (Extract, Trans- form, Load, ETL) ближе во времени к потокам данных. Поскольку эта платформа отходит от архитектур обработки данных, использовавшихся раньше и известных многим корпоративным пользователям, мы хотели помочь пользователям, не знакомым с Kafka, научиться работать с производителями и потребителями Kafka, а также решать базовые задачи разработки и администрирования Kafka. Мы надеемся, что к концу этой книги вы почувствуете в себе готовность углубиться в исследование более сложных тем Kafka, таких как мониторинг кластеров, создание метрик и межсайтовая репликация данных. Всегда помните, что эта книга запечатлела момент, как Кафка выглядит сегодня. Она почти наверняка будет меняться и, надеюсь, станет еще лучше к тому времени, когда вы будете читать эту работу. Мы верим, что эта книга направит вас на увлекательный путь изучения основ Apache Kafka.
Благодарности Дилан. Прежде всего я хотел бы поблагодарить мою семью. Спасибо вам! Я никогда не устану благодарить за поддержку и любовь, которые вижу каждый день. Я люблю вас всех! Дэн и Дебби, я высоко ценю, что вы всегда были моими самыми преданными сторонниками и фанатами. Сара, Харпер и Ноэль, я не смогу на словах передать всю любовь и гордость, которую испытываю ко всем вам, и благодарность за поддержку, которую вы мне оказываете. Спасибо семье DG, что всегда были рядом со мной. Спасибо и вам, JC. Также отдельное спасибо Виктору Гамову и Дейву Клейну, что были соавторами этой книги! В продвижении этого проекта мне также помогали мои друзья и коллеги по работе, которых я должен упомянуть: команда Team Serenity (Бекки Кэмпбелл (Becky Campbell), Адам Доман (Adam Doman), Джейсон Фер (Jason Fehr) и Дэн Рассел (Dan Russell)), Роберт Абейта (Robert Abeyta) и Джереми Кастл (Jeremy Castle). Спасибо также, Джабулани Симплизио Чибайя (Jabulani Sim- plisio Chibaya), не только за рецензию, но и за добрые слова. Виктор. Я хотел бы сказать огромное спасибо моей супруге и поблагодарить ее за поддержку. Спасибо также членам команды по связям с разработчиками и сообщества Confluent: Але Мюррей (Ale Murray), Еве Байзек (Yeva Byzek), Робину Моффатт (Robin Moffatt) и Тиму Берглунд (Tim Berglund). Вы все так много делаете для сообщества Apache Kafka! Дейв. Я хотел бы поблагодарить Дилана и Виктора за то, что позволили мне поучаствовать в этом захватывающем путешествии. Все вместе мы благодарим нашего редактора в Manning – Тони Арритола (Toni Arritola), чей опыт и наставничество помогли сделать эту книгу реальностью. Мы также выражаем благодарность Кристен Уоттерсон (Kristen Watterson), которая была нашим первым редактором до того, как на смену ей пришел Тони, нашим техническим редакторам Рафаэлю Вильеле (Raphael Villela), Ники Бакнер (Nickie Buckner), Фелипе Эстебану Вильдосо Кастильо (Felipe Esteban Vildoso Castillo), Маюру Патилу (Mayur Patil), Валентину Креттазу (Valentin Crettaz) и Уильяму Руденмальму (William Rudenmalm). Мы благодарим Чака Ларсона (Chuck Larson) за огромную помощь с графикой и Суманта Тамбе (Sumant Tambe) за техническую корректировку кода. Сотрудники издательства Manning оказывали всемерную помощь по самым разным вопросам, от производства до продвижения, – это