Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 4 additions & 15 deletions src/main/java/com/coinflow/order/service/AcceptedOrderService.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
import com.coinflow.order.service.command.CreateOrderCommand;
import com.coinflow.order.service.command.MarketOrderCommandQueue;
import com.coinflow.order.service.lock.OrderAssetLockService;
import com.coinflow.order.service.metrics.OrderCreateStageRecorder;
import com.coinflow.order.service.processor.AcceptedOrderProcessor;
import com.coinflow.order.service.support.ClientOrderIdService;
import com.coinflow.order.service.support.MarketSequenceAllocator;
Expand All @@ -38,7 +37,6 @@ public class AcceptedOrderService {
private final OrderAssetLockService orderAssetLockService;
private final MarketOrderCommandQueue marketOrderCommandQueue;
private final MarketSequenceAllocator marketSequenceAllocator;
private final OrderCreateStageRecorder stageRecorder;
private final AcceptedOrderProcessor acceptedOrderProcessor;
private final ClientOrderIdService clientOrderIdService;
private final TransactionTemplate transactionTemplate;
Expand All @@ -51,7 +49,6 @@ public AcceptedOrderService(
OrderAssetLockService orderAssetLockService,
MarketOrderCommandQueue marketOrderCommandQueue,
MarketSequenceAllocator marketSequenceAllocator,
OrderCreateStageRecorder stageRecorder,
AcceptedOrderProcessor acceptedOrderProcessor,
ClientOrderIdService clientOrderIdService,
PlatformTransactionManager transactionManager
Expand All @@ -63,7 +60,6 @@ public AcceptedOrderService(
this.orderAssetLockService = orderAssetLockService;
this.marketOrderCommandQueue = marketOrderCommandQueue;
this.marketSequenceAllocator = marketSequenceAllocator;
this.stageRecorder = stageRecorder;
this.acceptedOrderProcessor = acceptedOrderProcessor;
this.clientOrderIdService = clientOrderIdService;
this.transactionTemplate = new TransactionTemplate(transactionManager);
Expand Down Expand Up @@ -112,10 +108,7 @@ private Order acceptInTransaction(
) {
clientOrderIdService.validateUnique(currentUserId, request, market, side);

Long sequence = stageRecorder.record(
market.getSymbol(), side, "sequence_allocate",
() -> marketSequenceAllocator.nextSequence(market.getId())
);
Long sequence = marketSequenceAllocator.nextSequence(market.getId());
Wallet wallet = orderAssetLockService.lockTakerWallet(currentUserId, command);
Order order = Order.accepted(
currentUserId, market.getId(), market.getSymbol(),
Expand All @@ -124,15 +117,11 @@ private Order acceptInTransaction(
command.lockedAsset(), command.lockedAmount(),
sequence, request.clientOrderId()
);
stageRecorder.record(market.getSymbol(), side, "order_save",
() -> orderRepository.save(order));
orderRepository.save(order);

WalletLedger orderLockLedger = orderAssetLockService.createOrderLockLedger(wallet, order, command);
orderAssetLockService.saveOrderLockLedger(orderLockLedger, command);
stageRecorder.record(market.getSymbol(), side, "order_accepted_event_save", () -> {
eventRecorder.recordOrderAccepted(order);
return null;
});
eventRecorder.recordOrderAccepted(order);

TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
@Override
Expand All @@ -148,7 +137,7 @@ private boolean enqueueAcceptedOrder(Market market, OrderSide side, Long orderId
market,
side,
orderId,
() -> acceptedOrderProcessor.processAcceptedOrder(market, side, orderId)
() -> acceptedOrderProcessor.processAcceptedOrder(market, orderId)
);
}

Expand Down
4 changes: 1 addition & 3 deletions src/main/java/com/coinflow/order/service/OrderService.java
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,6 @@ public OrderService(
}

public CreateOrderResponse createOrder(Long currentUserId, CreateOrderRequest request) {
long createStartedAt = System.nanoTime();

Market market = marketRepository.findBySymbol(request.market())
.orElseThrow(() -> new ApiException(ErrorCode.MARKET_NOT_FOUND));
CreateOrderCommand command = orderCreateValidator.validate(market, request);
Expand All @@ -66,7 +64,7 @@ public CreateOrderResponse createOrder(Long currentUserId, CreateOrderRequest re
return marketOrderCommandQueue.submit(
market,
side,
() -> syncOrderProcessor.process(currentUserId, request, market, command, createStartedAt)
() -> syncOrderProcessor.process(currentUserId, request, market, command)
);
}

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,11 @@
import com.coinflow.event.service.DomainEventRecorder;
import com.coinflow.market.domain.Market;
import com.coinflow.order.domain.Order;
import com.coinflow.order.domain.OrderSide;
import com.coinflow.order.domain.OrderStatus;
import com.coinflow.order.matching.MatchResult;
import com.coinflow.order.matching.MatchingEngine;
import com.coinflow.order.matching.OrderBookRecoveryService;
import com.coinflow.order.repository.OrderRepository;
import com.coinflow.order.service.metrics.OrderCreateStageRecorder;
import com.coinflow.order.service.settlement.OrderSettlementService;
import com.coinflow.trade.domain.Trade;
import com.coinflow.wallet.domain.LedgerType;
Expand All @@ -37,7 +35,6 @@ public class AcceptedOrderProcessor {
private final OrderBookRecoveryService orderBookRecoveryService;
private final DomainEventRecorder eventRecorder;
private final OrderSettlementService orderSettlementService;
private final OrderCreateStageRecorder stageRecorder;
private final TransactionTemplate transactionTemplate;

public AcceptedOrderProcessor(
Expand All @@ -47,7 +44,6 @@ public AcceptedOrderProcessor(
OrderBookRecoveryService orderBookRecoveryService,
DomainEventRecorder eventRecorder,
OrderSettlementService orderSettlementService,
OrderCreateStageRecorder stageRecorder,
PlatformTransactionManager transactionManager
) {
this.orderRepository = orderRepository;
Expand All @@ -56,20 +52,19 @@ public AcceptedOrderProcessor(
this.orderBookRecoveryService = orderBookRecoveryService;
this.eventRecorder = eventRecorder;
this.orderSettlementService = orderSettlementService;
this.stageRecorder = stageRecorder;
this.transactionTemplate = new TransactionTemplate(transactionManager);
}

public void processAcceptedOrder(Market market, OrderSide side, Long orderId) {
public void processAcceptedOrder(Market market, Long orderId) {
try {
processAcceptedOrderInternal(market, side, orderId);
processAcceptedOrderInternal(market, orderId);
} catch (Throwable e) {
log.warn("Accepted order processing failed. orderId={}, error={}", orderId, e.getMessage(), e);
rejectAcceptedOrder(orderId, e.getClass().getSimpleName());
}
}

private void processAcceptedOrderInternal(Market market, OrderSide side, Long orderId) {
private void processAcceptedOrderInternal(Market market, Long orderId) {
transactionTemplate.execute(status -> {
Order order = orderRepository.findByIdWithLock(orderId)
.orElseThrow(() -> new ApiException(ErrorCode.ORDER_NOT_FOUND));
Expand All @@ -78,37 +73,36 @@ private void processAcceptedOrderInternal(Market market, OrderSide side, Long or
}

order.open();
List<MatchResult> plan = stageRecorder.record(
market.getSymbol(), side, "matching_plan",
() -> matchingEngine.planMatchRejectingSelfTrade(market, order)
);
List<MatchResult> plan = matchingEngine.planMatchRejectingSelfTrade(market, order);
List<Order> autoCanceledMakers = new ArrayList<>();
List<Trade> trades = stageRecorder.record(
market.getSymbol(), side, "settlement",
() -> orderSettlementService.settle(market, order, plan, autoCanceledMakers, null, false)
);
List<Trade> trades = orderSettlementService.settle(market, order, plan, autoCanceledMakers, null, false);

TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
@Override
public void afterCommit() {
long orderBookApplyStartedAt = System.nanoTime();
try {
matchingEngine.applyMatchPlan(market, order, plan);
autoCanceledMakers.forEach(canceledMaker ->
matchingEngine.cancelOrder(market.getSymbol(), canceledMaker));
} catch (Exception e) {
log.error("오더북 applyMatchPlan 실패: orderId={}, DB 체결 내역 기반 재빌드 시도", order.getId(), e);
orderBookRecoveryService.rebuildAfterApplyFailure(market.getId());
} finally {
stageRecorder.record(market.getSymbol(), side, "orderbook_after_commit",
System.nanoTime() - orderBookApplyStartedAt);
}
}
});
registerOrderBookSynchronization(market, order, plan, autoCanceledMakers);
return trades;
});
}

private void registerOrderBookSynchronization(
Market market,
Order order,
List<MatchResult> plan,
List<Order> autoCanceledMakers
) {
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
@Override
public void afterCommit() {
try {
matchingEngine.applyMatchPlan(market, order, plan);
autoCanceledMakers.forEach(canceledMaker ->
matchingEngine.cancelOrder(market.getSymbol(), canceledMaker));
} catch (Exception e) {
log.error("오더북 applyMatchPlan 실패: orderId={}, DB 체결 내역 기반 재빌드 시도", order.getId(), e);
orderBookRecoveryService.rebuildAfterApplyFailure(market.getId());
}
}
});
}

private void rejectAcceptedOrder(Long orderId, String reason) {
transactionTemplate.execute(status -> {
Order order = orderRepository.findByIdWithLock(orderId)
Expand All @@ -130,5 +124,4 @@ private void rejectAcceptedOrder(Long orderId, String reason) {
return null;
});
}

}
Loading
Loading