RT-W22: 3PL 멀티 테넌트 WMS 아키텍처

🎯 멀티 테넌트 WMS란?Single Cluster · Many Tenants

3PL(제3자 물류) 운영사는 자사 창고에 다수 고객사의 재고를 유치해 운영한다. 단일 WMS 위에서 고객사별 데이터·정책·AI 모델을 완벽히 분리하면 인프라 비용은 공유하면서도 서비스 수준은 개별 보장할 수 있다. 핵심은 네 가지: 데이터 격리(파티션· RLS), SLA 차등(당일/익일/주간), 브랜딩 분리(라벨·POD· 알림 양식), 고객사별 피킹 규칙(우선순위·FIFO/FEFO·위험물).

RT-W22는 tenant_id 라우팅을 1급 시민으로 다루는 multi- tenant WMS와 per-tenant AI 모델(슬로팅·경로 최적화)을 결합하여 기존 단일 시스템의 한계를 해소한다. 모든 요청은 토큰에서 tenant_id를 추출 → tenant_configs 로드 → 고객사 정책 enforce → tenant 전용 AI 모델 호출 → 파티션 격리된 audit log 기록 흐름을 따른다. 11월 기준 12개 고객사를 단일 클러스터에서 무사고 운영했다.

🧭 멀티 테넌트 처리 5단계 파이프라인5 stages · 요청 → audit log
STEP 1
tenant_resolve

주문/요청에서 tenant_id 식별. 인증 토큰 검증, 테넌트 권한 체크 (cross-tenant 액세스 차단).

STEP 2
config_fetch

tenant_configs[tenant_id] 로드. SLA, 피킹 규칙, 브랜딩 자산, 라벨 양식, 알림 채널을 캐시 우선 fetch.

STEP 3
policy_apply

우선순위·FIFO/FEFO·위험물 분리·존 제한 정책 enforce.noisy_neighbor 감지 시 throttle 발동.

STEP 4
model_route

models[tenant_id].optimize_path() 로 테넌트 전용 AI 모델 호출. 학습 데이터·가중치는 고객사별 격리.

STEP 5
audit_log

tenant-scoped audit log 기록. SOC 2 / ISO 27001 요건 만족, 파티션 단위 immutable append-only 저장.

🐍 멀티 테넌트 WMS 핵심 클래스 (Python)
class MultiTenantWMS:
    def pick_order(self, order, tenant_id):
        config = self.tenant_configs[tenant_id]
        sla    = config["sla_hours"]
        rules  = config["pick_rules"]      # 고객사별 피킹 규칙
        model  = self.models[tenant_id]     # 개별 AI 모델
        path   = model.optimize_path(order, rules)
        return path

    def enforce_isolation(self, query, tenant_id):
        # 파티션 단위 RLS · cross-tenant 접근 차단
        query.where("tenant_id" == tenant_id)
        assert query.partition == tenant_id, "ISO_VIOLATION"
        return query
➗ 테넌트 점수 모델 & 격리 지수SLA · 격리 · 브랜딩 · noisy 가중 합산
tenant_score = w₁·sla_compliance + w₂·data_isolation + w₃·branding_fitw₄·noisy_neighbor_penalty
iso_index = tenant_writes_in_own_partition / total_tenant_writes (목표 1.0)
# 가중치 합 Σ w = 1.0 · iso_index 1.0 미만은 격리 위반 의심으로 audit alert
sla 0.35sla_compliance · 약속한 SLA 시간 안에 완료된 주문 비율, 계약상 가장 큰 재무적 페널티 항목
iso 0.30data_isolation · 자기 파티션 내부 쓰기/읽기 비율, cross-tenant 누수 0건 = 1.0
brand 0.20branding_fit · 라벨·POD·알림 양식이 고객사 가이드와 일치하는 비율
noisy 0.15noisy_neighbor_penalty · 다른 테넌트 응답 지연을 유발한 피크 트래픽 비중 (감점)

예) 테넌트 A가 SLA 99%, iso 1.0, brand 0.95, noisy 0.05이면 0.35·0.99 + 0.30·1.0 + 0.20·0.95 − 0.15·0.05 = 0.83 으로 상위 등급. 반대로 시즌 피크 고객사 C는 SLA 92%, iso 1.0, brand 0.9, noisy 0.45 → 0.83 − 0.07 ≈ 0.76 으로 throttle 발동 후 유지.

🧱 테넌시 격리 패턴 비교Schema / Row-level / DB-per-tenant / Hybrid
패턴데이터 격리운영 비용보안적합성
Schema-per-tenant★★★★ · 일반 3PL 권장
Row-level (tenant_id col)★★★★★ · 소형 다수 고객
DB-per-tenant매우 강매우 강★★★ · 대형 고객 한정
Hybrid (hot=row, cold=schema)★★★★ · 11월 채택안

IntraLogis 3PL 클러스터는 Hybrid 패턴을 채택했다. 핫 경로(주문· 피킹·재고)는 row-level + RLS로 빠르게 처리하고, 콜드 경로(audit log· 분석 dump)는 schema-per-tenant로 분리해 컴플라이언스 요구를 만족한다. 대형 고객 D사 한 곳만 별도 DB-per-tenant로 운영해 전용 SLA를 보장한다.

참고문헌
[1] 박소연 외, "3PL 멀티 테넌트 WMS 아키텍처 설계", IntraLogis 사내 보고서, 2025.11
[2] AWS, "SaaS Multi-Tenant Architecture" Whitepaper, 2024
[3] Microsoft Azure, "Multi-tenant SaaS database tenancy patterns", 2024
[4] ISO/IEC 27001:2022 Information Security Management Systems
[5] AICPA, SOC 2 Type II 가이드, 2023
[6] 대한상공회의소, 3PL 운영 가이드, 2024