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
GiftAggregationJobtick - [ ] 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
- [ ]
GiftAggregationJobexecution latency remains < 100 ms per run (verified viabatch.job.execution_timemetric 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)