refactor: 주문 처리 직렬화를 마켓 큐로 단일화, 마켓 락 제거#118
Conversation
취소 등 Market 객체 없이 marketId/symbol만 가진 경로도 동일 큐로 제출할 수 있도록 오버로드를 추가한다.
마켓당 워커가 1개이므로 큐가 이미 직렬화를 보장한다. 중복이던 ReentrantLock 획득/해제와 releaseRegistered + afterCommit/afterCompletion 이중 해제 로직을 제거한다.
취소가 락 대신 마켓 큐를 거치도록 하여 오더북 변경 주체를 워커 스레드로 단일화한다. 사용자 응답은 submit 블로킹으로 기존과 동일하게 즉시 반환한다.
MarketOrderLockManager/Service/Scope를 삭제한다. 직렬화는 마켓 큐가 전담한다.
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (7)
💤 Files with no reviewable changes (4)
📝 WalkthroughWalkthroughThree per-market ChangesLock Infrastructure Removal and Queue-Only Serialization
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Closes #117
목적
주문 처리의 동시성 직렬화 메커니즘을 마켓 큐 하나로 단일화하고, 중복이던 마켓 락을 제거한다.
배경 — 무엇이 문제였나
마켓 단위 직렬화(한 번에 하나씩 처리)를 보장하는 메커니즘이 2개 공존했다.
MarketOrderCommandQueue— 마켓당 워커 스레드 1개 (single-writer)MarketOrderLockManager의ReentrantLock— 프로세서 내부에서 추가 획득워커가 마켓당 1개이므로 큐만으로 이미 직렬화가 보장된다. 락이 실제로 의미를 갖던 곳은 큐를 거치지 않고 HTTP 스레드에서 오더북을 직접 변경하던 취소 경로 뿐이었다. 그 결과 "무엇이 동시성을 보장하는가"가 두 곳에 분산되어 흐름을 이해하기 어려웠다.
변경 전
flowchart TD C1["POST /orders (동기)"] C2["POST /orders/async (비동기)"] C3["POST /orders/{id}/cancel (취소)"] Q["MarketOrderCommandQueue<br/>워커 1개 — 직렬화 ①"] L["ReentrantLock — 직렬화 ② (중복)"] OB[("오더북")] C1 -->|submit| Q C2 -->|submitAsync| Q Q --> L C3 -.->|"큐 건너뜀"| L L --> OB변경 후
flowchart TD C1["POST /orders (동기)"] C2["POST /orders/async (비동기)"] C3["POST /orders/{id}/cancel (취소)"] Q["MarketOrderCommandQueue<br/>워커 1개 — 유일한 직렬화 지점"] OB[("오더북")] C1 -->|submit| Q C2 -->|submitAsync| Q C3 -->|submit| Q Q --> OB변경 사항 (커밋 단위)
MarketOrderCommandQueue: marketId/symbol 기반submit오버로드 추가SyncOrderProcessor/AcceptedOrderProcessor: 마켓 락 획득·해제,releaseRegistered+ afterCommit/afterCompletion 이중 해제 제거OrderCancelService: 취소를 마켓 큐 경로로 전환 (오더북 변경 주체를 워커로 단일화, 응답은 기존대로 즉시 반환)MarketOrderLockManager/MarketOrderLockService/MarketOrderLockScope삭제검증
./gradlew compileJava compileTestJava통과OrderApiTest(동기 201+trades, self-trade, 취소, 비동기) 통과후속 작업 (별도 PR)
OrderCreateStageRecorder등)을 경계 단위로 축소SyncOrderProcessor/AcceptedOrderProcessor공통 로직 단일 핸들러로 통합Summary by CodeRabbit
Refactor