Skip to content

Dev to main#277

Merged
Iwantcod merged 12 commits into
mainfrom
dev
Mar 17, 2026
Merged

Dev to main#277
Iwantcod merged 12 commits into
mainfrom
dev

Conversation

@Iwantcod
Copy link
Copy Markdown
Member

@Iwantcod Iwantcod commented Mar 17, 2026

개요

관련 BackLog

Resolves: (Backlog Number, ...)

PR 유형

  • 새로운 기능 추가
  • 버그 수정
  • CSS 등 사용자 UI 디자인 변경
  • 코드에 영향을 주지 않는 변경사항(오타 수정, 탭 사이즈 변경, 변수명 변경)
  • 코드 리팩토링
  • 주석 추가 및 수정
  • 문서 수정
  • 테스트 추가, 테스트 리팩토링
  • 빌드 부분 혹은 패키지 매니저 수정
  • 파일 혹은 폴더명 수정
  • 파일 혹은 폴더 삭제

PR Checklist

  • 커밋 메시지 컨벤션에 맞게 작성했습니다.
  • 변경 사항에 대한 테스트를 했습니다.(버그 수정/기능에 대한 테스트).

Summary by CodeRabbit

Release Notes

  • New Features

    • Added shared pool threshold notifications triggered at 50%, 30%, 10%, and custom threshold levels
    • Introduced comprehensive traffic test suites with 100-line and 1000-line scenarios including burst stress and speed-exact variants
  • Bug Fixes

    • Improved app-scoped speed limit enforcement for accurate traffic deduction control
    • Enhanced balance state synchronization for shared pool operations
  • Chores

    • Added automated setup and verification scripts for traffic testing environments
    • Expanded test coverage for traffic policy validation and alarm handling

Copy link
Copy Markdown
Contributor

@Misu0616 Misu0616 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

main까지 완료!

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Mar 17, 2026

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 896abb54-7504-4b2e-bd2b-7213c70b2fbc

📥 Commits

Reviewing files that changed from the base of the PR and between 9c6fa34 and df85b62.

