Logo Craft Homelab Docs Контакты Telegram
Как масштабировать security scanning: Kafka, Postgres и API без лишнего железа Трендовые github проекты в нашем телеграм канале. Подпишись →
13 апреля 2026 г.

Как масштабировать security scanning: Kafka, Postgres и API без лишнего железа

Security scanning часто выглядит как простая задача: взять цель, проверить, сохранить результат, показать пользователю. Но когда таких проверок становится тысячи в минуту, система превращается в распределённый pipeline. Узкими местами становятся Kafka consumers, Postgres queries, API limits, очередь задач и хранение результатов.

Масштабирование не всегда требует нового железа. Часто первый 10x прирост даёт оптимизация архитектуры: правильная очередь, batch processing, индексы, backpressure и наблюдаемость.

Pipeline сканирования

Типовая схема:

API → queue → workers/scanners → result processor → database → dashboard/alerts

Каждый слой должен быть независимым. API принимает запрос и ставит задачу. Workers обрабатывают задачи параллельно. Result processor нормализует результаты. База хранит состояние и историю.

Если API синхронно ждёт завершения скана, система быстро упрётся в timeouts и плохой UX.

Kafka consumers

Kafka хорошо подходит для потоковой обработки задач и результатов, но производительность зависит от consumers:

  • количество partitions;
  • consumer group;
  • batch size;
  • commit strategy;
  • retry policy;
  • обработка poison messages;
  • баланс между throughput и latency.

Если consumer обрабатывает сообщения по одному и часто пишет offset, пропускная способность будет низкой. Batch processing и аккуратные commits могут дать большой выигрыш.

Backpressure

Сканеры могут быть быстрее базы или внешних API. Если не контролировать поток, очередь заполнится, latency вырастет, а система начнёт падать каскадом.

Backpressure нужен на нескольких уровнях:

  • rate limits на входе;
  • лимит активных задач;
  • динамический throttling workers;
  • priority queues;
  • circuit breakers для внешних зависимостей;
  • отдельные очереди для тяжёлых задач.

Лучше честно замедлить приём задач, чем потерять контроль над pipeline.

Postgres как узкое место

Security scanning создаёт много записей: scan metadata, findings, statuses, history, assets, timestamps. Postgres может выдерживать большой поток, если схема и запросы спроектированы правильно.

Что проверять:

  • индексы под реальные queries;
  • отсутствие N+1;
  • batch inserts;
  • partitioning больших таблиц;
  • autovacuum;
  • connection pooling;
  • размер JSONB-полей;
  • explain analyze для горячих запросов.

Иногда один плохой dashboard query съедает больше ресурсов, чем сами workers.

Idempotency

В распределённом pipeline задачи могут повторяться: retry, rebalance, network error, worker crash. Поэтому обработка результатов должна быть идемпотентной.

Практики:

  • stable scan id;
  • unique keys для findings;
  • upsert вместо слепой вставки;
  • статусы с переходами;
  • дедупликация сообщений;
  • audit trail повторов.

Без idempotency retries превращаются в дубли и неверные отчёты.

Observability

Для масштабирования нужны метрики:

  • queue lag;
  • scans per second;
  • worker utilization;
  • processing latency;
  • DB query latency;
  • error rate;
  • retry count;
  • failed scans;
  • API p95/p99;
  • storage growth.

Метрики должны показывать не только «система работает», но и где именно появляется задержка.

Оптимизация без железа

Перед добавлением серверов стоит проверить:

  • можно ли увеличить batch size;
  • есть ли лишние запросы;
  • правильно ли работают индексы;
  • не слишком ли частые updates статуса;
  • можно ли кэшировать справочники;
  • не блокируют ли workers друг друга;
  • есть ли тяжёлые синхронные операции в API.

Часто bottleneck — не CPU, а неудачная последовательность операций.

Итог

Security scanning масштабируется как любой data pipeline: очередь, consumers, workers, база, backpressure и observability. Рост производительности начинается с измерений, а не с покупки железа.

Если система видит queue lag, latency, ошибки и горячие запросы, её можно оптимизировать точечно. Если нет — масштабирование превращается в угадывание.