<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>Yuriy Gavrilov: posts tagged Kafka</title>
<link>https://gavrilov.info/tags/kafka/</link>
<description>Welcome to my personal place for love, peace and happiness 🤖 Yuiry Gavrilov</description>
<author></author>
<language>en</language>
<generator>Aegea 11.4 (v4171e)</generator>

<itunes:owner>
<itunes:name></itunes:name>
<itunes:email>yvgavrilov@gmail.com</itunes:email>
</itunes:owner>
<itunes:subtitle>Welcome to my personal place for love, peace and happiness 🤖 Yuiry Gavrilov</itunes:subtitle>
<itunes:image href="https://gavrilov.info/pictures/userpic/userpic-square@2x.jpg?1643451008" />
<itunes:explicit>no</itunes:explicit>

<item>
<title>Книга “I ♥ Logs” Джея Крепса</title>
<guid isPermaLink="false">259</guid>
<link>https://gavrilov.info/all/kniga-i-logs-dzheya-krepsa/</link>
<pubDate>Wed, 06 Aug 2025 00:37:25 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/kniga-i-logs-dzheya-krepsa/</comments>
<description>
&lt;h4&gt;Часть 1: Книга “I Love Logs” EVENT DATA, STREAM PROCESSING, AND DATA INTEGRATION&lt;/h4&gt;
&lt;p&gt;Джей Крепс&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-08-06-v-00.11.45.png" width="900" height="362" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Оригинал тут: &lt;a href="https://a.gavrilov.info/data/posts/I_Heart_Logs-Jay_Kreps.pdf"&gt;I_Heart_Logs-Jay_Kreps.pdf &lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;b&gt;Оригинальные идеи и рекомендации книги:&lt;/b&gt;&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Лог как фундаментальная абстракция&lt;/b&gt;:
&lt;ul&gt;
  &lt;li&gt;Ключевая идея: лог — это не просто текстовый файл для отладки, а упорядоченная, неизменяемая (append-only) последовательность записей (событий), снабженная уникальными, последовательно увеличивающимися номерами (offset’ами), которые служат “временем” в распределенной системе.&lt;/li&gt;
  &lt;li&gt;Он является “источником истины” (`source of truth`) и позволяет восстановить состояние системы.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;State Machine Replication Principle&lt;/b&gt;: Если два детерминированных процесса начинают в одном состоянии и получают одинаковые входные данные в одном и том же порядке, они произведут одинаковый вывод и закончат в одном и том же состоянии. Лог обеспечивает этот “одинаковый порядок”.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="2"&gt;
&lt;li&gt;&lt;b&gt;Роль логов в базах данных&lt;/b&gt;:
&lt;ul&gt;
  &lt;li&gt;Логи лежат в основе работы ACID-баз данных (commit log, transaction log) для обеспечения атомарности, изоляции и долговечности.&lt;/li&gt;
  &lt;li&gt;Используются для репликации данных между мастером и репликами (Change Data Capture – CDC).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="3"&gt;
&lt;li&gt;&lt;b&gt;Применения логов&lt;/b&gt;:
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;Интеграция данных (Data Integration)&lt;/b&gt;: Лог становится центральной “магистралью данных” или единой “шиной событий” для всей организации. Он решает проблему интеграции “N систем с N системами” (N²) путем преобразования ее в “N систем с одним логом” (N). Крепс приводит “Иерархию потребностей Маслоу для данных” (сбор/аквизиция данных, семантика, понимание, автоматизация), подчеркивая, что без надежного сбора данных невозможно ничего другого.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-08-06-v-00.24.03.png" width="738" height="294" alt="" /&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Организационная масштабируемость**: Ответственность за чистоту и формат данных лежит на *производителе* данных, а не на потребителях или центральной команде ETL.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Потоковая обработка в реальном времени (Real-time Stream Processing)&lt;/b&gt;: Лог — это естественное представление потока данных. Любое событие в реальном времени, база данных, изменяющаяся с течением времени, — всё это логи.&lt;/li&gt;
&lt;li&gt;Крепс выступает за &lt;b&gt;Kappa-архитектуру&lt;/b&gt; как альтернативу Lambda-архитектуре.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Критика Lambda&lt;/b&gt;: Дублирование логики (один и тот же расчет в batch и stream слоях), сложность оперирования.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Альтернативная модель репроцессинга&lt;/b&gt;: Вместо двух отдельных фреймворков (batch и stream) — использовать единую потоковую систему, которая может пересчитывать историю, используя лог как источник исторических данных. Когда логика меняется, запускается новый потоковый Job с начала лога, записывающий результат в новую таблицу, и после догона старая таблица заменяется новой.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Проектирование распределенных систем&lt;/b&gt;: Лог упрощает дизайн. Вместо того, чтобы каждая система занималась согласованностью, репликацией и восстановлением, эти функции можно передать логированию.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Паттерн “Сервис = Лог + Serving Layer”&lt;/b&gt;: Лог хранит все изменения (source of truth), а “serving layer” (например, поисковая система, key-value хранилище) строит индексированные или материализованные представления на основе лога для быстрых запросов.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start="4"&gt;
&lt;li&gt;&lt;b&gt;Технические особенности и оптимизации&lt;/b&gt;:
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;Партиционирование лога&lt;/b&gt;: Для горизонтального масштабирования (Kafka). Позволяет обрабатывать записи независимо, не требует глобального порядка. Порядок гарантируется только в пределах одной партиции.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Батчинг (Batching)&lt;/b&gt;: Соединение мелких операций в крупные для повышения пропускной способности.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Zero-Copy Data Transfer&lt;/b&gt;: Передача данных между слоями памяти без их копирования, что улучшает производительность.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Log Compaction (Компактирование лога)&lt;/b&gt;: Оптимизация хранения для “лагов изменений” (changelogs). Вместо хранения всех версий записи, оставляется только последняя версия для каждого ключа. Это позволяет восстановить *текущее* состояние, но не *всю* историю.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="5"&gt;
&lt;li&gt;&lt;b&gt;Дуальность таблиц и событий (Tables and Events Are Dual)&lt;/b&gt;:
&lt;ul&gt;
  &lt;li&gt;Крепс проводит аналогию с системами контроля версий (Git): история изменений (патчи) — это лог, а текущая рабочая копия — это таблица.&lt;/li&gt;
  &lt;li&gt;Данные могут свободно “перетекать” между состоянием (таблица) и потоком изменений (лог).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;b&gt; Стоило бы дополнить (2023-2024):&lt;/b&gt;&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Эволюция экосистемы&lt;/b&gt;:
