Skip to content

refactor: 주문 처리 직렬화를 마켓 큐로 단일화, 마켓 락 제거#118

Merged
ohhalim merged 4 commits into
developfrom
feat/refactor-order-single-path
Jun 15, 2026
Merged

refactor: 주문 처리 직렬화를 마켓 큐로 단일화, 마켓 락 제거#118
ohhalim merged 4 commits into
developfrom
feat/refactor-order-single-path

Conversation

@ohhalim

@ohhalim ohhalim commented Jun 15, 2026

Copy link
Copy Markdown
Owner

Closes #117

목적

주문 처리의 동시성 직렬화 메커니즘을 마켓 큐 하나로 단일화하고, 중복이던 마켓 락을 제거한다.

배경 — 무엇이 문제였나

마켓 단위 직렬화(한 번에 하나씩 처리)를 보장하는 메커니즘이 2개 공존했다.

  1. MarketOrderCommandQueue — 마켓당 워커 스레드 1개 (single-writer)
  2. MarketOrderLockManagerReentrantLock — 프로세서 내부에서 추가 획득

워커가 마켓당 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
Loading

변경 후

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
Loading

오더북을 변경하는 주체가 워커 스레드 하나뿐이므로 락이 필요 없다.

변경 사항 (커밋 단위)

  1. MarketOrderCommandQueue: marketId/symbol 기반 submit 오버로드 추가
  2. SyncOrderProcessor / AcceptedOrderProcessor: 마켓 락 획득·해제, releaseRegistered + afterCommit/afterCompletion 이중 해제 제거
  3. OrderCancelService: 취소를 마켓 큐 경로로 전환 (오더북 변경 주체를 워커로 단일화, 응답은 기존대로 즉시 반환)
  4. MarketOrderLockManager / MarketOrderLockService / MarketOrderLockScope 삭제

검증

  • ./gradlew compileJava compileTestJava 통과
  • OrderApiTest (동기 201+trades, self-trade, 취소, 비동기) 통과
  • order + integration(오더북 복구, 매칭) 전체 통과
  • 동기/비동기 API 계약 및 기존 테스트 변경 없음

후속 작업 (별도 PR)

  • 라인 단위 계측(OrderCreateStageRecorder 등)을 경계 단위로 축소
  • SyncOrderProcessor/AcceptedOrderProcessor 공통 로직 단일 핸들러로 통합

Summary by CodeRabbit

Refactor

  • Improved order processing architecture for enhanced system performance during concurrent operations
  • Streamlined order cancellation workflow and optimized internal concurrency mechanisms for greater reliability

ohhalim added 4 commits June 15, 2026 09:59
취소 등 Market 객체 없이 marketId/symbol만 가진 경로도
동일 큐로 제출할 수 있도록 오버로드를 추가한다.
마켓당 워커가 1개이므로 큐가 이미 직렬화를 보장한다.
중복이던 ReentrantLock 획득/해제와 releaseRegistered +
afterCommit/afterCompletion 이중 해제 로직을 제거한다.
취소가 락 대신 마켓 큐를 거치도록 하여 오더북 변경 주체를
워커 스레드로 단일화한다. 사용자 응답은 submit 블로킹으로
기존과 동일하게 즉시 반환한다.
MarketOrderLockManager/Service/Scope를 삭제한다.
직렬화는 마켓 큐가 전담한다.
@coderabbitai

coderabbitai Bot commented Jun 15, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 77c012e7-325a-46ac-ab1c-61ccde3adbb4

📥 Commits

Reviewing files that changed from the base of the PR and between c33b93e and e2b31c0.

📒 Files selected for processing (7)
  • src/main/java/com/coinflow/order/service/cancel/OrderCancelService.java
  • src/main/java/com/coinflow/order/service/command/MarketOrderCommandQueue.java
  • src/main/java/com/coinflow/order/service/lock/MarketOrderLockManager.java
  • src/main/java/com/coinflow/order/service/lock/MarketOrderLockScope.java
  • src/main/java/com/coinflow/order/service/lock/MarketOrderLockService.java
  • src/main/java/com/coinflow/order/service/processor/AcceptedOrderProcessor.java
  • src/main/java/com/coinflow/order/service/processor/SyncOrderProcessor.java
