{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Yuriy Gavrilov: posts tagged Kafka",
    "_rss_description": "Welcome to my personal place for love, peace and happiness 🤖 Yuiry Gavrilov",
    "_rss_language": "en",
    "_itunes_email": "yvgavrilov@gmail.com",
    "_itunes_categories_xml": "",
    "_itunes_image": "https:\/\/gavrilov.info\/pictures\/userpic\/userpic-square@2x.jpg?1643451008",
    "_itunes_explicit": "no",
    "home_page_url": "https:\/\/gavrilov.info\/tags\/kafka\/",
    "feed_url": "https:\/\/gavrilov.info\/tags\/kafka\/json\/",
    "icon": "https:\/\/gavrilov.info\/pictures\/userpic\/userpic@2x.jpg?1643451008",
    "authors": [
        {
            "name": "Yuriy Gavrilov - B[u]g - for charity.gavrilov.eth",
            "url": "https:\/\/gavrilov.info\/",
            "avatar": "https:\/\/gavrilov.info\/pictures\/userpic\/userpic@2x.jpg?1643451008"
        }
    ],
    "items": [
        {
            "id": "259",
            "url": "https:\/\/gavrilov.info\/all\/kniga-i-logs-dzheya-krepsa\/",
            "title": "Книга “I ♥ Logs” Джея Крепса",
            "content_html": "<h4>Часть 1: Книга “I Love Logs” EVENT DATA, STREAM PROCESSING, AND DATA INTEGRATION<\/h4>\n<p>Джей Крепс<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/gavrilov.info\/pictures\/Snimok-ekrana-2025-08-06-v-00.11.45.png\" width=\"900\" height=\"362\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Оригинал тут: <a href=\"https:\/\/a.gavrilov.info\/data\/posts\/I_Heart_Logs-Jay_Kreps.pdf\">I_Heart_Logs-Jay_Kreps.pdf <\/a><\/div>\n<\/div>\n<p><b>Оригинальные идеи и рекомендации книги:<\/b><\/p>\n<ol start=\"1\">\n<li><b>Лог как фундаментальная абстракция<\/b>:\n<ul>\n  <li>Ключевая идея: лог — это не просто текстовый файл для отладки, а упорядоченная, неизменяемая (append-only) последовательность записей (событий), снабженная уникальными, последовательно увеличивающимися номерами (offset’ами), которые служат “временем” в распределенной системе.<\/li>\n  <li>Он является “источником истины” (`source of truth`) и позволяет восстановить состояние системы.<\/li>\n  <li><b>State Machine Replication Principle<\/b>: Если два детерминированных процесса начинают в одном состоянии и получают одинаковые входные данные в одном и том же порядке, они произведут одинаковый вывод и закончат в одном и том же состоянии. Лог обеспечивает этот “одинаковый порядок”.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<ol start=\"2\">\n<li><b>Роль логов в базах данных<\/b>:\n<ul>\n  <li>Логи лежат в основе работы ACID-баз данных (commit log, transaction log) для обеспечения атомарности, изоляции и долговечности.<\/li>\n  <li>Используются для репликации данных между мастером и репликами (Change Data Capture – CDC).<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<ol start=\"3\">\n<li><b>Применения логов<\/b>:\n<ul>\n  <li><b>Интеграция данных (Data Integration)<\/b>: Лог становится центральной “магистралью данных” или единой “шиной событий” для всей организации. Он решает проблему интеграции “N систем с N системами” (N²) путем преобразования ее в “N систем с одним логом” (N). Крепс приводит “Иерархию потребностей Маслоу для данных” (сбор\/аквизиция данных, семантика, понимание, автоматизация), подчеркивая, что без надежного сбора данных невозможно ничего другого.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/gavrilov.info\/pictures\/Snimok-ekrana-2025-08-06-v-00.24.03.png\" width=\"738\" height=\"294\" alt=\"\" \/>\n<\/div>\n<ul>\n<li>Организационная масштабируемость**: Ответственность за чистоту и формат данных лежит на *производителе* данных, а не на потребителях или центральной команде ETL.<\/li>\n<li><b>Потоковая обработка в реальном времени (Real-time Stream Processing)<\/b>: Лог — это естественное представление потока данных. Любое событие в реальном времени, база данных, изменяющаяся с течением времени, — всё это логи.<\/li>\n<li>Крепс выступает за <b>Kappa-архитектуру<\/b> как альтернативу Lambda-архитектуре.<\/li>\n<li><b>Критика Lambda<\/b>: Дублирование логики (один и тот же расчет в batch и stream слоях), сложность оперирования.<\/li>\n<li><b>Альтернативная модель репроцессинга<\/b>: Вместо двух отдельных фреймворков (batch и stream) — использовать единую потоковую систему, которая может пересчитывать историю, используя лог как источник исторических данных. Когда логика меняется, запускается новый потоковый Job с начала лога, записывающий результат в новую таблицу, и после догона старая таблица заменяется новой.<\/li>\n<li><b>Проектирование распределенных систем<\/b>: Лог упрощает дизайн. Вместо того, чтобы каждая система занималась согласованностью, репликацией и восстановлением, эти функции можно передать логированию.<\/li>\n<li><b>Паттерн “Сервис = Лог + Serving Layer”<\/b>: Лог хранит все изменения (source of truth), а “serving layer” (например, поисковая система, key-value хранилище) строит индексированные или материализованные представления на основе лога для быстрых запросов.<\/li>\n<\/ul>\n<ol start=\"4\">\n<li><b>Технические особенности и оптимизации<\/b>:\n<ul>\n  <li><b>Партиционирование лога<\/b>: Для горизонтального масштабирования (Kafka). Позволяет обрабатывать записи независимо, не требует глобального порядка. Порядок гарантируется только в пределах одной партиции.<\/li>\n  <li><b>Батчинг (Batching)<\/b>: Соединение мелких операций в крупные для повышения пропускной способности.<\/li>\n  <li><b>Zero-Copy Data Transfer<\/b>: Передача данных между слоями памяти без их копирования, что улучшает производительность.<\/li>\n  <li><b>Log Compaction (Компактирование лога)<\/b>: Оптимизация хранения для “лагов изменений” (changelogs). Вместо хранения всех версий записи, оставляется только последняя версия для каждого ключа. Это позволяет восстановить *текущее* состояние, но не *всю* историю.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<ol start=\"5\">\n<li><b>Дуальность таблиц и событий (Tables and Events Are Dual)<\/b>:\n<ul>\n  <li>Крепс проводит аналогию с системами контроля версий (Git): история изменений (патчи) — это лог, а текущая рабочая копия — это таблица.<\/li>\n  <li>Данные могут свободно “перетекать” между состоянием (таблица) и потоком изменений (лог).<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p><b> Стоило бы дополнить (2023-2024):<\/b><\/p>\n<ol start=\"1\">\n<li><b>Эволюция экосистемы<\/b>:\n<ul>\n  <li>Книга вышла в 2014 году. С тех пор Kafka стала де-факто стандартом. Появились альтернативы <a href=\"https:\/\/pulsar.apache.org\">Apache Pulsar<\/a> его, кстати, умеет читать и писать Seatunnel :) и множество надстроек\/фреймворков (Kafka Streams, Flink SQL, Materialize).<\/li>\n  <li>Рост Serverless-архитектур и их интеграция с логами (AWS Lambda, Google Cloud Functions, Azure Functions как потребители логов).<\/li>\n  <li>Повсеместное использование Kubernetes и операторов для развертывания и управления Kafka-кластерами.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<ol start=\"2\">\n<li><b>Управление схемами (Schema Management)<\/b>:\n<ul>\n  <li>Книга упоминает структурированные логи, но не углубляется в детали. Сегодня критически важен <b>Schema Registry<\/b> (например, Confluent Schema Registry или <a href=\"http:\/\/apicur.io)\">http:\/\/apicur.io)<\/a> для обеспечения совместимости схем данных в логах и управления их версиями. Это предотвращает “data swamp” и делает логи действительно надежным источником данных.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<ol start=\"3\">\n<li><b>Качество данных и Observability<\/b>:\n<ul>\n  <li>Помимо “структуры”, важна *семантика* и *качество* данных. Мониторинг “data quality”, “data lineage” (происхождение данных) и “data governance” становятся ключевыми.<\/li>\n  <li><b>Observability<\/b>: Трассировка событий через лог-пайплайн (например, OpenTelemetry), сбор метрик (lag потребителей, пропускная способность, ошибки) с Prometheus\/Grafana.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<ol start=\"4\">\n<li><b>Безопасность (Security)<\/b>:\n<ul>\n  <li>Шифрование данных в пути (TLS) и в состоянии покоя (at-rest encryption).<\/li>\n  <li>Аутентификация и авторизация (RBAC) для продюсеров и потребителей Kafka.<\/li>\n  <li>Аудит доступа к логам.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<ol start=\"5\">\n<li><b>Паттерны микросервисной архитектуры<\/b>:\n<ul>\n  <li><b>Event Sourcing<\/b> и <b>CQRS<\/b> стали стандартными паттернами.<\/li>\n  <li><b>Saga Pattern<\/b> для координации распределенных транзакций между микросервисами, часто реализуемых через лог.<\/li>\n  <li><b>Data Mesh<\/b>: Принцип, что данные должны рассматриваться как продукт. Команда-владелец домена отвечает за свой “дата-продукт” и предоставляет его через лог, который является частью этого “продукта”.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<ol start=\"6\">\n<li><b>Real-time Analytics и ML<\/b>:\n<ul>\n  <li>Пайплайны с логами используются для обучения и инференса ML-моделей в реальном времени. Например, логи кликов для рекомендательных систем.<\/li>\n  <li>Появление GPU-ускоренных фреймворков для потоковой обработки (например, NVIDIA RAPIDS).<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<ol start=\"7\">\n<li><b>Антипаттерны и ошибки<\/b>: Конкретные примеры из практики, как неправильное внедрение логов может привести к проблемам.<\/li>\n<\/ol>\n<p>---<\/p>\n<h4><b>Часть 2: Современный взгляд Логи: Кровеносная система Data-Driven компаний<\/b><\/h4>\n<p>Представьте себе, что данные – это жизненная сила вашей компании, а IT-инфраструктура – ее тело. Тогда логи, как это ни парадоксально, стали бы ее <b>кровеносной системой<\/b>. Они несут информацию от каждой клетки к каждому органу, обеспечивая слаженность и жизнеспособность всего организма.<\/p>\n<p>В эпоху распределенных систем, микросервисов, Big Data и искусственного интеллекта, когда скорость обработки информации определяет конкурентное преимущество, традиционные подходы к интеграции и обработке данных трещат по швам. Книга, которая у вас в руках – это переосмысление ключевых идей Джея Крепса, соавтора Apache Kafka, о том, как “скромный” лог превратился из технической детали в центральный архитектурный примитив.<\/p>\n<p>Мы пройдем путь от понимания природы лога до его применения в масштабных системах, интеграции данных, потоковой обработке и построении отказоустойчивых архитектур. Эта книга не только сохранит оригинальные прозрения, но и дополнит их новейшими практиками, инструментами и опытом, накопленным IT-индустрией за последнее десятилетие. Вы узнаете, как избежать распространенных ошибок и построить по-настоящему гибкую и масштабируемую систему, где данные действительно “текут” свободно.<\/p>\n<p>---<\/p>\n<h4><b>Глава 1: Лог: Недооцененный фундамент современных систем<\/b><\/h4>\n<p>Когда речь заходит о логах, большинство инженеров представляют себе длинные текстовые файлы с отладочной информацией. Однако, как показал Джей Крепс, истинная природа лога гораздо глубже.<\/p>\n<p><b>Что такое Лог? Глубже, чем кажется.<\/b><br \/>\nПредставьте себе не просто текстовый файл, а <b>упорядоченную, неизменяемую последовательность записей<\/b>. Каждая запись добавляется в конец. Это фундаментальное отличие от базы данных, где данные можно изменять “на месте”. В логе ни одна запись не удаляется и не меняется. Вместо этого, новые изменения *добавляются* как новые записи.<\/p>\n<p>Каждая запись в логе имеет уникальный, последовательно возрастающий номер, который можно считать её “временем” или “позицией” в потоке. Это ключевое свойство: оно дает нам <b>гарантию порядка<\/b>.<\/p>\n<p><b>Принцип State Machine Replication: Волшебство порядка<\/b><br \/>\nЭто краеугольный камень распределенных систем. Он гласит:<\/p>\n<blockquote>\n<p><b>Если два идентичных, детерминированных процесса начинают в одном состоянии и получают одинаковые входные данные в одном и том же порядке, они произведут одинаковый вывод и закончат в одном и том же состоянии.<\/b><\/p>\n<\/blockquote>\n<p>В этом принцип “лога” критически важен: он обеспечивает “одинаковый порядок” входных данных для всех реплик. Если у вас есть лог всех изменений (событий), вы можете “воспроизвести” этот лог на разных машинах, чтобы они достигли идентичного состояния.<\/p>\n<p>*Пример из практики*: Банковский счет. Вместо хранения одного числа (текущий баланс), мы храним лог всех транзакций: “снятие 1000 руб.”, “поступление 5000 руб.”. Текущий баланс – это всего лишь функция, которая суммирует все записи в логе до текущего момента. Если банк “забудет” состояние баланса, он всегда может его восстановить, проиграв лог всех транзакций.<\/p>\n<p><b>Логи в базах данных: Невидимый двигатель<\/b><br \/>\nВнутри любой надежной реляционной базы данных или NoSQL-хранилища уже давно работает лог: `commit log` или `transaction log`. Он гарантирует, что даже при сбое системы, транзакции не будут потеряны, а данные останутся согласованными (свойства ACID). Механизмы репликации баз данных (например, бинарные логи MySQL или WAL PostgreSQL) – это по сути потоковая передача записей из такого лога. Это и есть <b>Change Data Capture (CDC)<\/b> – захват изменений данных.<\/p>\n<p><b>Дополнение (2023-2024):<\/b><\/p>\n<ul>\n<li><b>Структурированные логи и схемы<\/b>: Для машинного чтения и обработки логам необходим строгий формат. Сегодня это почти всегда JSON, Apache Avro или Google Protocol Buffers.\n<ul>\n  <li>Рекомендация<b>: Используйте <\/b>Schema Registry**. Это централизованное хранилище ваших схем, которое позволяет эволюционировать схемы логов, не ломая обратную совместимость. Оно критически важно для долгосрочной жизнеспособности вашей data-инфраструктуры. Без Schema Registry ваши логи быстро превратятся в “data swamp” – болото неструктурированных, непонятных данных.<\/li>\n<\/ul>\n<\/li>\n<li><b>Лог как Event Stream<\/b>: В современных архитектурах каждый чих в системе – это событие. Логи веб-сервера, действия пользователя, метрики микросервисов, изменения в БД – все это может быть представлено как лог событий.<\/li>\n<\/ul>\n<p><b>Ошибки, которых стоит избегать:<\/b><\/p>\n<ol start=\"1\">\n<li><b>“Лог для людей, а не для машин”<\/b>: Если вы используете логи только для чтения человеком при отладке, вы упускаете их колоссальный потенциал как источника данных для других систем.<\/li>\n<li><b>Отсутствие структурированности<\/b>: Произвольные текстовые сообщения в логах делают их крайне сложными для автоматического анализа и интеграции. Всегда! используйте структурированные форматы.<\/li>\n<li><b>Игнорирование порядка<\/b>: Если события записываются без гарантии порядка, вы никогда не сможете надежно воспроизвести состояние системы или построить корректные агрегаты.<\/li>\n<\/ol>\n<p>---<\/p>\n<h4><b>Глава 2: Данные как потоки: Интеграция через Логи<\/b><\/h4>\n<p>Одна из самых болезненных проблем в больших компаниях – это интеграция данных. Исторически это решалось кастомными ETL (Extract, Transform, Load) пайплайнами, где каждая система “говорила” с каждой. Такая модель приводит к экспоненциальному росту сложности (N² соединений для N систем).<\/p>\n<p><b>Централизованная шина событий: Революция в интеграции<\/b><br \/>\nИдея Крепса: вместо N² соединений, создайте универсальный централизованный лог, который будет выступать в роли “шины событий” или “артерии данных”.<\/p>\n<ul>\n<li><b>Производители данных<\/b>: Системы, генерирующие данные, публикуют их в этот центральный лог.<\/li>\n<li><b>Потребители данных<\/b>: Системы, которым нужны эти данные, подписываются на соответствующие части лога (топики) и потребляют их независимо, в своем темпе.<\/li>\n<\/ul>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/gavrilov.info\/pictures\/Snimok-ekrana-2025-08-06-v-00.05.12.png\" width=\"1092\" height=\"252\" alt=\"\" \/>\n<\/div>\n<pre class=\"e2-text-code\"><code class=\"\">```mermaid\ngraph LR\nA[Система 1 (Продюсер)] -- Публикует --&gt; C(Центральный Лог)\nB[Система 2 (Продюсер)] -- Публикует --&gt; C\nC -- Потребляет --&gt; D[Система A (Потребитель)]\nC -- Потребляет --&gt; E[Система B (Потребитель)]\nC -- Потребляет --&gt; F[Система C (Потребитель)]\n```<\/code><\/pre><p>Вместо множества прямых соединений между A-D, A-E, A-F, B-D, B-E, B-F, мы получаем лишь несколько соединений к центральному логу. Сложность снижается с N² до N.<\/p>\n<p><b>Иерархия потребностей данных по Маслоу (адаптировано Крепсом):<\/b><\/p>\n<ol start=\"1\">\n<li><b>Аквизиция\/Сбор данных<\/b>: Самый важный базовый уровень. Без надежного, полного и структурированного сбора данных не имеет смысла говорить о чём-то другом. Многие компании пытаются “прыгнуть” сразу к ИИ и машинному обучению, имея хаотично собираемые данные. Это обратная логика.<\/li>\n<li><b>Семантика<\/b>: Понимание значения данных, их контекста, метаданных.<\/li>\n<li><b>Понимание<\/b>: Способность строить отчеты, визуализации.<\/li>\n<li><b>Автоматизация<\/b>: Реализация сложных алгоритмов, прогнозов.<\/li>\n<\/ol>\n<p>Задача интеграции данных лежит в основе этой иерархии. Логи — это инструмент для её решения.<\/p>\n<p><b>Дополнение (2023-2024):<\/b><\/p>\n<ul>\n<li><b>Data Mesh и Data Products<\/b>: Эта концепция идеально ложится на идею центрального лога. Каждая команда-владелец домена (например, “Клиенты”, “Заказы”) становится ответственной за свой “Data Product”. Этот продукт включает в себя данные (часто в виде топиков лога), их схемы, качество, доступность и документацию.\n<ul>\n  <li><b>Рекомендация<\/b>: Внедряйте `Data Contracts`. Это соглашения между командами о структуре и семантике данных, которые они передают через лог, аналогично API-контрактам.<\/li>\n<\/ul>\n<\/li>\n<li><b>Cloud-Native решения<\/b>:\n<ul>\n  <li><b>Managed Kafka<\/b>: Облачные провайдеры предлагают управляемые сервисы Kafka (Confluent Cloud, AWS MSK, Azure Event Hubs). Это снимает бремя операционного управления.<\/li>\n  <li><b>CDC<\/b>: Инструменты вроде <b>Debezium<\/b> позволяют легко интегрировать изменения из традиционных баз данных (PostgreSQL, MySQL, MongoDB) напрямую в Kafka в реальном времени, превращая их в логи событий.<\/li>\n<\/ul>\n<\/li>\n<li><b>Трансформации данных<\/b>: Где делать ETL?\n<ul>\n  <li><b>Source-side<\/b>: Продюсер должен публиковать максимально чистые, канонические данные.<\/li>\n  <li><b>Stream-side<\/b>: Для добавления обогащённых данных или агрегатов могут быть использованы потоковые процессоры (см. Глава 3), создающие новые, производные топики лога.<\/li>\n  <li><b>Sink-side<\/b>: Минимальные трансформации при загрузке в целевые системы (например, для специфичных схем БД хранилища).<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><b>Ошибки, которых стоит избегать:<\/b><\/p>\n<ol start=\"1\">\n<li><b>“Big Ball of Mud”<\/b>: Не пытайтесь создавать слишком сложные ETL-пайплайны внутри самого лога. Идеально, если лог остаётся “сырым” источником событий, а трансформации и обогащения происходят в отдельных потоковых приложениях.<\/li>\n<li><b>Отсутствие ownership<\/b>: Если нет четкой ответственности за данные, опубликованные в логе, они быстро теряют качество. Команда-производитель должна быть “владельцем” своих данных в логе.<\/li>\n<li><b>Blindly копирование всего<\/b>: Не все данные нужны всем. Фильтруйте и маршрутизируйте данные к нужным потребителям, чтобы не перегружать системы и сократить расходы.<\/li>\n<\/ol>\n<p>---<\/p>\n<h4><b>Глава 3: Потоковая обработка в реальном времени и не только<\/b><\/h4>\n<p>Логи и потоковая обработка неотделимы друг от друга. Лог — это естественная модель для потока событий.<\/p>\n<p><b>Что такое потоковая обработка? Шире, чем кажется.<\/b><br \/>\nКрепс расширил определение потоковой обработки. Это не просто “обработка данных по мере их поступления и затем отбрасывание”. Это <b>непрерывная обработка данных<\/b>, способная выдавать результаты с низкой задержкой, но при этом иметь дело с историческими данными (то есть, лог можно переиграть).<\/p>\n<p><b>От Lambda к Kappa: Парадокс репроцессинга<\/b><br \/>\nТрадиционная <b>Lambda-архитектура<\/b> предполагала два параллельных пути обработки:<\/p>\n<ul>\n<li><b>Batch-слой (партия)<\/b>: Высокая задержка, высокая точность, обработка всей истории (например, Hadoop MapReduce).<\/li>\n<li><b>Speed-слой (скорость)<\/b>: Низкая задержка, возможно, меньшая точность, обработка только новых данных (например, Storm).<br \/>\nРезультаты из обоих слоев объединяются для получения полной картины.<\/li>\n<\/ul>\n<p><b>Проблема Lambda<\/b>: Дублирование бизнес-логики. Один и тот же расчет должен быть написан и поддерживаться дважды, на двух разных фреймворках (например, HiveQL\/Spark для batch и Flink\/Storm для stream). Это приводит к ошибкам, задержкам в разработке и высоким операционным издержкам.<\/p>\n<p><b>Kappa-архитектура (Преимущество лога): Изобретая колесо заново, но лучше.<\/b><br \/>\nКрепс предложил элегантную альтернативу — <b>Kappa-архитектуру<\/b>, которая устраняет необходимость в отдельном batch-слое. Идея проста:<\/p>\n<ol start=\"1\">\n<li><b>Храните все сырые данные в логе (Kafka)<\/b>: Настройте достаточно длинный `retention` (срок хранения), например, 30, 90 дней или даже дольше, если это необходимо для исторического анализа.<\/li>\n<li><b>Единый потоковый процессор<\/b>: Используйте один фреймворк (например, Apache Flink, Kafka Streams) для обработки данных. Этот же код обрабатывает как новые, так и исторические данные.<\/li>\n<li><b>Репроцессинг без боли<\/b>: Если вам нужно изменить логику обработки или исправить ошибку:\n<ul>\n  <li>Запустите <b>новый экземпляр<\/b> потокового Job.<\/li>\n  <li>Он начинает читать данные <b>с начала лога<\/b>.<\/li>\n  <li>Результаты записываются в <b>новую целевую таблицу\/топик<\/b>.<\/li>\n  <li>Как только новый Job “догонит” текущее время, переключите потребителей с “устаревшей” целевой таблицы на “новую”.<\/li>\n  <li>Остановите и удалите старый Job и старую таблицу.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/gavrilov.info\/pictures\/Snimok-ekrana-2025-08-06-v-00.04.01.png\" width=\"1092\" height=\"680\" alt=\"\" \/>\n<\/div>\n<pre class=\"e2-text-code\"><code class=\"\">```mermaid\ngraph TD\n    A[Исходный Лог (Kafka)]\n    B[Старый Processing Job (v1)]\n    C[Новый Processing Job (v2)]\n\n    A -- Читает с offset 0 --&gt; C\n    A -- Читает с текущего offset --&gt; B\n\n    B -- Записывает в --&gt; D[Старая Выходная Таблица]\n    C -- Записывает в --&gt; E[Новая Выходная Таблица]\n\n    F[Приложение]--&gt;D\n    subgraph Reprocessing\n        C\n    end\n    subgraph Switch\n        direction LR\n        F --&gt; G[Переключить на E]\n        G --&gt; H[Удалить D, остановить B]\n    end\n```<\/code><\/pre><p><b>Дополнение (2023-2024):<\/b><\/p>\n<ul>\n<li><b>Фреймворки<\/b>:\n<ul>\n  <li>Apache Flink**: Де-факто стандарт для сложных stateful-вычислений с `exactly-once` семантикой. Поддерживает `event time`, `watermarks` (для обработки событий, пришедших не по порядку) и гибкие окна агрегации.<\/li>\n  <li>Kafka Streams \/ ksqlDB**: Для более простых задач обработки в рамках экосистемы Kafka. Идеально для микросервисов.<\/li>\n  <li>Apache Spark Streaming \/ Structured Streaming**: Позволяет использовать привычные API Spark для потоков.<\/li>\n<\/ul>\n<\/li>\n<li><b>Работа с состоянием (Stateful Processing)<\/b>: Многие потоковые задачи требуют сохранения состояния (например, подсчёт уникальных пользователей за час). Современные фреймворки (Flink) позволяют хранить это состояние отказоустойчиво, часто используя RocksDB локально и чекпоинты в удаленном хранилище (S3\/HDFS).<\/li>\n<li><b>Real-time OLAP \/ Data Warehousing<\/b>: Появляется класс решений, которые строят агрегаты и индексы напрямую из логов для интерактивных аналитических запросов (например, ClickHouse, Apache Druid, Materialize).<\/li>\n<li><b>GPU-ускорение<\/b>: Для ML-инференса и сложных расчетов на потоках, где время критично (например, обнаружение аномалий, фрод-мониторинг), начинают использоваться GPU-ускоренные библиотеки (NVIDIA RAPIDS).<\/li>\n<\/ul>\n<p><b>Ошибки, которых стоит избегать:<\/b><\/p>\n<ol start=\"1\">\n<li><b>Игнорирование late data<\/b>: События в реальном мире не всегда приходят по порядку. Используйте `watermarks` и `event time` для корректной обработки “поздних” данных.<\/li>\n<li><b>Репроцессинг “на потом”<\/b>: Откладывание возможности репроцессинга приводит к накоплению технического долга и невозможности быстро исправлять ошибки в логике. Заложите её в архитектуру с самого начала.<\/li>\n<li><b>Чрезмерное усложнение<\/b>: Не пытайтесь написать собственный потоковый движок. Используйте проверенные фреймворки, они уже решили большинство проблем с распределенностью, отказоустойчивостью и производительностью.<\/li>\n<\/ol>\n<p>---<\/p>\n<h4><b>Глава 4: Логи как фундамент для отказоустойчивых систем<\/b><\/h4>\n<p>Помимо интеграции и потоковой обработки, логи играют решающую роль в построении самих распределенных систем, упрощая их внутреннюю архитектуру.<\/p>\n<p><b>Паттерн “Сервис = Лог + Serving Layer”<\/b><br \/>\nВ этом паттерне логика сервиса разделяется на две основные части:<\/p>\n<ol start=\"1\">\n<li><b>Лог (The Log)<\/b>: Выступает как *единственный источник истины* для всех изменений состояния сервиса. Все записи (события, команды) сначала попадают в лог.<\/li>\n<li><b>Serving Layer (Слой обслуживания\/запросов)<\/b>: Это набор вычислительных узлов, которые подписываются на лог и строят локальные, оптимизированные для запросов, представления данных (индексы).\n<ul>\n  <li>Пример: Пользователь хочет обновить свой профиль. Запрос на обновление фиксируется как событие в логе. Serving Layer, потребляя это событие, обновляет свою локальную копию данных (например, в базе данных или поисковом индексе Elasticsearch). Когда пользователь запрашивает профиль, запрос идет в Serving Layer.<\/li>\n  <li><b>Преимущество<\/b>: Serving Layer может быть оптимизирован под конкретный тип запроса (например, Elasticsearch для полнотекстового поиска, Redis для быстрого key-value доступа), но при этом получать все данные из единого, надежного лога.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/gavrilov.info\/pictures\/Snimok-ekrana-2025-08-06-v-00.03.18.png\" width=\"1090\" height=\"372\" alt=\"\" \/>\n<\/div>\n<pre class=\"e2-text-code\"><code class=\"\">```mermaid\ngraph TD\n    A[Client] --&gt; B[API Gateway\/Микросервис записи]\n    B -- Записывает событие\/изменение --&gt; C(Центральный Лог)\n\n    C -- Подписывается --&gt; D[Serving Layer 1 (напр. Elasticsearch)]\n    C -- Подписывается --&gt; E[Serving Layer 2 (напр. Redis Cache)]\n    C -- Подписывается --&gt; F[Serving Layer 3 (напр. Data Warehouse)]\n\n    A -- Читает --&gt; D\n    A -- Читает --&gt; E\n```<\/code><\/pre><p><b>Преимущества такой архитектуры:<\/b><\/p>\n<ul>\n<li><b>Отказоустойчивость и восстановление<\/b>: Если Serving Layer упадет, он может полностью восстановить свое состояние, “проиграв” лог с самого начала или с последнего чекпоинта. Лог является его бэкапом.<\/li>\n<li><b>Изоляция сбоев<\/b>: Падение одного Serving Layer не влияет на способность других Serving Layer’ов продолжать работу.<\/li>\n<li><b>Детерминированность<\/b>: Гарантия порядка из лога обеспечивает согласованность данных во всех Serving Layer’ах.<\/li>\n<li><b>Горизонтальное масштабирование<\/b>: Лог можно партиционировать (делим данные на части), и каждый Serving Layer может обрабатывать одну или несколько партиций, что позволяет добавлять узлы по мере роста нагрузки.<\/li>\n<li><b>Отсутствие блокировок<\/b>: Поскольку записи идут в лог, а чтение происходит из Serving Layer, это значительно снижает конкуренцию и улучшает параллелизм.<\/li>\n<\/ul>\n<p><b>Log Compaction: Компактирование истории<\/b><br \/>\nНе всегда нужно хранить полную историю каждого изменения. Например, если вы отслеживаете текущее местоположение курьера, вам нужна только *последняя* координата, а не весь его путь.<\/p>\n<ul>\n<li><b>Log Compaction (компактирование лога)<\/b> – это процесс, при котором для каждого ключа в логе сохраняется только его *последнее* значение, а все предыдущие дубликаты удаляются.  <br \/>\nЭто позволяет логу действовать как <b>changelog<\/b> (журнал изменений), который, будучи проигранным с начала, воссоздаст *текущее* состояние распределенной таблицы.<\/li>\n<li><b>Пример<\/b>: Kafka умеет выполнять компактирование топиков, что идеально подходит для хранения состояния Key-Value пар (например, текущие балансы счетов, последние известные IP-адреса).<\/li>\n<\/ul>\n<p><b>Дополнение (2023-2024):<\/b><\/p>\n<ul>\n<li><b>Event Sourcing<\/b>: Паттерн, при котором основное состояние приложения сохраняется как последовательность событий в логе, а не как изменяемое состояние в базе данных. Состояние агрегатов получается путем применения всех событий.<\/li>\n<li><b>Command Query Responsibility Segregation (CQRS)<\/b>: Часто используется вместе с Event Sourcing. Команды (изменения) записываются в лог, а запросы (чтения) обслуживаются из оптимизированных для чтения материализованных представлений, построенных из того же лога.<\/li>\n<li><b>Saga Pattern<\/b>: Для координации долгих распределенных транзакций между множеством микросервисов, лог событий часто используется как механизм асинхронной связи и координации. Каждый сервис публикует событие о завершении своей части работы, а координатор Саги реагирует на эти события.<\/li>\n<li><b>Kubernetes Operators<\/b>: Для управления сложностью распределенных лог-систем, таких как Kafka, существуют Kubernetes Operators, которые автоматизируют развертывание, масштабирование, восстановление и обновление кластеров.<\/li>\n<li><b>Observability (наблюдаемость)<\/b>: Логи — это не только данные, но и инструмент для понимания поведения системы. Добавьте трассировку (`trace_id` в события) для отслеживания пути запроса через множество микросервисов и логов. Анализируйте `consumer lag` (отставание потребителей) как ключевую метрику здоровья потоковой системы.<\/li>\n<\/ul>\n<p><b>Ошибки, которых стоит избегать:<\/b><\/p>\n<ol start=\"1\">\n<li><b>“Я напишу свою Kafka”<\/b>: Построение надежной распределенной лог-системы чрезвычайно сложно. Используйте проверенные решения (Kafka, Pulsar).<\/li>\n<li><b>Забыть о версионировании<\/b>: Изменения в структуре событий могут сломать старых потребителей. Используйте Schema Registry и стратегии совместимости схем (backward\/forward compatibility).<\/li>\n<li><b>Ручное управление состоянием<\/b>: Не пытайтесь управлять состоянием stateful-приложений вручную. Доверьте эту задачу фреймворкам потоковой обработки, которые используют лог для отказоустойчивости.<\/li>\n<\/ol>\n<p>---<\/p>\n<h4><b>Глава 5: Безопасность, Надежность и Операционная Эффективность<\/b><\/h4>\n<p>Лог, будучи “источником истины” и “кровеносной системой” данных, требует самого высокого уровня внимания к безопасности, надежности и операционной эффективности.<\/p>\n<p><b>Безопасность (Security): Доверяй, но проверяй<\/b><\/p>\n<ol start=\"1\">\n<li><b>Шифрование данных<\/b>:\n<ul>\n  <li><b>В пути (In-transit Encryption)<\/b>: Всегда используйте TLS (Transport Layer Security) для обмена данными между клиентами (продюсерами\/потребителями) и брокерами лога, а также между самими брокерами.<\/li>\n  <li><b>В состоянии покоя (At-rest Encryption)<\/b>: Шифруйте данные на диске, где хранятся логи. Это может быть реализовано на уровне операционной системы, файловой системы или диска (LUKS, AWS EBS Encryption).<\/li>\n<\/ul>\n<\/li>\n<li><b>Аутентификация и Авторизация (Authentication & Authorization – RBAC)<\/b>:\n<ul>\n  <li><b>Аутентификация<\/b>: Убедитесь, что только доверенные клиенты могут подключаться к лог-системе (например, с помощью SASL\/Kerberos, SSL-сертификатов или OAuth 2.0).<\/li>\n  <li><b>Авторизация (RBAC)<\/b>: Применяйте принцип наименьших привилегий. Контролируйте, кто может записывать в конкретные топики, а кто может читать из них. Отдельные приложения могут иметь разрешения только на чтение из определённых топиков и запись в свои собственные выходные топики.<\/li>\n<\/ul>\n<\/li>\n<li><b>Аудит (Auditing)<\/b>: Включите логи аудита для всех действий в лог-системе (кто, когда, что изменил или прочитал).<\/li>\n<\/ol>\n<p><b>Надежность (Reliability): Будьте готовы ко всему<\/b><\/p>\n<ol start=\"1\">\n<li><b>Репликация данных<\/b>: Для обеспечения надежности критически важные данные должны быть реплицированы. В Kafka это достигается за счет репликации партиций между брокерами. Определите `replication factor` (фактор репликации) в зависимости от критичности данных (обычно 3).<\/li>\n<li><b>Диспетчер сбоев (Disaster Recovery)<\/b>:\n<ul>\n  <li><b>Внутрикластерная отказоустойчивость<\/b>: Лог-система должна быть способна выдержать отказ отдельных узлов или зон доступности (Availability Zones) без потери данных.<\/li>\n  <li><b>Географическая репликация<\/b>: Для защиты от сбоев целых дата-центров используйте мульти-кластерные развертывания с гео-репликацией (например, MirrorMaker2 для Kafka).<\/li>\n<\/ul>\n<\/li>\n<li><b>Idempotence Producers<\/b>: Убедитесь, что продюсеры могут повторно отправлять сообщения при сбоях без создания дубликатов, достигая `at-least-once` или `exactly-once` семантики.<\/li>\n<li><b>At-least-once, At-most-once, Exactly-once Semantics<\/b>: Понимайте и выбирайте подходящую семантику доставки сообщений для каждого пайплайна. `Exactly-once` сложнее всего, но обеспечивает максимальную точность.<\/li>\n<\/ol>\n<p><b>Операционная Эффективность (Operational Efficiency): Не замедляйтесь<\/b><\/p>\n<ol start=\"1\">\n<li><b>Партиционирование<\/b>: Правильное партиционирование топиков критически важно.\n<ul>\n  <li>Должно быть достаточно партиций для параллельной обработки.<\/li>\n  <li>Ключи партиционирования должны распределять нагрузку равномерно.<\/li>\n  <li><b>Ошибка<\/b>: Недостаточное количество партиций может привести к узким местам. Слишком много партиций усложняет управление и увеличивает нагрузку на брокеры.<\/li>\n<\/ul>\n<\/li>\n<li><b>Батчинг (Batching)<\/b>: Соединяйте мелкие записи в большие “пакеты” перед отправкой в лог. Это значительно уменьшает накладные расходы на I\/O и сетевые операции.<\/li>\n<li><b>Zero-Copy<\/b>: Используйте механизмы, позволяющие передавать данные из лога напрямую в сетевой сокет, минуя буферы приложения для копирования. Это снижает нагрузку на CPU.<\/li>\n<li><b>Мониторинг<\/b>: Ключ к здоровой системе.\n<ul>\n  <li><b>Метрики брокеров<\/b>: CPU, память, диск I\/O, сетевой трафик, количество сообщений, пропускная способность.<\/li>\n  <li><b>Метрики топиков<\/b>: Размер, количество партиций, скорость записи\/чтения.<\/li>\n  <li><b>Метрики потребителей<\/b>: <b>Consumer Lag<\/b> (отставание потребителей) — это самая важная метрика. Если `consumer lag` растет, значит, потребитель не справляется с нагрузкой, и данные накапливаются.<\/li>\n  <li><b>Алерты<\/b>: Настройте оповещения на критические метрики (высокий `consumer lag`, ошибки записи\/чтения, недоступность брокеров).<\/li>\n<\/ul>\n<\/li>\n<li><b>Логирование и Трассировка<\/b>: Стандартизируйте форматы логов приложений, отправляющих и потребляющих данные из лога. Включите корреляционные ID (`trace_id`, `span_id`) для отслеживания событий через всю распределенную систему (например, с помощью OpenTelemetry).<\/li>\n<li><b>Управление ресурсами<\/b>: Убедитесь, что у брокеров лога достаточно ресурсов (CPU, RAM, диск I\/O) для обработки пиковых нагрузок. Используйте быстрые диски (SSD\/NVMe).<\/li>\n<\/ol>\n<p><b>Дополнение (2023-2024): Chaos Engineering<\/b><\/p>\n<ul>\n<li>Для проверки устойчивости вашей лог-инфраструктуры к сбоям, регулярно проводите эксперименты в контролируемой среде.<\/li>\n<li>Примеры**: Имитация отказа брокера (убиваем процесс), сетевые проблемы (Partition), перегрузка диска, увеличение задержки для потребителя. Это помогает выявлять слабые места *до* того, как они проявятся в продакшене.<\/li>\n<\/ul>\n<p>---<\/p>\n<h4><b>Заключение: пошаговый план к Data-Driven Будущему<\/b><\/h4>\n<p>Мы проделали большой путь, от понимания фундаментальной природы лога до его роли в современных распределенных системах, интеграции данных и потоковой обработке. Лог — это не просто техническая деталь, а стратегический актив, который позволяет вашей компании быть по-настоящему “data-driven”.<\/p>\n<p><b>Краткие выводы:<\/b><\/p>\n<ul>\n<li><b>Лог — это источник истины<\/b>: Он хранит историю изменений в гарантированном порядке.<\/li>\n<li><b>Лог упрощает<\/b>: Он решает проблемы интеграции (N² → N), репликации и восстановления.<\/li>\n<li><b>Лог масштабирует<\/b>: Благодаря партиционированию и оптимизациям, таким как батчинг и zero-copy.<\/li>\n<li><b>Лог — это кровь в организме данных<\/b>: Без него невозможно построить гибкую, реактивную и отказоустойчивую архитектуру.<\/li>\n<li><b>Kappa лучше Lambda<\/b>: Одна кодовая база для realtime и batch обработки.<\/li>\n<\/ul>\n<p><b>Ваш пошаговый план к Data-Driven Архитектуре, управляемой логами:<\/b><\/p>\n<ol start=\"1\">\n<li><b>Начните с аудита источников данных<\/b>:\n<ul>\n  <li>Определите, какие данные генерируются вашими системами, какие из них критически важны, какие меняются со временем.<\/li>\n  <li>Поймите, где находятся “узкие места” в текущей интеграции.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<ol start=\"2\">\n<li><b>Выберите платформу логов<\/b>:\n<ul>\n  <li><b>Выбор<\/b>: Apache Kafka — это де-факто стандарт. Рассмотрите Apache Pulsar как альтернативу, если вам нужна расширенная гибкость.<\/li>\n  <li><b>Развертывание<\/b>: Для начала можно использовать управляемые облачные сервисы (Confluent Cloud, AWS MSK, Azure Event Hubs) или самостоятельно развернуть Kafka в Kubernetes с помощью операторов. Не пытайтесь строить свой велосипед.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<ol start=\"3\">\n<li><b>Внедрите Schema Registry<\/b>:\n<ul>\n  <li>Это не опция, а <b>обязательное условие<\/b>.<\/li>\n  <li>Соберите команды, которые генерируют данные, и начните совместно разрабатывать строгие схемы для каждого типа событий (Avro\/Protobuf).<\/li>\n  <li>*Рекомендация*: Внедрите процесс `data contract` – соглашения между командами о формате и семантике данных.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<ol start=\"4\">\n<li><b>Инструментируйте ключевые сервисы для публикации в лог<\/b>:\n<ul>\n  <li>Начните с одного или двух высоконагруженных сервисов.<\/li>\n  <li>Используйте <b>Change Data Capture (CDC)<\/b> (например, Debezium) для выгрузки изменений из баз данных в лог.<\/li>\n  <li>Для новых сервисов и пользовательских действий изначально проектируйте их как <b>Event Sourcing<\/b>-системы, публикующие события в лог.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<ol start=\"5\">\n<li><b>Настройте базовых потребителей и хранилища<\/b>:\n<ul>\n  <li>Автоматизируйте загрузку данных из лога в ваше основное аналитическое хранилище (Data Warehouse, Data Lake, например, S3\/HDFS + Spark\/Hive).<\/li>\n  <li>Подключите первый “реальный” потребитель, например, систему мониторинга, которая отслеживает ключевые показатели бизнеса на основе событий из лога.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<ol start=\"6\">\n<li><b>Разверните платформу потоковой обработки<\/b>:\n<ul>\n  <li>Начните с Apache Flink или Kafka Streams. Они позволят вам обрабатывать данные из лога, обогащать их, агрегировать и создавать новые, производные потоки данных.<\/li>\n  <li>*Рекомендация*: Сначала решайте простые задачи (агрегаты, фильтрация), затем переходите к более сложным (stateful processing, windowing).<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<ol start=\"7\">\n<li><b>Сосредоточьтесь на Observability и Автоматизации<\/b>:\n<ul>\n  <li>Внедрите комплексный мониторинг всей лог-инфраструктуры (брокеры, топики, потребители) с ключевыми метриками (consumer lag!).<\/li>\n  <li>Настройте алерты.<\/li>\n  <li>Автоматизируйте процессы развертывания, масштабирования и восстановления лог-компонентов.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<ol start=\"8\">\n<li><b>Имплементируйте принципы безопасности<\/b>:\n<ul>\n  <li>Шифрование, аутентификация, авторизация. Пусть это будет часть каждого нового внедрения.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<ol start=\"9\">\n<li><b>Готовьтесь к репроцессингу<\/b>:\n<ul>\n  <li>Убедитесь, что ваши логи хранят достаточно истории (длительный retention).<\/li>\n  <li>Проектируйте свои потоковые приложения с учетом возможности запуска нового экземпляра для пересчета исторических данных.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<ol start=\"10\">\n<li><b>Примите философию Data Mesh<\/b>:\n<ul>\n  <li>Меняйте культуру: поощряйте команды владеть своими данными как продуктами.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>---<\/p>\n<p><b>Эпилог: Лог – это не просто техническая деталь, а отражение бизнес-процессов. Каждая запись – атом вашей организационной ДНК. Превратите хаос данных в нарратив, где каждая транзакция – это предложение, а каждый поток – глава вашей бизнес-истории, благодаря надежной и гибкой кровеносной системе, управляемой логами.<\/b><\/p>\n",
            "date_published": "2025-08-06T00:37:25+03:00",
            "date_modified": "2025-08-06T00:31:36+03:00",
            "tags": [
                "Data",
                "Data Engineer",
                "Data Products",
                "Kafka"
            ],
            "image": "https:\/\/gavrilov.info\/pictures\/Snimok-ekrana-2025-08-06-v-00.11.45.png",
            "_date_published_rfc2822": "Wed, 06 Aug 2025 00:37:25 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "259",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/gavrilov.info\/pictures\/Snimok-ekrana-2025-08-06-v-00.11.45.png",
                    "https:\/\/gavrilov.info\/pictures\/Snimok-ekrana-2025-08-06-v-00.24.03.png",
                    "https:\/\/gavrilov.info\/pictures\/Snimok-ekrana-2025-08-06-v-00.05.12.png",
                    "https:\/\/gavrilov.info\/pictures\/Snimok-ekrana-2025-08-06-v-00.04.01.png",
                    "https:\/\/gavrilov.info\/pictures\/Snimok-ekrana-2025-08-06-v-00.03.18.png"
                ]
            }
        },
        {
            "id": "164",
            "url": "https:\/\/gavrilov.info\/all\/zapusk-kafka-na-s3\/",
            "title": "Запуск Kafka на s3",
            "content_html": "<p>Оригинал: <a href=\"https:\/\/medium.com\/thedeephub\/how-do-we-run-kafka-100-on-the-object-storage-521c6fec6341\">https:\/\/medium.com\/thedeephub\/how-do-we-run-kafka-100-on-the-object-storage-521c6fec6341<\/a><br \/>\n<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\">А тут pdf’ка <\/a><\/p>\n<p>Не стал переводить<\/p>\n",
            "date_published": "2024-09-29T21:19:13+03:00",
            "date_modified": "2024-09-29T21:19:08+03:00",
            "tags": [
                "Data Engineer",
                "Kafka"
            ],
            "_date_published_rfc2822": "Sun, 29 Sep 2024 21:19:13 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "164",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": []
            }
        }
    ],
    "_e2_version": 4171,
    "_e2_ua_string": "Aegea 11.4 (v4171e)"
}