Ответ
Я использовал Apache Kafka в системе для обработки потока событий в реальном времени.
Основные показатели нагрузки:
- Пропускная способность: В среднем 50-100 тысяч сообщений в секунду (RPS), с пиками до 200k.
- Размер сообщений: Небольшие, в среднем 1-2 КБ (сериализованные в Protobuf).
- Скорость потока данных: ~100-200 МБ/с.
- Задержка (End-to-end latency): Старались удерживать в пределах 50-100 мс.
Ключевые аспекты и решения:
-
Конфигурация топиков: Основные топики имели 32 партиции для распараллеливания обработки и
replication-factor=3для обеспечения отказоустойчивости. -
Мониторинг: Ключевым элементом был мониторинг. Мы использовали Prometheus и Grafana для отслеживания:
Consumer Lag— главный показатель того, что консьюмеры справляются с нагрузкой.MessagesInPerSec— скорость поступления сообщений.- Состояние брокеров (CPU, disk I/O).
// Пример метрики для отслеживания лага консьюмера prometheus.NewGaugeVec(prometheus.GaugeOpts{ Name: "kafka_consumer_group_lag", Help: "Kafka consumer group lag for a topic/partition", }, []string{"topic", "partition"}) -
Гарантии доставки: Для критически важных данных мы настраивали продюсеров на
acks=allи использовали идемпотентные продюсеры (enable.idempotence=true) для обеспечения гарантии доставки at-least-once и избежания дублей при повторных отправках. -
Масштабирование консьюмеров: Количество инстансов сервиса-консьюмера в Consumer Group масштабировалось в соответствии с количеством партиций в топике для максимальной утилизации.
Ответ 18+ 🔞
Да ты посмотри, какие цифры! Прямо как в сказке про белого бычка, только вместо бычка — Apache Kafka, а вместо молока — сообщения, блядь.
В общем, была у нас система, которая жрала события в реальном времени, как голодный студент доширак. И жрала она, сука, нехило.
Цифры, от которых глаза на лоб лезут:
- Скорострельность: В среднем 50-100 тысяч сообщений в секунду, ёпта! А в пиках так вообще до 200к долетало. Представь, хули, каждый миг — целый стадион кричит тебе на ухо.
- Размер: Сообщения мелкие, 1-2 КБ, упакованные в Protobuf — умные, блядь, чтоб не раздувались.
- Поток: Так, мелочь — 100-200 мегабайт в секунду. Просто ручеёк, хули.
- Задержка: А вот тут мы старались, чтоб от клика до обработки было не дольше 50-100 мс. Быстрее, чем твоя бывшая обижается.
Как мы этот цирк с конями организовывали:
-
Топики: Делали их с 32 партициями, чтоб растащить нагрузку, как горячую картошку. И репликацию
factor=3ставили — на случай, если два брокера вдруг, нахуй, лягут. Пусть третий держится. -
Мониторинг: Это святое, блядь! Без него ты как слепой кот в подвале. Prometheus с Grafana — наши глаза и уши. Следили, чтоб:
Consumer Lagне рос, как грибы после дождя. Иначе консьюмеры отстают и всё, пиздец, пирамида.MessagesInPerSec— просто смотрели, не прёт ли на нас цунами.- За брокерами присматривали — чтоб CPU не пыхтел, как паровоз, и диск не стонал.
// Вот такая штука, как маячок, показывала, не тонем ли мы prometheus.NewGaugeVec(prometheus.GaugeOpts{ Name: "kafka_consumer_group_lag", Help: "Kafka consumer group lag for a topic/partition", }, []string{"topic", "partition"}) -
Доставка: Для самых важных данных, где потеря — это волнение ебать и паника, настраивали продюсеры на
acks=all. И включали идемпотентность (enable.idempotence=true), чтобы если сообщение ушло повторно, оно не создало дубль, как клон-мудак. Гарантия at-least-once, почти как в аптеке. -
Масштабирование: Консьюмеров плодили, как кроликов, по количеству партиций. Чтоб каждая партиция была при деле, а не болталась без работы, как хуй без яиц. Consumer Group — наше всё для утилизации.
Вот так вот, не смотря на все эти «ёперный театр» с нагрузкой, система работала. Главное — следить, мерять и вовремя масштабироваться, а не ждать, когда всё накроется медным тазом.