┌─────────────────────────┐ ┌──────────┐ ┌──────────────────────┐
│ Основное приложение │ ───────> │ Kafka │────────>│ Микросервис аналитики│
│ (Producer and Consumer) │ События │ │ События │ (Consumer) │
└─────────────────────────┘ └──────────┘ └──────────────────────┘
▲ │
│ │
│ ┌──────────┐ │
└──────────────────│ Kafka │<───────────────────────────┘
Агрегированные │ │ Агрегированные данные
данные └──────────┘ (каждую 1 минуту)
Основное приложение отправляет события в Kafka при действиях пользователей:
| Действие | Контроллер/Сервис | Топик | Ключ партиционирования |
|---|---|---|---|
| Просмотр книги |
BookController.getBookById()
|
book.views
|
bookId
|
| Скачивание книги |
BookFileController.downloadBook()
|
book.downloads
|
userId
|
| Покупка книги |
StripeService.handlePaymentSuccess()
|
book.purchases
|
userId
|
| Создание/обновление отзыва |
ReviewController
|
book.reviews
|
bookId
|
| Создание/обновление рейтинга |
RatingController
|
book.ratings
|
bookId
|
Микросервис аналитики подписывается на топики и активно запрашивает (polls) события из Kafka:
Как это работает:
Важно: Kafka не отправляет данные автоматически -
микросервис сам запрашивает их через метод poll()
Важно: Это два разных процесса в микросервисе аналитики:
Типы агрегированных данных:
BOOK_STATS - статистика по каждой книгеSYSTEM_OVERVIEW - общая статистика системыPOPULAR_BOOKS - список популярных книг
Основное приложение также использует Kafka Consumer и
активно запрашивает (polls) агрегированные данные из
топика analytics.aggregated-stats:
Как это работает:
analytics.aggregated-stats
book_analytics, system_analytics)
Зачем: Параллельная обработка и гарантия порядка для связанных событий
Как работает:
partition = hash(key) % numberOfPartitions
Пример:
Топик book.views (3 партиции):
Partition 0: [bookId=3] [bookId=6]
Partition 1: [bookId=1] [bookId=1] ← Все события bookId=1 здесь
Partition 2: [bookId=2] [bookId=5]
Зачем: Распределение нагрузки между несколькими экземплярами сервиса
Как работает:
Пример:
Consumer Group: analytics-service-group
- Consumer 1 → обрабатывает Partition 0
- Consumer 2 → обрабатывает Partition 1
- Consumer 3 → обрабатывает Partition 2
Зачем: Отслеживание позиции чтения, чтобы не потерять сообщения
Как работает:
analytics.aggregated-stats)
analytics.aggregated-stats и сохраняет их в БД
| Топик | Партиций | Ключ | Назначение |
|---|---|---|---|
book.views
|
3 |
bookId
|
События просмотра книг |
book.downloads
|
3 |
userId
|
События скачивания книг |
book.purchases
|
2 |
userId
|
События покупки книг |
book.reviews
|
2 |
bookId
|
События создания/обновления отзывов |
book.ratings
|
2 |
bookId
|
События создания/обновления рейтингов |
analytics.aggregated-stats
|
2 |
aggregationType
|
Агрегированная статистика (обратный поток) |
Kafka UI (http://localhost:8089) (admin, admin):