Logo

Apache Kafka: От LinkedIn до Northguard – Эволюция Потоковых Данных

Apache Kafka, разработка LinkedIn 2010 года, позволяет обрабатывать триллионы сообщений ежедневно. В 2025 году LinkedIn разрабатывает Northguard, новую систему, не заменяющую, но дополнящую Kafka.

16 жовтня 2025 р., 20:36
7 мин чтения

Apache Kafka: Анализ эволюции инфраструктурной опоры LinkedIn и её мирового влияния

Будучи краеугольным камнем современной распределённой инфраструктуры, Apache Kafka, разработанная LinkedIn в 2010 году, превратилась в ключевой инструмент для асинхронной передачи потоковых данных в реальном времени, но даже для своего создателя она не остаётся универсальным решением.

LinkedIn, один из пионеров в области обработки больших данных, столкнулся с острой необходимостью создания масштабируемой и отказоустойчивой системы для управления постоянно растущим объёмом пользовательских данных и системных метрик. К 2025 году Kafka, названная в честь писателя Франца Кафки Джеем Крепсом, Нией Нархид и Цзюнем Жао, стала де-факто стандартом в области потоковой обработки данных, способной ежедневно обрабатывать триллионы сообщений. Однако, как показала недавняя практика LinkedIn, даже её создатель ищет новые решения для своих планетных масштабов, разрабатывая новую систему Northguard.

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

Исторический контекст: До-Kafka эра LinkedIn

До появления Kafka инфраструктура обработки данных в LinkedIn была фрагментирована и демонстрировала существенные ограничения:

  • Пакетная обработка: Ежечасно данные о событиях на сайте (посты, комментарии, лайки, просмотры), использовавшиеся для рекомендательных алгоритмов и защиты от мошенничества, сохранялись в формате XML и передавались в хранилище крупными партиями. Такой подход вносил значительные задержки в доступность данных.
  • Пайплайн реального времени: Метрики, требующие мгновенного мониторинга (состояние серверов, ошибки, алерты), отправлялись в систему Zenoss.
  • Ручное сопровождение: Поддержка и обновление обоих пайплайнов, включая добавление новых метрик или источников, требовали значительных ресурсов двух отдельных небольших команд. Это приводило к проблемам с масштабируемостью, стабильностью и общей неудобностью эксплуатации. Сбои в этих системах напрямую влияли на работоспособность веб-сайта.

К 2011 году Kafka уже обрабатывала более миллиарда событий в день, демонстрируя свою эффективность в решении задач, с которыми сталкивались компании, работающие с крупными объёмами данных.

Архитектурные преимущества Kafka

Kafka радикально отличается как от традиционных реляционных баз данных, так и от классических брокеров сообщений.

Отличия от классических баз данных:

  • Ориентация на потоковую обработку: В отличие от SQL-баз, сфокусированных на хранении структурированных данных и сложных запросах, Kafka создана для обработки непрерывных потоков событий.
  • Хранение данных как событий: Kafka не предназначена для полнотекстового поиска; она сохраняет события в топиках для последующей обработки.
  • Сообщения вместо записей: Данные в Kafka организованы в виде сообщений, которые могут быть как структурированными, так и неструктурированными.
  • Отказоустойчивость и масштабируемость: Kafka изначально спроектирована с учётом горизонтального масштабирования, позволяя добавлять брокеры и партиции для обработки больших объёмов данных, обеспечивая репликацию и отказоустойчивость, что является «нативным» для её архитектуры.

Отличия от классических брокеров сообщений (например, RabbitMQ):

Несмотря на возможность использовать Kafka как очередь сообщений, её архитектура ближе к «шине данных».

  • Архитектура: Kafka - это распределённая система потоковой обработки, оптимальная для сценариев с непрерывными потоками событий и аналитикой в реальном времени. RabbitMQ - это классический брокер сообщений, реализующий паттерн очередей для гарантированной доставки и изоляции компонентов.
  • Сохранение сообщений: Kafka хранит сообщения в течение заданного времени (или постоянно, в зависимости от объёма хранилища), тогда как RabbitMQ удаляет сообщения после их обработки и подтверждения потребителем.
  • Сложность настройки: Из-за распределённой архитектуры Kafka может быть сложнее в настройке по сравнению с RabbitMQ, который обычно проще для освоения.
  • Производительность: Kafka демонстрирует высокую производительность и низкую задержку благодаря оптимизированной структуре хранения и обработки потоков, превосходя RabbitMQ при больших объёмах сообщений.

Kafka также предлагает Streams API и возможности интеграции с внешними инструментами (Apache Flink, Spark, Samza), что позволяет не только хранить, но и обрабатывать данные в реальном времени непосредственно в потоке.

Применение Apache Kafka

Kafka хорошо подходит для ряда технических задач, таких как:

  • Агрегация событий и логов: Например, анализ кликстрима или разделение данных от ботов и реальных пользователей.
  • IoT-приложения: Мониторинг данных с сенсоров и устройств.
  • Распределение событий: Доставка одного события множеству потребителей без усложнения бизнес-логики.
  • Системы уведомлений: Отправка сообщений о событиях (новые заказы, обновления статусов).
  • Обработка огромных массивов данных: Масштабируемая архитектура Kafka позволяет работать с большими объёмами данных.
  • Разработка Event-Driven систем: Kafka служит источником истины для микросервисов, обеспечивая отказоустойчивость и надёжность, позволяя параллельную обработку событий через партиции.
  • Stream-processing и CDC (Change Data Capture): Использование в качестве промежуточного хранилища для переноса данных между системами.