📒 Files selected for processing (57)
  • .gitignore
  • scripts/traffic/n100-test/k6_scaled_traffic_lib.js
  • scripts/traffic/n100-test/k6_traffic_test_100.js
  • scripts/traffic/n100-test/k6_traffic_test_100_speed_exact.js
  • scripts/traffic/n100-test/setup_small_traffic_test.sql
  • scripts/traffic/n100-test/setup_traffic_test_100.sh
  • scripts/traffic/n100-test/setup_traffic_test_100.sql
  • scripts/traffic/n100-test/verify_policy_consistency_100_burst.sh
  • scripts/traffic/n100-test/verify_policy_consistency_100_speed_exact.sh
  • scripts/traffic/n100-test/verify_policy_consistency_100_suite.sh
  • scripts/traffic/n1000-test/k6_scaled_traffic_lib.js
  • scripts/traffic/n1000-test/k6_traffic_test_1000.js
  • scripts/traffic/n1000-test/k6_traffic_test_1000_speed_exact.js
  • scripts/traffic/n1000-test/setup_traffic_test_1000.sh
  • scripts/traffic/n1000-test/setup_traffic_test_1000.sql
  • scripts/traffic/n1000-test/verify_policy_consistency_1000_burst.sh
  • scripts/traffic/n1000-test/verify_policy_consistency_1000_speed_exact.sh
  • scripts/traffic/n1000-test/verify_policy_consistency_1000_suite.sh
  • src/main/java/com/pooli/family/service/FamilySharedPoolsService.java
  • src/main/java/com/pooli/notification/domain/enums/AlarmType.java
  • src/main/java/com/pooli/traffic/domain/TrafficFamilyMetaSnapshot.java
  • src/main/java/com/pooli/traffic/domain/entity/TrafficDeductDoneLog.java
  • src/main/java/com/pooli/traffic/domain/enums/TrafficLuaScriptType.java
  • src/main/java/com/pooli/traffic/domain/outbox/OutboxEventType.java
  • src/main/java/com/pooli/traffic/domain/outbox/payload/SharedPoolThresholdOutboxPayload.java
  • src/main/java/com/pooli/traffic/mapper/TrafficFamilyMetaMapper.java
  • src/main/java/com/pooli/traffic/mapper/TrafficSharedThresholdAlarmLogMapper.java
  • src/main/java/com/pooli/traffic/service/decision/TrafficDbDeductFallbackService.java
  • src/main/java/com/pooli/traffic/service/decision/TrafficDeductOrchestratorService.java
  • src/main/java/com/pooli/traffic/service/decision/TrafficDefaultQuotaSourceAdapter.java
  • src/main/java/com/pooli/traffic/service/decision/TrafficHydrateRefillAdapterService.java
  • src/main/java/com/pooli/traffic/service/decision/TrafficSharedPoolThresholdAlarmService.java
  • src/main/java/com/pooli/traffic/service/invoke/TrafficDeductDoneLogService.java
  • src/main/java/com/pooli/traffic/service/invoke/TrafficStreamConsumerRunner.java
  • src/main/java/com/pooli/traffic/service/outbox/TrafficRefillOutboxSupportService.java
  • src/main/java/com/pooli/traffic/service/outbox/strategy/SharedPoolThresholdOutboxStrategy.java
  • src/main/java/com/pooli/traffic/service/runtime/TrafficBalanceStateWriteThroughService.java
  • src/main/java/com/pooli/traffic/service/runtime/TrafficFamilyMetaCacheService.java
  • src/main/java/com/pooli/traffic/service/runtime/TrafficLuaScriptInfraService.java
  • src/main/java/com/pooli/traffic/service/runtime/TrafficRedisKeyFactory.java
  • src/main/resources/db/migration/V2603170100__create_shared_threshold_alarm_log.sql
  • src/main/resources/lua/traffic/deduct_indiv.lua
  • src/main/resources/lua/traffic/deduct_shared.lua
  • src/main/resources/lua/traffic/policy_check_indiv.lua
  • src/main/resources/lua/traffic/policy_check_shared.lua
  • src/main/resources/mapper/traffic/TrafficFamilyMetaMapper.xml
  • src/main/resources/mapper/traffic/TrafficSharedThresholdAlarmLogMapper.xml
  • src/test/java/com/pooli/family/service/FamilySharedPoolsServiceTest.java
  • src/test/java/com/pooli/traffic/acceptance/TrafficFlowLocalAcceptanceTest.java
  • src/test/java/com/pooli/traffic/service/decision/TrafficDbDeductFallbackServiceTest.java
  • src/test/java/com/pooli/traffic/service/decision/TrafficDeductOrchestratorServiceTest.java
  • src/test/java/com/pooli/traffic/service/decision/TrafficHydrateRefillAdapterServiceTest.java
  • src/test/java/com/pooli/traffic/service/decision/TrafficSharedPoolThresholdAlarmServiceTest.java
  • src/test/java/com/pooli/traffic/service/invoke/TrafficDeductDoneLogServiceTest.java
  • src/test/java/com/pooli/traffic/service/invoke/TrafficStreamConsumerRunnerTest.java
  • src/test/java/com/pooli/traffic/service/outbox/strategy/SharedPoolThresholdOutboxStrategyTest.java
  • src/test/java/com/pooli/traffic/service/runtime/TrafficLuaPolicyContractTest.java

📝 Walkthrough

Walkthrough

This PR introduces shared pool threshold alarm notifications, policy-check Lua script separation, family metadata caching with write-through synchronization, and comprehensive k6 load testing infrastructure for 100-line and 1000-line traffic scenarios. It extends traffic deduction logic with whitelist bypass flags, idempotent refill handling, and multi-stage policy application.

Changes