&lt;ul&gt;
  &lt;li&gt;Книга вышла в 2014 году. С тех пор Kafka стала де-факто стандартом. Появились альтернативы &lt;a href="https://pulsar.apache.org"&gt;Apache Pulsar&lt;/a&gt; его, кстати, умеет читать и писать Seatunnel :) и множество надстроек/фреймворков (Kafka Streams, Flink SQL, Materialize).&lt;/li&gt;
  &lt;li&gt;Рост Serverless-архитектур и их интеграция с логами (AWS Lambda, Google Cloud Functions, Azure Functions как потребители логов).&lt;/li&gt;
  &lt;li&gt;Повсеместное использование Kubernetes и операторов для развертывания и управления Kafka-кластерами.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="2"&gt;
&lt;li&gt;&lt;b&gt;Управление схемами (Schema Management)&lt;/b&gt;:
&lt;ul&gt;
  &lt;li&gt;Книга упоминает структурированные логи, но не углубляется в детали. Сегодня критически важен &lt;b&gt;Schema Registry&lt;/b&gt; (например, Confluent Schema Registry или &lt;a href="http://apicur.io)"&gt;http://apicur.io)&lt;/a&gt; для обеспечения совместимости схем данных в логах и управления их версиями. Это предотвращает “data swamp” и делает логи действительно надежным источником данных.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="3"&gt;
&lt;li&gt;&lt;b&gt;Качество данных и Observability&lt;/b&gt;:
&lt;ul&gt;
  &lt;li&gt;Помимо “структуры”, важна *семантика* и *качество* данных. Мониторинг “data quality”, “data lineage” (происхождение данных) и “data governance” становятся ключевыми.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Observability&lt;/b&gt;: Трассировка событий через лог-пайплайн (например, OpenTelemetry), сбор метрик (lag потребителей, пропускная способность, ошибки) с Prometheus/Grafana.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="4"&gt;
&lt;li&gt;&lt;b&gt;Безопасность (Security)&lt;/b&gt;:
&lt;ul&gt;
  &lt;li&gt;Шифрование данных в пути (TLS) и в состоянии покоя (at-rest encryption).&lt;/li&gt;
  &lt;li&gt;Аутентификация и авторизация (RBAC) для продюсеров и потребителей Kafka.&lt;/li&gt;
  &lt;li&gt;Аудит доступа к логам.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="5"&gt;
&lt;li&gt;&lt;b&gt;Паттерны микросервисной архитектуры&lt;/b&gt;:
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;Event Sourcing&lt;/b&gt; и &lt;b&gt;CQRS&lt;/b&gt; стали стандартными паттернами.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Saga Pattern&lt;/b&gt; для координации распределенных транзакций между микросервисами, часто реализуемых через лог.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Data Mesh&lt;/b&gt;: Принцип, что данные должны рассматриваться как продукт. Команда-владелец домена отвечает за свой “дата-продукт” и предоставляет его через лог, который является частью этого “продукта”.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="6"&gt;
&lt;li&gt;&lt;b&gt;Real-time Analytics и ML&lt;/b&gt;:
&lt;ul&gt;
  &lt;li&gt;Пайплайны с логами используются для обучения и инференса ML-моделей в реальном времени. Например, логи кликов для рекомендательных систем.&lt;/li&gt;
  &lt;li&gt;Появление GPU-ускоренных фреймворков для потоковой обработки (например, NVIDIA RAPIDS).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="7"&gt;
&lt;li&gt;&lt;b&gt;Антипаттерны и ошибки&lt;/b&gt;: Конкретные примеры из практики, как неправильное внедрение логов может привести к проблемам.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;h4&gt;&lt;b&gt;Часть 2: Современный взгляд Логи: Кровеносная система Data-Driven компаний&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;Представьте себе, что данные – это жизненная сила вашей компании, а IT-инфраструктура – ее тело. Тогда логи, как это ни парадоксально, стали бы ее &lt;b&gt;кровеносной системой&lt;/b&gt;. Они несут информацию от каждой клетки к каждому органу, обеспечивая слаженность и жизнеспособность всего организма.&lt;/p&gt;
&lt;p&gt;В эпоху распределенных систем, микросервисов, Big Data и искусственного интеллекта, когда скорость обработки информации определяет конкурентное преимущество, традиционные подходы к интеграции и обработке данных трещат по швам. Книга, которая у вас в руках – это переосмысление ключевых идей Джея Крепса, соавтора Apache Kafka, о том, как “скромный” лог превратился из технической детали в центральный архитектурный примитив.&lt;/p&gt;
&lt;p&gt;Мы пройдем путь от понимания природы лога до его применения в масштабных системах, интеграции данных, потоковой обработке и построении отказоустойчивых архитектур. Эта книга не только сохранит оригинальные прозрения, но и дополнит их новейшими практиками, инструментами и опытом, накопленным IT-индустрией за последнее десятилетие. Вы узнаете, как избежать распространенных ошибок и построить по-настоящему гибкую и масштабируемую систему, где данные действительно “текут” свободно.&lt;/p&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;h4&gt;&lt;b&gt;Глава 1: Лог: Недооцененный фундамент современных систем&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;Когда речь заходит о логах, большинство инженеров представляют себе длинные текстовые файлы с отладочной информацией. Однако, как показал Джей Крепс, истинная природа лога гораздо глубже.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Что такое Лог? Глубже, чем кажется.&lt;/b&gt;&lt;br /&gt;
Представьте себе не просто текстовый файл, а &lt;b&gt;упорядоченную, неизменяемую последовательность записей&lt;/b&gt;. Каждая запись добавляется в конец. Это фундаментальное отличие от базы данных, где данные можно изменять “на месте”. В логе ни одна запись не удаляется и не меняется. Вместо этого, новые изменения *добавляются* как новые записи.&lt;/p&gt;
&lt;p&gt;Каждая запись в логе имеет уникальный, последовательно возрастающий номер, который можно считать её “временем” или “позицией” в потоке. Это ключевое свойство: оно дает нам &lt;b&gt;гарантию порядка&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Принцип State Machine Replication: Волшебство порядка&lt;/b&gt;&lt;br /&gt;
Это краеугольный камень распределенных систем. Он гласит:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;Если два идентичных, детерминированных процесса начинают в одном состоянии и получают одинаковые входные данные в одном и том же порядке, они произведут одинаковый вывод и закончат в одном и том же состоянии.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;В этом принцип “лога” критически важен: он обеспечивает “одинаковый порядок” входных данных для всех реплик. Если у вас есть лог всех изменений (событий), вы можете “воспроизвести” этот лог на разных машинах, чтобы они достигли идентичного состояния.&lt;/p&gt;
&lt;p&gt;*Пример из практики*: Банковский счет. Вместо хранения одного числа (текущий баланс), мы храним лог всех транзакций: “снятие 1000 руб.”, “поступление 5000 руб.”. Текущий баланс – это всего лишь функция, которая суммирует все записи в логе до текущего момента. Если банк “забудет” состояние баланса, он всегда может его восстановить, проиграв лог всех транзакций.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Логи в базах данных: Невидимый двигатель&lt;/b&gt;&lt;br /&gt;
Внутри любой надежной реляционной базы данных или NoSQL-хранилища уже давно работает лог: `commit log` или `transaction log`. Он гарантирует, что даже при сбое системы, транзакции не будут потеряны, а данные останутся согласованными (свойства ACID). Механизмы репликации баз данных (например, бинарные логи MySQL или WAL PostgreSQL) – это по сути потоковая передача записей из такого лога. Это и есть &lt;b&gt;Change Data Capture (CDC)&lt;/b&gt; – захват изменений данных.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Дополнение (2023-2024):&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Структурированные логи и схемы&lt;/b&gt;: Для машинного чтения и обработки логам необходим строгий формат. Сегодня это почти всегда JSON, Apache Avro или Google Protocol Buffers.
&lt;ul&gt;
  &lt;li&gt;Рекомендация&lt;b&gt;: Используйте &lt;/b&gt;Schema Registry**. Это централизованное хранилище ваших схем, которое позволяет эволюционировать схемы логов, не ломая обратную совместимость. Оно критически важно для долгосрочной жизнеспособности вашей data-инфраструктуры. Без Schema Registry ваши логи быстро превратятся в “data swamp” – болото неструктурированных, непонятных данных.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Лог как Event Stream&lt;/b&gt;: В современных архитектурах каждый чих в системе – это событие. Логи веб-сервера, действия пользователя, метрики микросервисов, изменения в БД – все это может быть представлено как лог событий.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Ошибки, которых стоит избегать:&lt;/b&gt;&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;“Лог для людей, а не для машин”&lt;/b&gt;: Если вы используете логи только для чтения человеком при отладке, вы упускаете их колоссальный потенциал как источника данных для других систем.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Отсутствие структурированности&lt;/b&gt;: Произвольные текстовые сообщения в логах делают их крайне сложными для автоматического анализа и интеграции. Всегда! используйте структурированные форматы.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Игнорирование порядка&lt;/b&gt;: Если события записываются без гарантии порядка, вы никогда не сможете надежно воспроизвести состояние системы или построить корректные агрегаты.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;h4&gt;&lt;b&gt;Глава 2: Данные как потоки: Интеграция через Логи&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;Одна из самых болезненных проблем в больших компаниях – это интеграция данных. Исторически это решалось кастомными ETL (Extract, Transform, Load) пайплайнами, где каждая система “говорила” с каждой. Такая модель приводит к экспоненциальному росту сложности (N² соединений для N систем).&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Централизованная шина событий: Революция в интеграции&lt;/b&gt;&lt;br /&gt;
Идея Крепса: вместо N² соединений, создайте универсальный централизованный лог, который будет выступать в роли “шины событий” или “артерии данных”.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Производители данных&lt;/b&gt;: Системы, генерирующие данные, публикуют их в этот центральный лог.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Потребители данных&lt;/b&gt;: Системы, которым нужны эти данные, подписываются на соответствующие части лога (топики) и потребляют их независимо, в своем темпе.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-08-06-v-00.05.12.png" width="1092" height="252" alt="" /&gt;
&lt;/div&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;```mermaid
graph LR
A[Система 1 (Продюсер)] -- Публикует --&amp;gt; C(Центральный Лог)
B[Система 2 (Продюсер)] -- Публикует --&amp;gt; C
C -- Потребляет --&amp;gt; D[Система A (Потребитель)]
C -- Потребляет --&amp;gt; E[Система B (Потребитель)]
C -- Потребляет --&amp;gt; F[Система C (Потребитель)]
```&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Вместо множества прямых соединений между A-D, A-E, A-F, B-D, B-E, B-F, мы получаем лишь несколько соединений к центральному логу. Сложность снижается с N² до N.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Иерархия потребностей данных по Маслоу (адаптировано Крепсом):&lt;/b&gt;&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Аквизиция/Сбор данных&lt;/b&gt;: Самый важный базовый уровень. Без надежного, полного и структурированного сбора данных не имеет смысла говорить о чём-то другом. Многие компании пытаются “прыгнуть” сразу к ИИ и машинному обучению, имея хаотично собираемые данные. Это обратная логика.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Семантика&lt;/b&gt;: Понимание значения данных, их контекста, метаданных.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Понимание&lt;/b&gt;: Способность строить отчеты, визуализации.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Автоматизация&lt;/b&gt;: Реализация сложных алгоритмов, прогнозов.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Задача интеграции данных лежит в основе этой иерархии. Логи — это инструмент для её решения.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Дополнение (2023-2024):&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Data Mesh и Data Products&lt;/b&gt;: Эта концепция идеально ложится на идею центрального лога. Каждая команда-владелец домена (например, “Клиенты”, “Заказы”) становится ответственной за свой “Data Product”. Этот продукт включает в себя данные (часто в виде топиков лога), их схемы, качество, доступность и документацию.
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;Рекомендация&lt;/b&gt;: Внедряйте `Data Contracts`. Это соглашения между командами о структуре и семантике данных, которые они передают через лог, аналогично API-контрактам.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Cloud-Native решения&lt;/b&gt;:
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;Managed Kafka&lt;/b&gt;: Облачные провайдеры предлагают управляемые сервисы Kafka (Confluent Cloud, AWS MSK, Azure Event Hubs). Это снимает бремя операционного управления.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;CDC&lt;/b&gt;: Инструменты вроде &lt;b&gt;Debezium&lt;/b&gt; позволяют легко интегрировать изменения из традиционных баз данных (PostgreSQL, MySQL, MongoDB) напрямую в Kafka в реальном времени, превращая их в логи событий.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Трансформации данных&lt;/b&gt;: Где делать ETL?
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;Source-side&lt;/b&gt;: Продюсер должен публиковать максимально чистые, канонические данные.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Stream-side&lt;/b&gt;: Для добавления обогащённых данных или агрегатов могут быть использованы потоковые процессоры (см. Глава 3), создающие новые, производные топики лога.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Sink-side&lt;/b&gt;: Минимальные трансформации при загрузке в целевые системы (например, для специфичных схем БД хранилища).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Ошибки, которых стоит избегать:&lt;/b&gt;&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;“Big Ball of Mud”&lt;/b&gt;: Не пытайтесь создавать слишком сложные ETL-пайплайны внутри самого лога. Идеально, если лог остаётся “сырым” источником событий, а трансформации и обогащения происходят в отдельных потоковых приложениях.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Отсутствие ownership&lt;/b&gt;: Если нет четкой ответственности за данные, опубликованные в логе, они быстро теряют качество. Команда-производитель должна быть “владельцем” своих данных в логе.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Blindly копирование всего&lt;/b&gt;: Не все данные нужны всем. Фильтруйте и маршрутизируйте данные к нужным потребителям, чтобы не перегружать системы и сократить расходы.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;h4&gt;&lt;b&gt;Глава 3: Потоковая обработка в реальном времени и не только&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;Логи и потоковая обработка неотделимы друг от друга. Лог — это естественная модель для потока событий.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Что такое потоковая обработка? Шире, чем кажется.&lt;/b&gt;&lt;br /&gt;
Крепс расширил определение потоковой обработки. Это не просто “обработка данных по мере их поступления и затем отбрасывание”. Это &lt;b&gt;непрерывная обработка данных&lt;/b&gt;, способная выдавать результаты с низкой задержкой, но при этом иметь дело с историческими данными (то есть, лог можно переиграть).&lt;/p&gt;
&lt;p&gt;&lt;b&gt;От Lambda к Kappa: Парадокс репроцессинга&lt;/b&gt;&lt;br /&gt;
Традиционная &lt;b&gt;Lambda-архитектура&lt;/b&gt; предполагала два параллельных пути обработки:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Batch-слой (партия)&lt;/b&gt;: Высокая задержка, высокая точность, обработка всей истории (например, Hadoop MapReduce).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Speed-слой (скорость)&lt;/b&gt;: Низкая задержка, возможно, меньшая точность, обработка только новых данных (например, Storm).&lt;br /&gt;
Результаты из обоих слоев объединяются для получения полной картины.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Проблема Lambda&lt;/b&gt;: Дублирование бизнес-логики. Один и тот же расчет должен быть написан и поддерживаться дважды, на двух разных фреймворках (например, HiveQL/Spark для batch и Flink/Storm для stream). Это приводит к ошибкам, задержкам в разработке и высоким операционным издержкам.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Kappa-архитектура (Преимущество лога): Изобретая колесо заново, но лучше.&lt;/b&gt;&lt;br /&gt;
Крепс предложил элегантную альтернативу — &lt;b&gt;Kappa-архитектуру&lt;/b&gt;, которая устраняет необходимость в отдельном batch-слое. Идея проста:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Храните все сырые данные в логе (Kafka)&lt;/b&gt;: Настройте достаточно длинный `retention` (срок хранения), например, 30, 90 дней или даже дольше, если это необходимо для исторического анализа.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Единый потоковый процессор&lt;/b&gt;: Используйте один фреймворк (например, Apache Flink, Kafka Streams) для обработки данных. Этот же код обрабатывает как новые, так и исторические данные.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Репроцессинг без боли&lt;/b&gt;: Если вам нужно изменить логику обработки или исправить ошибку:
&lt;ul&gt;
  &lt;li&gt;Запустите &lt;b&gt;новый экземпляр&lt;/b&gt; потокового Job.&lt;/li&gt;
  &lt;li&gt;Он начинает читать данные &lt;b&gt;с начала лога&lt;/b&gt;.&lt;/li&gt;
  &lt;li&gt;Результаты записываются в &lt;b&gt;новую целевую таблицу/топик&lt;/b&gt;.&lt;/li&gt;
  &lt;li&gt;Как только новый Job “догонит” текущее время, переключите потребителей с “устаревшей” целевой таблицы на “новую”.&lt;/li&gt;
  &lt;li&gt;Остановите и удалите старый Job и старую таблицу.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-08-06-v-00.04.01.png" width="1092" height="680" alt="" /&gt;
&lt;/div&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;```mermaid
graph TD
    A[Исходный Лог (Kafka)]
    B[Старый Processing Job (v1)]
    C[Новый Processing Job (v2)]

    A -- Читает с offset 0 --&amp;gt; C
    A -- Читает с текущего offset --&amp;gt; B

    B -- Записывает в --&amp;gt; D[Старая Выходная Таблица]
    C -- Записывает в --&amp;gt; E[Новая Выходная Таблица]

    F[Приложение]--&amp;gt;D
    subgraph Reprocessing
        C
    end
    subgraph Switch
        direction LR
        F --&amp;gt; G[Переключить на E]
        G --&amp;gt; H[Удалить D, остановить B]
    end
```&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;Дополнение (2023-2024):&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Фреймворки&lt;/b&gt;:
&lt;ul&gt;
  &lt;li&gt;Apache Flink**: Де-факто стандарт для сложных stateful-вычислений с `exactly-once` семантикой. Поддерживает `event time`, `watermarks` (для обработки событий, пришедших не по порядку) и гибкие окна агрегации.&lt;/li&gt;
  &lt;li&gt;Kafka Streams / ksqlDB**: Для более простых задач обработки в рамках экосистемы Kafka. Идеально для микросервисов.&lt;/li&gt;
  &lt;li&gt;Apache Spark Streaming / Structured Streaming**: Позволяет использовать привычные API Spark для потоков.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Работа с состоянием (Stateful Processing)&lt;/b&gt;: Многие потоковые задачи требуют сохранения состояния (например, подсчёт уникальных пользователей за час). Современные фреймворки (Flink) позволяют хранить это состояние отказоустойчиво, часто используя RocksDB локально и чекпоинты в удаленном хранилище (S3/HDFS).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Real-time OLAP / Data Warehousing&lt;/b&gt;: Появляется класс решений, которые строят агрегаты и индексы напрямую из логов для интерактивных аналитических запросов (например, ClickHouse, Apache Druid, Materialize).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;GPU-ускорение&lt;/b&gt;: Для ML-инференса и сложных расчетов на потоках, где время критично (например, обнаружение аномалий, фрод-мониторинг), начинают использоваться GPU-ускоренные библиотеки (NVIDIA RAPIDS).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Ошибки, которых стоит избегать:&lt;/b&gt;&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Игнорирование late data&lt;/b&gt;: События в реальном мире не всегда приходят по порядку. Используйте `watermarks` и `event time` для корректной обработки “поздних” данных.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Репроцессинг “на потом”&lt;/b&gt;: Откладывание возможности репроцессинга приводит к накоплению технического долга и невозможности быстро исправлять ошибки в логике. Заложите её в архитектуру с самого начала.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Чрезмерное усложнение&lt;/b&gt;: Не пытайтесь написать собственный потоковый движок. Используйте проверенные фреймворки, они уже решили большинство проблем с распределенностью, отказоустойчивостью и производительностью.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;h4&gt;&lt;b&gt;Глава 4: Логи как фундамент для отказоустойчивых систем&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;Помимо интеграции и потоковой обработки, логи играют решающую роль в построении самих распределенных систем, упрощая их внутреннюю архитектуру.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Паттерн “Сервис = Лог + Serving Layer”&lt;/b&gt;&lt;br /&gt;
В этом паттерне логика сервиса разделяется на две основные части:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Лог (The Log)&lt;/b&gt;: Выступает как *единственный источник истины* для всех изменений состояния сервиса. Все записи (события, команды) сначала попадают в лог.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Serving Layer (Слой обслуживания/запросов)&lt;/b&gt;: Это набор вычислительных узлов, которые подписываются на лог и строят локальные, оптимизированные для запросов, представления данных (индексы).
&lt;ul&gt;
  &lt;li&gt;Пример: Пользователь хочет обновить свой профиль. Запрос на обновление фиксируется как событие в логе. Serving Layer, потребляя это событие, обновляет свою локальную копию данных (например, в базе данных или поисковом индексе Elasticsearch). Когда пользователь запрашивает профиль, запрос идет в Serving Layer.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Преимущество&lt;/b&gt;: Serving Layer может быть оптимизирован под конкретный тип запроса (например, Elasticsearch для полнотекстового поиска, Redis для быстрого key-value доступа), но при этом получать все данные из единого, надежного лога.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-08-06-v-00.03.18.png" width="1090" height="372" alt="" /&gt;
&lt;/div&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;```mermaid
graph TD
    A[Client] --&amp;gt; B[API Gateway/Микросервис записи]
    B -- Записывает событие/изменение --&amp;gt; C(Центральный Лог)

    C -- Подписывается --&amp;gt; D[Serving Layer 1 (напр. Elasticsearch)]
    C -- Подписывается --&amp;gt; E[Serving Layer 2 (напр. Redis Cache)]
    C -- Подписывается --&amp;gt; F[Serving Layer 3 (напр. Data Warehouse)]

    A -- Читает --&amp;gt; D
    A -- Читает --&amp;gt; E
```&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;Преимущества такой архитектуры:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Отказоустойчивость и восстановление&lt;/b&gt;: Если Serving Layer упадет, он может полностью восстановить свое состояние, “проиграв” лог с самого начала или с последнего чекпоинта. Лог является его бэкапом.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Изоляция сбоев&lt;/b&gt;: Падение одного Serving Layer не влияет на способность других Serving Layer’ов продолжать работу.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Детерминированность&lt;/b&gt;: Гарантия порядка из лога обеспечивает согласованность данных во всех Serving Layer’ах.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Горизонтальное масштабирование&lt;/b&gt;: Лог можно партиционировать (делим данные на части), и каждый Serving Layer может обрабатывать одну или несколько партиций, что позволяет добавлять узлы по мере роста нагрузки.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Отсутствие блокировок&lt;/b&gt;: Поскольку записи идут в лог, а чтение происходит из Serving Layer, это значительно снижает конкуренцию и улучшает параллелизм.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Log Compaction: Компактирование истории&lt;/b&gt;&lt;br /&gt;
Не всегда нужно хранить полную историю каждого изменения. Например, если вы отслеживаете текущее местоположение курьера, вам нужна только *последняя* координата, а не весь его путь.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Log Compaction (компактирование лога)&lt;/b&gt; – это процесс, при котором для каждого ключа в логе сохраняется только его *последнее* значение, а все предыдущие дубликаты удаляются.  &lt;br /&gt;
Это позволяет логу действовать как &lt;b&gt;changelog&lt;/b&gt; (журнал изменений), который, будучи проигранным с начала, воссоздаст *текущее* состояние распределенной таблицы.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Пример&lt;/b&gt;: Kafka умеет выполнять компактирование топиков, что идеально подходит для хранения состояния Key-Value пар (например, текущие балансы счетов, последние известные IP-адреса).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Дополнение (2023-2024):&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Event Sourcing&lt;/b&gt;: Паттерн, при котором основное состояние приложения сохраняется как последовательность событий в логе, а не как изменяемое состояние в базе данных. Состояние агрегатов получается путем применения всех событий.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Command Query Responsibility Segregation (CQRS)&lt;/b&gt;: Часто используется вместе с Event Sourcing. Команды (изменения) записываются в лог, а запросы (чтения) обслуживаются из оптимизированных для чтения материализованных представлений, построенных из того же лога.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Saga Pattern&lt;/b&gt;: Для координации долгих распределенных транзакций между множеством микросервисов, лог событий часто используется как механизм асинхронной связи и координации. Каждый сервис публикует событие о завершении своей части работы, а координатор Саги реагирует на эти события.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Kubernetes Operators&lt;/b&gt;: Для управления сложностью распределенных лог-систем, таких как Kafka, существуют Kubernetes Operators, которые автоматизируют развертывание, масштабирование, восстановление и обновление кластеров.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Observability (наблюдаемость)&lt;/b&gt;: Логи — это не только данные, но и инструмент для понимания поведения системы. Добавьте трассировку (`trace_id` в события) для отслеживания пути запроса через множество микросервисов и логов. Анализируйте `consumer lag` (отставание потребителей) как ключевую метрику здоровья потоковой системы.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Ошибки, которых стоит избегать:&lt;/b&gt;&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;“Я напишу свою Kafka”&lt;/b&gt;: Построение надежной распределенной лог-системы чрезвычайно сложно. Используйте проверенные решения (Kafka, Pulsar).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Забыть о версионировании&lt;/b&gt;: Изменения в структуре событий могут сломать старых потребителей. Используйте Schema Registry и стратегии совместимости схем (backward/forward compatibility).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Ручное управление состоянием&lt;/b&gt;: Не пытайтесь управлять состоянием stateful-приложений вручную. Доверьте эту задачу фреймворкам потоковой обработки, которые используют лог для отказоустойчивости.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;h4&gt;&lt;b&gt;Глава 5: Безопасность, Надежность и Операционная Эффективность&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;Лог, будучи “источником истины” и “кровеносной системой” данных, требует самого высокого уровня внимания к безопасности, надежности и операционной эффективности.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Безопасность (Security): Доверяй, но проверяй&lt;/b&gt;&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Шифрование данных&lt;/b&gt;:
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;В пути (In-transit Encryption)&lt;/b&gt;: Всегда используйте TLS (Transport Layer Security) для обмена данными между клиентами (продюсерами/потребителями) и брокерами лога, а также между самими брокерами.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;В состоянии покоя (At-rest Encryption)&lt;/b&gt;: Шифруйте данные на диске, где хранятся логи. Это может быть реализовано на уровне операционной системы, файловой системы или диска (LUKS, AWS EBS Encryption).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Аутентификация и Авторизация (Authentication &amp; Authorization – RBAC)&lt;/b&gt;:
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;Аутентификация&lt;/b&gt;: Убедитесь, что только доверенные клиенты могут подключаться к лог-системе (например, с помощью SASL/Kerberos, SSL-сертификатов или OAuth 2.0).&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Авторизация (RBAC)&lt;/b&gt;: Применяйте принцип наименьших привилегий. Контролируйте, кто может записывать в конкретные топики, а кто может читать из них. Отдельные приложения могут иметь разрешения только на чтение из определённых топиков и запись в свои собственные выходные топики.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Аудит (Auditing)&lt;/b&gt;: Включите логи аудита для всех действий в лог-системе (кто, когда, что изменил или прочитал).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;b&gt;Надежность (Reliability): Будьте готовы ко всему&lt;/b&gt;&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Репликация данных&lt;/b&gt;: Для обеспечения надежности критически важные данные должны быть реплицированы. В Kafka это достигается за счет репликации партиций между брокерами. Определите `replication factor` (фактор репликации) в зависимости от критичности данных (обычно 3).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Диспетчер сбоев (Disaster Recovery)&lt;/b&gt;:
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;Внутрикластерная отказоустойчивость&lt;/b&gt;: Лог-система должна быть способна выдержать отказ отдельных узлов или зон доступности (Availability Zones) без потери данных.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Географическая репликация&lt;/b&gt;: Для защиты от сбоев целых дата-центров используйте мульти-кластерные развертывания с гео-репликацией (например, MirrorMaker2 для Kafka).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Idempotence Producers&lt;/b&gt;: Убедитесь, что продюсеры могут повторно отправлять сообщения при сбоях без создания дубликатов, достигая `at-least-once` или `exactly-once` семантики.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;At-least-once, At-most-once, Exactly-once Semantics&lt;/b&gt;: Понимайте и выбирайте подходящую семантику доставки сообщений для каждого пайплайна. `Exactly-once` сложнее всего, но обеспечивает максимальную точность.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;b&gt;Операционная Эффективность (Operational Efficiency): Не замедляйтесь&lt;/b&gt;&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Партиционирование&lt;/b&gt;: Правильное партиционирование топиков критически важно.
&lt;ul&gt;
  &lt;li&gt;Должно быть достаточно партиций для параллельной обработки.&lt;/li&gt;
  &lt;li&gt;Ключи партиционирования должны распределять нагрузку равномерно.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Ошибка&lt;/b&gt;: Недостаточное количество партиций может привести к узким местам. Слишком много партиций усложняет управление и увеличивает нагрузку на брокеры.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Батчинг (Batching)&lt;/b&gt;: Соединяйте мелкие записи в большие “пакеты” перед отправкой в лог. Это значительно уменьшает накладные расходы на I/O и сетевые операции.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Zero-Copy&lt;/b&gt;: Используйте механизмы, позволяющие передавать данные из лога напрямую в сетевой сокет, минуя буферы приложения для копирования. Это снижает нагрузку на CPU.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Мониторинг&lt;/b&gt;: Ключ к здоровой системе.
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;Метрики брокеров&lt;/b&gt;: CPU, память, диск I/O, сетевой трафик, количество сообщений, пропускная способность.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Метрики топиков&lt;/b&gt;: Размер, количество партиций, скорость записи/чтения.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Метрики потребителей&lt;/b&gt;: &lt;b&gt;Consumer Lag&lt;/b&gt; (отставание потребителей) — это самая важная метрика. Если `consumer lag` растет, значит, потребитель не справляется с нагрузкой, и данные накапливаются.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Алерты&lt;/b&gt;: Настройте оповещения на критические метрики (высокий `consumer lag`, ошибки записи/чтения, недоступность брокеров).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Логирование и Трассировка&lt;/b&gt;: Стандартизируйте форматы логов приложений, отправляющих и потребляющих данные из лога. Включите корреляционные ID (`trace_id`, `span_id`) для отслеживания событий через всю распределенную систему (например, с помощью OpenTelemetry).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Управление ресурсами&lt;/b&gt;: Убедитесь, что у брокеров лога достаточно ресурсов (CPU, RAM, диск I/O) для обработки пиковых нагрузок. Используйте быстрые диски (SSD/NVMe).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;b&gt;Дополнение (2023-2024): Chaos Engineering&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Для проверки устойчивости вашей лог-инфраструктуры к сбоям, регулярно проводите эксперименты в контролируемой среде.&lt;/li&gt;
&lt;li&gt;Примеры**: Имитация отказа брокера (убиваем процесс), сетевые проблемы (Partition), перегрузка диска, увеличение задержки для потребителя. Это помогает выявлять слабые места *до* того, как они проявятся в продакшене.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;h4&gt;&lt;b&gt;Заключение: пошаговый план к Data-Driven Будущему&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;Мы проделали большой путь, от понимания фундаментальной природы лога до его роли в современных распределенных системах, интеграции данных и потоковой обработке. Лог — это не просто техническая деталь, а стратегический актив, который позволяет вашей компании быть по-настоящему “data-driven”.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Краткие выводы:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Лог — это источник истины&lt;/b&gt;: Он хранит историю изменений в гарантированном порядке.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Лог упрощает&lt;/b&gt;: Он решает проблемы интеграции (N² → N), репликации и восстановления.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Лог масштабирует&lt;/b&gt;: Благодаря партиционированию и оптимизациям, таким как батчинг и zero-copy.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Лог — это кровь в организме данных&lt;/b&gt;: Без него невозможно построить гибкую, реактивную и отказоустойчивую архитектуру.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Kappa лучше Lambda&lt;/b&gt;: Одна кодовая база для realtime и batch обработки.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Ваш пошаговый план к Data-Driven Архитектуре, управляемой логами:&lt;/b&gt;&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Начните с аудита источников данных&lt;/b&gt;:
&lt;ul&gt;
  &lt;li&gt;Определите, какие данные генерируются вашими системами, какие из них критически важны, какие меняются со временем.&lt;/li&gt;
  &lt;li&gt;Поймите, где находятся “узкие места” в текущей интеграции.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="2"&gt;
&lt;li&gt;&lt;b&gt;Выберите платформу логов&lt;/b&gt;:
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;Выбор&lt;/b&gt;: Apache Kafka — это де-факто стандарт. Рассмотрите Apache Pulsar как альтернативу, если вам нужна расширенная гибкость.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Развертывание&lt;/b&gt;: Для начала можно использовать управляемые облачные сервисы (Confluent Cloud, AWS MSK, Azure Event Hubs) или самостоятельно развернуть Kafka в Kubernetes с помощью операторов. Не пытайтесь строить свой велосипед.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="3"&gt;
&lt;li&gt;&lt;b&gt;Внедрите Schema Registry&lt;/b&gt;:
&lt;ul&gt;
  &lt;li&gt;Это не опция, а &lt;b&gt;обязательное условие&lt;/b&gt;.&lt;/li&gt;
  &lt;li&gt;Соберите команды, которые генерируют данные, и начните совместно разрабатывать строгие схемы для каждого типа событий (Avro/Protobuf).&lt;/li&gt;
  &lt;li&gt;*Рекомендация*: Внедрите процесс `data contract` – соглашения между командами о формате и семантике данных.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="4"&gt;
&lt;li&gt;&lt;b&gt;Инструментируйте ключевые сервисы для публикации в лог&lt;/b&gt;:
&lt;ul&gt;
  &lt;li&gt;Начните с одного или двух высоконагруженных сервисов.&lt;/li&gt;
  &lt;li&gt;Используйте &lt;b&gt;Change Data Capture (CDC)&lt;/b&gt; (например, Debezium) для выгрузки изменений из баз данных в лог.&lt;/li&gt;
  &lt;li&gt;Для новых сервисов и пользовательских действий изначально проектируйте их как &lt;b&gt;Event Sourcing&lt;/b&gt;-системы, публикующие события в лог.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="5"&gt;
&lt;li&gt;&lt;b&gt;Настройте базовых потребителей и хранилища&lt;/b&gt;:
&lt;ul&gt;
  &lt;li&gt;Автоматизируйте загрузку данных из лога в ваше основное аналитическое хранилище (Data Warehouse, Data Lake, например, S3/HDFS + Spark/Hive).&lt;/li&gt;
  &lt;li&gt;Подключите первый “реальный” потребитель, например, систему мониторинга, которая отслеживает ключевые показатели бизнеса на основе событий из лога.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="6"&gt;
&lt;li&gt;&lt;b&gt;Разверните платформу потоковой обработки&lt;/b&gt;:
&lt;ul&gt;
  &lt;li&gt;Начните с Apache Flink или Kafka Streams. Они позволят вам обрабатывать данные из лога, обогащать их, агрегировать и создавать новые, производные потоки данных.&lt;/li&gt;
  &lt;li&gt;*Рекомендация*: Сначала решайте простые задачи (агрегаты, фильтрация), затем переходите к более сложным (stateful processing, windowing).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="7"&gt;
&lt;li&gt;&lt;b&gt;Сосредоточьтесь на Observability и Автоматизации&lt;/b&gt;:
&lt;ul&gt;
  &lt;li&gt;Внедрите комплексный мониторинг всей лог-инфраструктуры (брокеры, топики, потребители) с ключевыми метриками (consumer lag!).&lt;/li&gt;
  &lt;li&gt;Настройте алерты.&lt;/li&gt;
  &lt;li&gt;Автоматизируйте процессы развертывания, масштабирования и восстановления лог-компонентов.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="8"&gt;
&lt;li&gt;&lt;b&gt;Имплементируйте принципы безопасности&lt;/b&gt;:
&lt;ul&gt;
  &lt;li&gt;Шифрование, аутентификация, авторизация. Пусть это будет часть каждого нового внедрения.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="9"&gt;
&lt;li&gt;&lt;b&gt;Готовьтесь к репроцессингу&lt;/b&gt;:
&lt;ul&gt;
  &lt;li&gt;Убедитесь, что ваши логи хранят достаточно истории (длительный retention).&lt;/li&gt;
  &lt;li&gt;Проектируйте свои потоковые приложения с учетом возможности запуска нового экземпляра для пересчета исторических данных.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="10"&gt;
&lt;li&gt;&lt;b&gt;Примите философию Data Mesh&lt;/b&gt;:
&lt;ul&gt;
  &lt;li&gt;Меняйте культуру: поощряйте команды владеть своими данными как продуктами.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Эпилог: Лог – это не просто техническая деталь, а отражение бизнес-процессов. Каждая запись – атом вашей организационной ДНК. Превратите хаос данных в нарратив, где каждая транзакция – это предложение, а каждый поток – глава вашей бизнес-истории, благодаря надежной и гибкой кровеносной системе, управляемой логами.&lt;/b&gt;&lt;/p&gt;
</description>
</item>

<item>
<title>Запуск Kafka на s3</title>
<guid isPermaLink="false">164</guid>
<link>https://gavrilov.info/all/zapusk-kafka-na-s3/</link>
<pubDate>Sun, 29 Sep 2024 21:19:13 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/zapusk-kafka-na-s3/</comments>
<description>
&lt;p&gt;Оригинал: &lt;a href="https://medium.com/thedeephub/how-do-we-run-kafka-100-on-the-object-storage-521c6fec6341"&gt;https://medium.com/thedeephub/how-do-we-run-kafka-100-on-the-object-storage-521c6fec6341&lt;/a&gt;&lt;br /&gt;
&lt;a href="https://a.gavrilov.info/data/posts/How%20do%20we%20run%20Kafka%20100%25%20on%20the%20object%20storage%3F%20%7C%20by%20Vu%20Trinh%20%7C%20The%20Deep%20Hub%20%7C%20Aug%2C%202024%20%7C%20Medium.pdf"&gt;А тут pdf’ка &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Не стал переводить&lt;/p&gt;
</description>
</item>


</channel>
</rss>