Skip to content

Task 3-2: Tune GiftAggregationJob fixedDelay

Phase: 3 - Performance Tuning Priority: Low Depends on: task-4-2 Reference: docs/BountyHunter-Backend/details/feature-livestream/SPEC.md

Background

GiftAggregationJob chạy với fixedDelay (default 5000ms). Chưa biết interval này có phù hợp với traffic thực tế không — quá ngắn thì CPU waste khi idle, quá dài thì Firebase counter update bị lag.

Tasks

DI Note: GiftAggregationJob cần inject RedisCounterService (hoặc tương đương) qua constructor injection (@RequiredArgsConstructor + final field). Nếu có thêm MeterRegistry cho metrics, cũng inject tương tự. Config value dùng @Value("${jobs.gift-aggregation.fixed-delay:5000}").

  • [ ] Thu thập từ metrics (task-4-2): average số streamers processed per run, average batch size
  • [ ] Nếu average = 0-5 streamers per run → interval hiện tại quá ngắn, tăng lên 10-15s
  • [ ] Nếu average > 100 streamers per run → interval có thể giảm để giảm backlog

  • [ ] Externalize interval (không hardcode trong annotation):

    # application-common.yaml (batch module)
    jobs:
      gift-aggregation:
        fixed-delay: 5000  # ms, tunable per environment
    
    // GiftAggregationJob.java
    @Scheduled(fixedDelayString = "${jobs.gift-aggregation.fixed-delay:5000}")
    public void processAggregatedGifts() { ... }
    

  • [ ] Verify fixedDelay behavior: job N+1 chỉ start sau khi job N hoàn thành + delay (không overlap) — khác với fixedRate

  • [ ] Xem xét dynamic delay: nếu batch size = 0 → skip Redis scan để giảm overhead:

    // Nếu không có keys → next delay tăng lên (exponential backoff khi idle)
    // Implement bằng cách track consecutive empty runs:
    // emptyRunCount++; nếu > threshold → log và continue (Redis scan đã rẻ)
    

Verification / Acceptance Criteria

  • [ ] jobs.gift-aggregation.fixed-delay xuất hiện trong application-common.yaml
  • [ ] GiftAggregationJob dùng @Scheduled(fixedDelayString = "${jobs.gift-aggregation.fixed-delay:5000}") thay vì hardcoded value
  • [ ] Thay đổi config value trong YAML → job interval thay đổi mà không cần rebuild
  • [ ] fixedDelay (không phải fixedRate) → verify bằng cách slow down 1 run và đảm bảo next run không chạy overlap
  • [ ] Interval mới được document với lý do chọn (dựa trên metrics từ task-4-2)

Files to Modify

  • batch/job/gift_aggregation/GiftAggregationJob.java
  • batch/src/main/resources/application-common.yaml