Cohort / File(s) Summary
Git Configuration
.gitignore
Added ignore entry for top-level /traffic directory with formatting adjustment.
k6 Traffic Testing Infrastructure (100-line)
scripts/traffic/n100-test/k6_scaled_traffic_lib.js, k6_traffic_test_100.js, k6_traffic_test_100_speed_exact.js, setup_traffic_test_100.sh, setup_traffic_test_100.sql, setup_small_traffic_test.sql, verify_policy_consistency_100_burst.sh, verify_policy_consistency_100_speed_exact.sh, verify_policy_consistency_100_suite.sh
New k6 library and test suite for 100-line burst-stress and speed-exact scenarios, with deterministic traffic setup (Redis/MongoDB/MySQL), and verification scripts.
k6 Traffic Testing Infrastructure (1000-line)
scripts/traffic/n1000-test/k6_scaled_traffic_lib.js, k6_traffic_test_1000.js, k6_traffic_test_1000_speed_exact.js, setup_traffic_test_1000.sh, setup_traffic_test_1000.sql, verify_policy_consistency_1000_burst.sh, verify_policy_consistency_1000_speed_exact.sh, verify_policy_consistency_1000_suite.sh
New k6 library and test suite for 1000-line burst-stress and speed-exact scenarios, with deterministic setup and verification logic.
Shared Pool Threshold Alarm Domain
src/main/java/com/pooli/notification/domain/enums/AlarmType.java, src/main/java/com/pooli/traffic/domain/enums/TrafficLuaScriptType.java, src/main/java/com/pooli/traffic/domain/outbox/OutboxEventType.java, src/main/java/com/pooli/traffic/domain/outbox/payload/SharedPoolThresholdOutboxPayload.java
Added four new AlarmType enum constants (50/30/10/custom threshold alarms), two new TrafficLuaScriptType constants (policy check individual/shared), new OutboxEventType for shared pool threshold reached, and new payload class for threshold outbox events.
Family Metadata Cache & Write-Through Services
src/main/java/com/pooli/traffic/service/runtime/TrafficFamilyMetaCacheService.java, src/main/java/com/pooli/traffic/service/runtime/TrafficBalanceStateWriteThroughService.java
New cache service for family metadata (pool total/remaining, threshold, active flag) with Redis backing; extended write-through service with five new public methods to synchronize shared meta updates (contribution, claim, restore, threshold update, DB fallback deduction).
Traffic Shared Threshold Alarm Service
src/main/java/com/pooli/traffic/service/decision/TrafficSharedPoolThresholdAlarmService.java
New service that computes remaining shared pool percentage, resolves thresholds (50/30/10/custom), logs threshold hits, and enqueues outbox events; includes deduplication logic via threshold alarm log mapper.
Shared Pool Threshold Outbox Strategy
src/main/java/com/pooli/traffic/service/outbox/strategy/SharedPoolThresholdOutboxStrategy.java
New outbox strategy to retry shared pool threshold reached events by creating family member alarms with threshold-to-AlarmType mapping.
Traffic Domain & Mapper Updates
src/main/java/com/pooli/traffic/domain/TrafficFamilyMetaSnapshot.java, src/main/java/com/pooli/traffic/domain/entity/TrafficDeductDoneLog.java, src/main/java/com/pooli/traffic/mapper/TrafficFamilyMetaMapper.java, src/main/java/com/pooli/traffic/mapper/TrafficSharedThresholdAlarmLogMapper.java, src/main/resources/mapper/traffic/TrafficFamilyMetaMapper.xml, src/main/resources/mapper/traffic/TrafficSharedThresholdAlarmLogMapper.xml
New TrafficFamilyMetaSnapshot data class; added latency field to TrafficDeductDoneLog; new MyBatis mappers and XML configurations for family metadata and shared threshold alarm logging.
Traffic Service & Key Factory Extensions
src/main/java/com/pooli/traffic/service/runtime/TrafficLuaScriptInfraService.java, src/main/java/com/pooli/traffic/service/runtime/TrafficRedisKeyFactory.java
Added two new public Lua execution methods (executePolicyCheckIndividual, executePolicyCheckShared) and two new key generation methods (familyMetaKey, speedBucketIndividualAppKey for app-scoped speed buckets).
Traffic Deduction & Orchestration Service Updates
src/main/java/com/pooli/traffic/service/decision/TrafficDbDeductFallbackService.java, src/main/java/com/pooli/traffic/service/decision/TrafficDeductOrchestratorService.java, src/main/java/com/pooli/traffic/service/decision/TrafficDefaultQuotaSourceAdapter.java, src/main/java/com/pooli/traffic/service/decision/TrafficHydrateRefillAdapterService.java, src/main/java/com/pooli/traffic/service/outbox/TrafficRefillOutboxSupportService.java, src/main/java/com/pooli/family/service/FamilySharedPoolsService.java
Major refactoring: DB fallback service now applies multi-stage policy caps (daily/shared/app-daily/app-speed) before deduction and uses write-through for shared meta; orchestrator invokes new threshold alarm service; quota adapter and refill adapter integrate write-through sync; refill outbox support syncs shared meta on restore; family service calls write-through sync for contributions and threshold updates.
Traffic Done-Log & Consumer Updates
src/main/java/com/pooli/traffic/service/invoke/TrafficDeductDoneLogService.java, src/main/java/com/pooli/traffic/service/invoke/TrafficStreamConsumerRunner.java
Added latency parameter to saveIfAbsent method signature and propagated latency computation into done-log persistence and final logging.
Lua Script Separation & Refill Logic
src/main/resources/lua/traffic/policy_check_indiv.lua, src/main/resources/lua/traffic/policy_check_shared.lua, src/main/resources/lua/traffic/deduct_indiv.lua, src/main/resources/lua/traffic/deduct_shared.lua
Two new policy-check scripts (individual and shared) that validate blocking policies (immediate/repeat/whitelist) and return JSON status; deduct scripts refactored to accept whitelist bypass flag, include idempotent refill logic with TTL handling, apply single policy_capped_target for multi-stage caps, and track app-speed enforcement.
Traffic Test Domain & Unit Tests
src/test/java/com/pooli/traffic/service/decision/TrafficDbDeductFallbackServiceTest.java, src/test/java/com/pooli/traffic/service/decision/TrafficDeductOrchestratorServiceTest.java, src/test/java/com/pooli/traffic/service/decision/TrafficHydrateRefillAdapterServiceTest.java, src/test/java/com/pooli/traffic/service/decision/TrafficSharedPoolThresholdAlarmServiceTest.java, src/test/java/com/pooli/traffic/service/runtime/TrafficLuaPolicyContractTest.java
New test class for threshold alarm service with threshold reaching and deduplication scenarios; extended deduct/orchestrator/hydrate tests to cover policy checks, app-scoped speed bucket keys, whitelist bypass, and multi-stage policy capping; refactored Lua policy contract tests to validate separated policy-check and deduct script phases.
Traffic Outbox & Consumer Tests
src/test/java/com/pooli/traffic/service/invoke/TrafficDeductDoneLogServiceTest.java, src/test/java/com/pooli/traffic/service/invoke/TrafficStreamConsumerRunnerTest.java, src/test/java/com/pooli/traffic/service/outbox/strategy/SharedPoolThresholdOutboxStrategyTest.java
Updated done-log and consumer tests to account for latency parameter propagation; new test class for threshold outbox strategy with threshold-to-alarm mapping and multi-member alarm creation.
Traffic Acceptance & Family Tests
src/test/java/com/pooli/traffic/acceptance/TrafficFlowLocalAcceptanceTest.java, src/test/java/com/pooli/family/service/FamilySharedPoolsServiceTest.java
Switched acceptance test mocking from quota cache refill to Lua deduct infra; added app-scoped speed bucket priming; new scenario for NO_BALANCE when speed capped; family service test added verification for write-through contribution sync.
SQL Migration
src/main/resources/db/migration/V2603170100__create_shared_threshold_alarm_log.sql
New migration creating TRAFFIC_SHARED_THRESHOLD_ALARM_LOG table with composite primary key (family_id, target_month, threshold_pct) for deduplication.

