Какую нагрузку обрабатывали сервисы в вашем последнем проекте?

Ответ

В проекте с микросервисной архитектурой (Spring Boot, Kubernetes) ключевые сервисы (API Gateway, Auth, Order) были рассчитаны на нагрузку:

  • Пропускная способность: До 5 000 запросов в секунду (RPS).
  • Задержка (latency): p99 ~50 мс.

Стратегии обеспечения масштабируемости и отказоустойчивости:

  1. Кэширование: Redis для хранения сессий и часто запрашиваемых данных, что снизило нагрузку на БД на ~40%.
  2. Асинхронная обработка: Неблокирующая обработка событий (нотификации, логирование) через Apache Kafka.
  3. Автомасштабирование: Horizontal Pod Autoscaler (HPA) в Kubernetes на основе загрузки CPU.

Пример конфигурации HPA:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: order-service
  minReplicas: 3
  maxReplicas: 15
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70

Нагрузочное тестирование проводилось с использованием Gatling.

Ответ 18+ 🔞

А, слушай, вот тут у нас проект с этими вашими микросервисами, на Spring Boot'е, в кубере болтается. Так вот, заложили мы там изначально, что основные сервисы — шлюз, авторизация, заказы — должны держать до пяти тысяч запросов в секунду, и чтобы задержка у них, эта ваша p99, была не больше пятидесяти миллисекунд. Ну, в теории, блядь.

А чтобы эта конструкция не разъебалась при первом же наплыве пользователей, которые как саранча, накинулись, мы там нагородили стратегий, ёпта.

Первое — кэширование. Запилили Redis, туда сессии пихаем и данные, которые постоянно дергают. И знаешь, что? Нагрузка на основную базу данных упала примерно на 40%, вот это поворот, блядь! Просто взяли и отрезали почти половину дерганий.

Второе — асинхронщина. Чтобы всякую ерунду вроде уведомлений или логов не делать синхронно и всех не тормозить, пустили это дело через Apache Kafka. Отправил событие в очередь и пошёл дальше, не ждёт сервис, пока там всё протолкнется. Красота, в рот меня чих-пых!

Ну и третье, самое вкусное — автомасштабирование. Настроили в Kubernetes эту штуку, Horizontal Pod Autoscaler (HPA), чтобы он сам, как хитрая жопа, подкручивал количество подов, если процессоры начинают гореть. Вот смотри, как примерно выглядит конфиг:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: order-service
  minReplicas: 3
  maxReplicas: 15
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70

То есть, грубо говоря, меньше трёх копий сервиса не будет, но если нагрузка подскочит и утилизация CPU перевалит за 70%, он начнёт плодить новые поды, пока их не станет 15. А потом, когда схлынет, поубивает лишние. Автоматически, сука! Чудеса, да и только.

Ну и как же без проверки, на что это всё годится? Гоняли всё это хозяйство под нагрузкой, используя Gatling. Чтобы посмотреть, не ляжет ли всё к ебеням, когда на него навалятся по-настоящему.