RT-O1: 분산 주문 관리(DOM) 거점 자동 선택

🎯 분산 주문 관리(DOM)란?Distributed Order Management · Fulfillment Node Auto-Selection

분산 주문 관리(DOM, Distributed Order Management)는 단일 창고가 아닌 다수의 풀필먼트 거점(Fulfillment Node) 중에서 EDD(약속 도착일) · 재고 · 용량 · 비용을 종합 평가해 주문 한 건당 최적 거점을 결정하는 오케스트레이션 계층이다. 거점이 많아질수록 의사결정 공간이 폭발적으로 커지므로, 사람이 룰로 관리하는 방식은 200ms 이내 응답·99.5% 매칭 정확도 같은 e-commerce SLA를 맞출 수 없다.

RT-O1은 이를 해결하기 위해 DOM Score Engine(Python)과 n8n 워크플로우를 결합한 1차 프로토타입이다. 주문이 들어오면 전처리 → 카테고리 분류(STD/EXPRESS/COLD) → DOM 거점 선택 → 재고 Lock → WMS 피킹 지시 → TMS 배차 연동 → EDD 통보 → PromiseLog 갱신까지를 단일 워크플로우로 자동화한다. 1월 테스트에서 예외 상황 90% 무인 처리를 목표했으나 단일 레이블 분류의 한계로 미달했고, 2월 RT-O2에서 멀티 레이블로 보강할 예정이다.

🧭 DOM 의사결정 파이프라인5 stages · Order Intake → EDD Promise
STEP 1
order_intake

Webhook으로 주문 수신 · 주소 정규화 · SKU 검증 · 무게/부피 계산 · 주문 유효성 체크.

STEP 2
classify

AI Agent가 STD / EXPRESS / COLD 카테고리 분류(1월에는 단일 레이블). 결과 routingKey로 다음 분기 결정.

STEP 3
dom_score

DOM Score Engine으로 (Node × Carrier) 페어별 score 계산. argmax로 최적 거점·운송사 선택.

STEP 4
lock_dispatch

재고 Lock + WMS HTTP POST /pick 피킹 지시 + TMS HTTP POST /dispatch 배차 요청.

STEP 5
edd_promise

EDD 산출 + Webhook Respond + Gmail 고객 통보 + PromiseLog 갱신(약속 vs 실제 도착 추적).

🐍 DOM Score Engine 초기 설계 (Python)
def score_node(order, node, carrier):
    # 1) 재고 가용 여부
    inv_ok    = inventory.check(node.id, order.skus)
    # 2) 도착 예상 시간 (lead + 운송)
    eta_hr    = node.lead_hr + carrier.transit_hr
    edd_score = 1.0 if eta_hr <= order.requested_hr else 0.0
    # 3) 거점 큐 여유 (capacity)
    cap_score = 1 - (node.queue / node.capacity)
    # 4) 비용 정규화 (낮을수록 좋음)
    cost_norm = normalize(carrier.cost * order.weight)
    return 0.35*edd_score + 0.30*inv_ok + 0.20*cap_score - 0.15*cost_norm

EDD 가중치를 가장 높게(0.35) 두어 약속한 도착일 충족이 1순위. 재고(0.30)·용량(0.20)이 보조이며, 비용은 음수 가중(-0.15)으로 들어가 score가 동률일 때 저비용 거점이 우선된다.

➗ Score 가중치 & EDD 정의argmax_node Σ weighted score
score = 0.35·EDD + 0.30·Inv + 0.20·Cap0.15·Cost
EDD_score = 1 if (lead_hr + transit_hr) ≤ requested_hr else 0
# EDD 0.35 + Inv 0.30 = 0.65 → 도착 약속과 재고 가용성이 결정의 65%를 차지
EDD 0.35lead_hr + transit_hr ≤ requested_hr · 약속 도착일을 만족하면 1, 못 맞추면 0 (Hard 제약)
Inv 0.30inventory.check(node.id, order.skus) · 모든 SKU가 해당 거점에 충분히 있으면 1, 부족하면 0
Cap 0.201 − queue/capacity · 거점 큐 여유. 빈 거점이면 ≈1, 포화 상태면 ≈0
Cost 0.15normalize(carrier.cost · order.weight) · 정규화된 운송 비용. 음수 가중이라 저비용일수록 score 상승

예) 서울 동남권 고객이 익일 도착 요청한 표준 주문(STD)에 대해 NODE-A (가산)는 EDD=1, Inv=1, Cap=0.7, Cost=0.5 0.35 + 0.30 + 0.14 − 0.075 = 0.715 로 NODE-B(이천 0.62), NODE-C(부산 0.41)를 제치고 선택된다.

🔗 n8n 기반 워크플로우 (1월 1차 구현)Webhook → Code → AI_Agent → HTTP → Gmail
# n8n 워크플로우 (RT-O1 ver.0.1, 2026-01-04)
Webhook(POST /orders/receive)
  -> Code(전처리: 주소정규화, SKU검증, 무게계산)
  -> AI_Agent(카테고리 분류: STD/EXPRESS/COLD)
  -> Switch(routingKey 기반 에이전트 분기)
  -> AI_Agent_R0(표준 DOM 거점 선택)
  -> HTTP_WMS(피킹 지시 전송)
  -> HTTP_TMS(배차 요청)
  -> Respond_Webhook(EDD 반환)
  -> Gmail(고객 배송 확인 메일 발송)

# 평균 노드 7개, end-to-end p95 ≈ 720ms (1월 4주차 기준)

n8n으로 1차 구현한 이유는 비-개발자 PM도 워크플로우를 시각적으로 수정할 수 있어 빠른 반복(쉬운 A/B)이 가능하기 때문. 다만 Switch 노드가 단일 routingKey만 받기 때문에 "냉장 + 당일"처럼 두 카테고리에 걸친 주문을 처리하지 못해 RT-O2에서 멀티 레이블 분기로 재설계할 예정이다.

🏬 풀필먼트 거점 카테고리 비교1월 운영 4개 거점 · score 평균값
거점위치평균 lead_hr용량(건/일)평균 score
NODE-A서울 동남권 (가산)1.2h8,0000.78
NODE-B경기 남부 (이천)2.4h14,0000.71
NODE-C부산 (강서)3.8h6,0000.66
NODE-D (cold)인천 냉장1.8h3,0000.81 (콜드 전용)

NODE-A는 서울 수요 밀집 지역에 가까워 가장 자주 선택되며, NODE-B는 용량이 가장 커 다량 주문 분산 처리에 유리. NODE-D는 콜드체인 전용으로 COLD 카테고리에서 사실상 단독 후보로 작동한다. 부산 NODE-C는 영남권 고객에 한정적으로 선택돼 평균 score가 낮다.

참고문헌
[1] 김지훈, "AI 기반 분산 주문 관리(DOM) 거점 자동 선택 1차 보고서", IntraLogis 사내 보고서, 2026.01
[2] Manhattan Associates, Manhattan Active Omni Documentation, 2024
[3] Gartner, "Magic Quadrant for Distributed Order Management Systems", 2024
[4] n8n.io, n8n Official Docs · Workflow Automation, 2025
[5] Anthropic, Model Context Protocol(MCP) Specification, 2024
[6] IDC, "Order Orchestration in Modern Commerce", IDC MarketScape, 2024
[7] 박소연 · 김지훈, WMS-OMS 통합 협력 보고서, IntraLogis 사내, 2025.12