Sequence Diagram(s)

sequenceDiagram
    participant Client
    participant TrafficDeductOrch as TrafficDeductOrchestratorService
    participant HydrateAdapter as TrafficHydrateRefillAdapterService
    participant LuaScripts as Lua Scripts (Redis)
    participant ThresholdAlarm as TrafficSharedPoolThresholdAlarmService
    participant Outbox as RedisOutboxRecordService
    participant FamilyCache as TrafficFamilyMetaCacheService

    Client->>TrafficDeductOrch: executeSharedWithRecovery(payload)
    
    TrafficDeductOrch->>HydrateAdapter: executeSharedWithRecovery(payload, amount)
    HydrateAdapter->>LuaScripts: executePolicyCheckShared(keys, args)
    LuaScripts-->>HydrateAdapter: {answer: 0/1, status: OK/BLOCKED/HYDRATE}
    
    alt policy_check OK
        HydrateAdapter->>LuaScripts: executeDeductShared(keys, args, whitelist_bypass_flag, refill_amount)
        LuaScripts-->>HydrateAdapter: {answer, final_status, remaining}
        HydrateAdapter-->>TrafficDeductOrch: result
    end
    
    alt shared deduction > 0
        TrafficDeductOrch->>ThresholdAlarm: checkAndEnqueueIfReached(familyId)
        ThresholdAlarm->>FamilyCache: getOrLoad(familyId)
        FamilyCache-->>ThresholdAlarm: TrafficFamilyMetaSnapshot
        ThresholdAlarm->>ThresholdAlarm: computeRemainingPercent()
        
        loop for each threshold (50, 30, 10, custom)
            alt threshold reached
                ThresholdAlarm->>Outbox: createPending(SHARED_POOL_THRESHOLD_REACHED, payload)
                Outbox-->>ThresholdAlarm: success
            end
        end
        ThresholdAlarm-->>TrafficDeductOrch: (callback completes)
    end
    
    TrafficDeductOrch-->>Client: result