💤 Files with no reviewable changes (4)
  • src/main/java/com/coinflow/order/service/lock/MarketOrderLockService.java
  • src/main/java/com/coinflow/order/service/lock/MarketOrderLockScope.java
  • src/main/java/com/coinflow/order/service/lock/MarketOrderLockManager.java
  • src/main/java/com/coinflow/order/service/processor/SyncOrderProcessor.java

📝 Walkthrough

Walkthrough

Three per-market ReentrantLock classes (MarketOrderLockManager, MarketOrderLockService, MarketOrderLockScope) are deleted. MarketOrderCommandQueue gains a raw-identifier submit overload. OrderCancelService, AcceptedOrderProcessor, and SyncOrderProcessor all drop their lock service dependency and constructor parameters.

Changes

Lock Infrastructure Removal and Queue-Only Serialization

Layer / File(s) Summary
MarketOrderCommandQueue new submit overload
src/main/java/com/coinflow/order/service/command/MarketOrderCommandQueue.java
Adds submit(Long marketId, String marketSymbol, OrderSide, Supplier) overload; the existing submit(Market, ...) delegates into it, centralizing worker lookup on raw identifiers.
OrderCancelService migrated to queue
src/main/java/com/coinflow/order/service/cancel/OrderCancelService.java
Replaces MarketOrderLockService injection with MarketOrderCommandQueue; cancelOrder now queues work via the new overload and runs transactionTemplate.execute inside the queued callback.
AcceptedOrderProcessor lock removal
src/main/java/com/coinflow/order/service/processor/AcceptedOrderProcessor.java
Removes MarketOrderLockService field, constructor parameter, AtomicBoolean release flag, and all explicit lock acquisition/release; afterCommit/afterCompletion callbacks no longer touch any market lock.
SyncOrderProcessor lock removal
src/main/java/com/coinflow/order/service/processor/SyncOrderProcessor.java
Removes MarketOrderLockService field, constructor parameter, MarketOrderLockScope acquisition, AtomicBoolean tracking, and the finally-block release; simplifies executeInTransaction and registerOrderBookSynchronization signatures; moves recordAfterCommitFinished into afterCommit.
Deleted lock classes
src/main/java/com/coinflow/order/service/lock/MarketOrderLockManager.java, .../MarketOrderLockService.java, .../MarketOrderLockScope.java
MarketOrderLockManager (concurrent ReentrantLock map), MarketOrderLockService (acquire methods), and MarketOrderLockScope (release with double-release guard) are fully deleted.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

  • ohhalim/CoinFlow#79: Introduced MarketOrderCommandQueue as the queue-based per-market serialization mechanism that this PR now adopts as the sole serialization path.
  • ohhalim/CoinFlow#101: Added OrderCancelService with MarketOrderLockService-based locking, which this PR directly replaces with MarketOrderCommandQueue.

Poem

🐇 Hoppity-hop, the locks fall away,
One queue to rule them all today!
No more ReentrantLock to find,
The market worker speaks one mind.
Submit, commit, and hop along —
The pipeline sings a simpler song! 🎵

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately describes the main change: refactoring order processing serialization to use the market queue exclusively and removing the market lock mechanism.
Linked Issues check ✅ Passed All key coding objectives from issue #117 are met: market lock classes removed, order cancellations routed through the market queue, and dual serialization mechanisms consolidated into the queue-based approach.
Out of Scope Changes check ✅ Passed All changes are directly aligned with the PR objectives and issue #117 scope. No extraneous modifications detected outside the specified refactoring boundaries.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/refactor-order-single-path

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@ohhalim ohhalim merged commit 92d814d into develop Jun 15, 2026
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.

refactor: 주문 처리 경로 단일화 — 동기 경로/마켓 락 제거, 비동기 단일 파이프라인 확립

1 participant