Как правильно организовать журнал событий в распределённой системе?

Ситуация такова: у нас есть приложение, которое автоматически обзванивает пользователей, обслуживая миллионы абонентов в день. Это приложение состоит из множества сервисов, включая интерфейсы настроек, компоненты для телефонии, черные списки и управление пользователями. 

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

Все это работает в среде Kubernetes. В связи с появившейся необходимостью, возник вопрос: каким образом можно реализовать функциональность журнала событий наиболее эффективно? На данный момент предлагается идея использовать Kafka для передачи сообщений о каждом событии из всех сервисов в едином формате (который ещё предстоит разработать). Мы планируем подключить сервис-слушатель, который будет считывать сообщения из Kafka и записывать их в ClickHouse в согласованном виде с такими параметрами как: сервис, пользователь, IP (где это применимо), тип операции (read/update/write/delete), данные операции (в формате JSON) и дата+время.

Далее, фронтенд-сервис будет получать данные по необходимым фильтрам. Это звучит хорошо, но у нас есть некоторые сомнения.
  • 10 сентября 2024 г. 15:33
Ответы на вопрос 2
Ваше предложение по организации журнала событий в распределенной системе выглядит весьма разумным, особенно с учетом использования Kafka и ClickHouse. Однако давайте рассмотрим некоторые аспекты, которые могут помочь вам улучшить вашу систему и развеять некоторые сомнения.

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

### 2. Ведение журнала
Решая, что записывать в журнал событий, убедитесь, что ваши записи содержат достаточно контекста. Например, если действие связано с вызовом API, включите идентификатор запроса. Это может помочь в случае отладки и анализа.

### 3. Обработка событий
Использование Kafka для передачи сообщений является разумным. Убедитесь, что у вас настроен правильный уровень устойчивости к сбоям: закрепите данные на одних или нескольких брокерах, чтобы избежать потери сообщений. Рассмотрите возможность применения схемы "после завершения" (at-least-once) для гарантии обработки всех событий.

### 4. Убеждение в согласованности данных
Когда ваш сервис-слушатель записывает данные в ClickHouse, позаботьтесь о том, чтобы обрабатывать возможные дубликаты. К примеру, можно использовать уникальные идентификаторы для операций, чтобы избежать повторной записи одного и того же события.

### 5. Безопасность и доступность
Поскольку у вас есть информация о пользователях и их действиях, рассмотрите управление доступом и шифрование. Убедитесь, что только авторизованные пользователи могут видеть специфическую информацию в журнале.

### 6. Фильтрация и агрегация
Для фронтенд-сервиса подумайте о кешировании часто запрашиваемых данных или создание агрегационного сервиса, который будет собирать данные и хранить их в оптимизированном виде для ускорения запросов. Например, использование Materialized Views в ClickHouse для предобработанных данных.

### 7. Мониторинг и алертинг
Настройте мониторинг вашего журнала и системы в целом. Это может быть реализация метрик на уровне Kafka и ClickHouse, а также отслеживание задержек обработки событий в реальном времени.

### 8. Масштабирование
Убедитесь, что архитектура решения позволяет масштабировать сервисы независимо. Если нагрузка на журнал событий возрастет, то будет хорошо, если вы сможете вертикально и горизонтально масштабировать обработчик событий и ClickHouse без ощутимых последствий для производительности.

### 9. Тестирование
Система должна специально тестироваться на высоких нагрузках. Имейте в виду, как ваша инфраструктура будет вести себя при разных сценариях, таких как # пиковые нагрузки из-за непредвиденных событий, сбоев одного из сервисов и т.д.

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

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