Loading
sequenceDiagram
    participant Consumer as TrafficStreamConsumerRunner
    participant DbFallback as TrafficDbDeductFallbackService
    participant WriteThrough as TrafficBalanceStateWriteThroughService
    participant Cache as TrafficFamilyMetaCacheService
    participant FamilyMeta as Family Meta (Redis)

    Consumer->>DbFallback: executeSharedWithRecovery(payload, amount, context)
    DbFallback->>DbFallback: computePolicyCappedTarget(daily, shared, app_daily, app_speed)
    DbFallback->>DbFallback: deductFromDb()
    
    alt poolType = SHARED and familyId present
        DbFallback->>WriteThrough: markSharedMetaContribution(familyId, amount)
        WriteThrough->>Cache: increaseTotalAndDbRemaining(familyId, amount)
        Cache->>FamilyMeta: HSET pool_total_data, db_remaining_data
    end
    
    DbFallback-->>Consumer: TrafficDeductResultResDto
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • [Chore] QoS 반영 로직 추가 #247: Modifies the same QoS-related policy/deduction code paths (Lua deduct_shared/deduct_indiv, TrafficLuaStatus enum, and related tests/keys).
  • Dev #240: Overlapping code-level changes across traffic subsystem, shared pool threshold alarms, outbox event types, TrafficFamilyMetaCacheService, and TrafficBalanceStateWriteThroughService integrations.
  • Fix/traffic logic junha #276: Directly related—overlapping changes in shared-pool write-through/cache, Lua policy separation, threshold alarms/outbox, done-log latency, Redis keys, mappers, and k6 traffic scripts.

Suggested labels

feature, traffic-system, shared-pools, redis-cache, lua-scripts, load-testing, priority:high

Suggested reviewers

  • hyuuuun
  • hyeonRS
  • pjh813
  • Misu0616
  • ms-0o0

Poem

🐰 Thresholds reached in shared pools bright,
Cache and Lua dance through the night,
Alarm bells ring when quotas climb,
A hundred lines, a thousand times,
Write-through syncs keep balance right! ✨

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch dev

@Iwantcod Iwantcod merged commit 501ba1e into main Mar 17, 2026
2 of 3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants