Skip to content

Task 4-3: Load Test - Gift Aggregation Pipeline

Phase: 4 - Testing Priority: Medium Depends on: task-1-1, task-1-2 Reference: docs/BountyHunter-Backend/details/feature-batch-async-processing/SPEC.md

Background

Load test toàn bộ gift pipeline: từ concurrent Redis INCRBY tới Firebase counter update cuối cùng.

Test scenarios

Scenario A: Gift burst (100 viewers, 1 streamer)

  • [ ] Setup: 100 users gửi gift tới cùng streamerId đồng thời
  • [ ] Expected: Redis INCRBY atomic → không có race condition
  • [ ] After GiftAggregationJob tick (5s): 1 JMS message với total value
  • [ ] JMS listener processes → Firebase counter updated đúng total
  • [ ] Verify: không có double-deposit

Scenario B: Multi-streamer burst (10 streamers × 10 viewers)

  • [ ] Setup: 10 streamers, mỗi streamer có 10 viewers gifting simultaneously
  • [ ] Expected: 10 Redis keys (per streamerId) tích lũy đúng
  • [ ] After job: 10 JMS messages (10 JMSXGroupIDs riêng biệt)
  • [ ] All processed independently → correct per-streamer totals

Scenario C: Sustained load (1 giờ)

  • [ ] 20 viewers/minute gửi gifts liên tục trong 1 giờ
  • [ ] Monitor Redis key count → không tăng mãi (phải được drain)
  • [ ] Monitor JMS queue depth → stable, không tích lũy
  • [ ] Firebase counters consistent với tổng gifts gửi

Metrics cần capture

Metric Target
Redis INCRBY throughput > 10,000 ops/sec
GiftAggregationJob latency < 100ms per run
JMS message count per 5s ≤ active streamers
Firebase update latency < 2s từ khi gift sent
Data loss rate 0%

Verification / Acceptance Criteria

  • [ ] Scenario A: After 100 concurrent gift sends to 1 streamer, Redis INCRBY total matches the expected sum with no race-condition discrepancy; Firebase counter equals the same total after GiftAggregationJob tick
  • [ ] Scenario B: 10 independent Redis keys (one per streamer) each hold the correct per-streamer total; 10 separate JMS messages are produced (one per streamer) after the job tick
  • [ ] Scenario C: Over 1 hour of sustained load, Redis key count does not grow unboundedly (keys are drained); JMS queue depth remains stable (no accumulation); Firebase counters match cumulative gift totals
  • [ ] GiftAggregationJob execution latency remains < 100 ms per run (verified via batch.job.execution_time metric from task-3-1)
  • [ ] Data loss rate = 0 % — total gifts sent equals total gifts reflected in Firebase at end of test

Notes

  • Dùng mock hoặc test environment Firebase để không ảnh hưởng production data
  • Redis keys phải tự clean (set to 0 sau khi read via GETSET, key tự expire sau TTL)