Тем не менее, Kafka может быть избыточной для небольших проектов без требований к обработке данных в реальном времени. Она не подходит для тривиальных баз данных, сценариев, где не требуется потоковое чтение, или для очередей, требующих сложных схем обработки сообщений (например, request/reply, которые лучше реализуются в RabbitMQ).

Будущее Kafka и новые вызовы

Хотя Kafka остаётся мощным инструментом, активно используемым многими крупными компаниями, включая Netflix (которая ежедневно обрабатывает до 500 млрд событий с пиковой нагрузкой в 8 млн событий в секунду), ландшафт обработки данных постоянно меняется. В 2014 году основные авторы Kafka покинули LinkedIn, чтобы основать компанию Confluent, которая коммерциализовала проект и стала публичной в 2021 году с капитализацией в 10 млрд долларов.

Примечательно, что в 2025 году LinkedIn объявила о разработке новой системы Northguard для замены Kafka в отдельных сценариях, что свидетельствует о непрерывных попытках оптимизации инфраструктуры для удовлетворения растущих потребностей в «планетном масштабе». Это подчёркивает, что даже для технологий, ставших отраслевыми стандартами, развитие не останавливается, а поиск специализированных решений для конкретных задач остаётся актуальным. Как отметил Танвир Ахмед из LinkedIn, «ответ всегда будет зависеть от вашего конкретного случая использования».

Kafka, её структура данных «log» и экосистема API, включая Producer API, Consumer API, Connector API (например, Kafka Connect), Streams API (например, Kafka Streams), и Admin API, продолжает развиваться. В последних версиях Kafka (начиная с 2.8) обеспечена возможность работы без ZooKeeper, а репликация данных и управление отказами интегрированы напрямую.

Практическое применение: Apache Kafka as a Service

Для демонстрации простоты интеграции рассмотрим пример работы с Kafka, используя управляемый сервис, такой как Kafka-as-a-service от Selectel, актуальный на 2025 год.

  1. Создание кластера: Пользователь заказывает услугу Kafka-as-a-service через панель управления облачной платформой.
  2. Настройка безопасности: Загружается SSL-сертификат для защищённого подключения.
  3. Создание топиков и пользователей: Создаётся топик (например, "testtt") и пользователь с доступом к нему.

Пример кода на Python для записи данных в Kafka:

import json
import time
from kafka import KafkaProducer
from kafka.errors import KafkaError

# Настройки для подключения к Kafka
bootstrap_servers = 'kafka_address:9093'  # Указать адрес Kafka
topic = 'testtt'
username = 'natasha'
password = 'your_password' # Указать пароль
ssl_cafile = '/path/to/root.crt' # Путь к CA сертификату
ssl_certfile = '/path/to/root.crt' # Путь к клиентскому сертификату

weather_data = {
    "city": "SPb",
    "temperature": 42,
    "condition": "baby's on Fire!"
}
weather_json = json.dumps(weather_data)

producer = KafkaProducer(
    bootstrap_servers=bootstrap_servers,
    security_protocol='SASL_SSL',
    sasl_mechanism='SCRAM-SHA-512',
    sasl_plain_username=username,
    sasl_plain_password=password,
    ssl_cafile=ssl_cafile,
    ssl_certfile=ssl_certfile,
)
print(producer.config['api_version'])
while True:
    try:
        future = producer.send(topic, value=weather_json.encode())
        record_metadata = future.get(timeout=10)
        print(f"Sent message to topic {record_metadata.topic} partition {record_metadata.partition} offset {record_metadata.offset}")
    except KafkaError as e:
        print(f"Failed to send data: {e}")
    time.sleep(10)

Пример кода на Python для чтения данных из Kafka:

import json
from kafka import KafkaConsumer

# Настройки для подключения к Kafka
bootstrap_servers = 'kafka_address:9093' # Указать адрес Kafka
topic = 'testtt'
username = 'natasha'
password = 'your_password' # Указать пароль
ssl_cafile = '/path/to/root.crt' # Путь к CA сертификату
ssl_certfile = '/path/to/root.crt' # Путь к клиентскому сертификату

consumer = KafkaConsumer(
    topic,
    bootstrap_servers=bootstrap_servers,
    group_id='my-group',
    security_protocol='SASL_SSL',
    sasl_mechanism='SCRAM-SHA-512',
    sasl_plain_username=username,
    sasl_plain_password=password,
    ssl_cafile=ssl_cafile,
    ssl_certfile=ssl_certfile,
    auto_offset_reset='none',
    enable_auto_commit=False
)

for message in consumer:
    received_data = json.loads(message.value.decode())
    print("Received weather data:")
    print("City:", received_data["city"])
    print("Temperature:", received_data["temperature"])
    print("Condition:", received_data["condition"])
    print("-----------------------")
consumer.close()

Данные примеры, использовавшие библиотеку kafka-python, демонстрируют базовые операции записи и чтения, подчёркивая низкий порог входа для использования Kafka в облачных средах. Альтернативной библиотекой является confluent-kafka.

Таким образом, Kafka, созданная как ответ на специфические проблемы LinkedIn, превратилась в универсальное решение для потоковой обработки данных, способное адаптироваться к новым вызовам и оставаться актуальной даже при появлении более специализированных альтернатив.

Вопросы и ответы

Apache Kafka: Анализ эволюции инфраструктурной опоры LinkedIn и её мирового влияния
Исторический контекст: До-Kafka эра LinkedIn
Архитектурные преимущества Kafka
Отличия от классических баз данных:
Отличия от классических брокеров сообщений (например, RabbitMQ):
Применение Apache Kafka
Будущее Kafka и новые вызовы
Практическое применение: Apache Kafka as a Service
Настройки для подключения к Kafka
Настройки для подключения к Kafka