Практическое руководство по построению надёжной конвейерной обработки на Apache Kafka для нагрузки ~10 миллионов событий в сутки. Разбор шардирования, настройки consumer group, мониторинга lag и оптимизаций, которые сработали в 2025–2026 годах.
Статья была полезной?
Система обрабатывала около 10 миллионов событий в сутки с пиковыми всплесками до 18 тысяч событий в секунду. В статье описано, как была спроектирована архитектура на Apache Kafka, какие шаги привели к стабильной работе и какие метрики помогли обнаружить узкие места.
Цель: обеспечить приём, буферизацию и обработку 10 000 000 событий в сутки (ключевая фраза для SEO: kafka 10 миллионов событий) с задержкой обработки менее 30 секунд для 95% событий и гарантией доставки «по крайней мере один раз». Проект стартовал в августе 2025 года, этапы внедрения завершались до марта 2026 года.
Входные события — телеметрия от мобильных приложений и backend-сервисов, средний размер сообщения — 1,2 КБ, пиковая нагрузка (short burst) — до 18 000 сообщений/сек, средняя нагрузка за сутки ≈ 116 сообщений/сек. Существенная характеристика — сильно выраженная пиковая активность в рабочие часы и пиковые пользовательские акции.
Архитектура базируется на следующем стеке:
Основная задача шардирования — обеспечить достаточный уровень параллелизма и избежать «горячих» партиций при пиковых нагрузках. Для kafka 10 миллионов событий в сутки ключевым было правильно подобрать количество партиций и схему ключирования.
Мы провели нагрузочные тесты в сентябре 2025: синтетические данные с тем же распределением ключей показали, что для устойчивой обработки всплесков до 18k msg/s оптимально иметь 150–300 партиций на основной топик. Итоговое решение — 200 партиций с replication.factor=3. Обоснование:
Ошибка большинства — привязывать ключи к ограниченному набору значений, что создаёт «горячие» партиции. Мы использовали следующий подход:
// Пример простого салтинга на Java
String key = String.valueOf(userId);
int salt = Math.abs(key.hashCode()) % 8; // 0..7
String partitionedKey = salt + "_" + key;
producer.send(new ProducerRecord<>(topic, partitionedKey, payload));Кроме распределения по ключу, важно было контролировать максимальный размер партиций и периодически выполнять compact/cleanup по политике retention, чтобы не накапливать лишние данные.
При обработке kafka 10 миллионов событий факт наличия корректной consumer group архитектуры был критичен для параллельной обработки и для управления перезапусками. Ключевые моменты — размер группы, rebalance strategy и обработка ошибок.
Правило: количество активных консьюмеров в группе не должно превышать числа партиций. Для 200 партиций мы целились в 120–180 консьюмеров по необходимости перераспределяя загрузку между нескольких групп (streaming vs batch).
Мы использовали новый CooperativeStickyAssignor (available в Kafka 3.x) для снижения времени остановки при ребалансах. Это позволило минимизировать «стопы» обработки при увеличении/уменьшении числа консьюмеров. Настройки клиентской стороны (пример для Java):
props.put("partition.assignment.strategy",
"org.apache.kafka.clients.consumer.CooperativeStickyAssignor");
props.put("max.poll.interval.ms", "300000"); // 5 мин, чтобы дольше было время на обработку
props.put("session.timeout.ms", "10000");
props.put("heartbeat.interval.ms", "3000");Чтобы избежать дублирования при retry мы ввели:
// Пример на Java: ручной коммит после обработки batch
consumer.poll(Duration.ofMillis(1000));
try {
processBatch(records);
consumer.commitSync();
} catch (ProcessingException e) {
// логируем и отправляем в DLQ
}Мониторинг lag — один из важнейших индикаторов здоровья pipeline при kafka 10 миллионов событий: он показывает, успевают ли консьюмеры обрабатывать сообщения и где появляются узкие места.
Использовали Prometheus + Grafana с готовыми дашбордами, дописанными в 2026:
Пример правила в Alertmanager (схематично):
ALERT KafkaConsumerLagHigh
IF kafka_consumergroup_lag_sum{group="processor-group\
Комментарии (0)
Войдите или зарегистрируйтесь, чтобы оставить комментарий
Загрузка комментариев…