TL;DR — 제출이 몰릴 때 채점 대기열이 쌓이는데, CPU/메모리 기반 오토스케일은 이미 쓴 자원만 보여 대기열(미처리 수요)을 제때 못 읽는다. KEDA로 제어지표를 Kafka Consumer Lag로 바꿔, 언어별 채점 워커를 미처리 적재량에 따라 수평 확장했다.

배경

문제 (증상)

원인 분석

해결

KEDA ScaledObject로 언어별 채점 워커를 Kafka Consumer Lag 트리거로 수평 확장.

triggers:
  - type: kafka
    metadata:
      consumerGroup: csharp-judge-group
      topic: submission-CS
      lagThreshold: "5"          # 파티션당 lag이 임계값 초과하면 확장
minReplicaCount: 1
maxReplicaCount: 10
pollingInterval: 15            # 15초마다 lag 폴링
cooldownPeriod: 60
# scaleUp: 30초당 최대 3파드, scaleDown: 60초당 1파드

정정 메모: 이 임계값은 yaml에 고정값으로 설정한 것이고, "목표 대기시간 ÷ 평균 처리시간"으로 런타임에 자동 산정하는 로직이 구현돼 있는 것은 아니다. (그 계산식은 임계값을 정할 때의 설계 근거로 활용)

결과