Monolith ⟶ Microservice

(Korea Concert Ticketing Platform)
Nu Panuwat
NU PANUWAT DevOps / Cloud Infrastructure Engineer
① MONOLITH ② MICROSERVICE · HORIZONTAL SCALE ③ CELL-BASED
USERS Browser / Mobile
LEGACY · MONOLITHIC
AWS EDGE
Route 53 · CloudFrontWAF · Shield
QUEUE SYSTEM
NetFunnel3rd-party
ELASTIC BEANSTALK · EC2
ONE MONOLITH · ALWAYS-ON
ALB → Main Web
ALB → Report Web
ALB → Check-in System
ALB → Admin / Staff Web
ALB → Main APIone deploy unit · everything coupled
NO ASYNC LAYER
No message queueevery booking is a synchronous request — the onsale burst lands on the DB
No retry / DLQa failed request is a lost seat — nothing replays it
No real-time updatesthe seat map is polled, never pushed — a seat can still look free after someone took it
first bottleneckscale as one unit
DATA · SINGLE
ONE OF EACH
RDSsingle
Redissingle
S3
single point of failure
CLOUDFLARE EDGE
DNS · CDN WAF · DDoS · Rate Limit · Bot Protection
QUEUE SYSTEM
Cloudflare Waiting Room3rd-party
VPC · PUBLIC SUBNET · multi-AZ
Internet Gateway
Application Load Balanceringress · internet-facing
NAT Gatewayegress · one per AZ
HTTPS
ECS FARGATE · AUTO SCALE ×N
FLOODGATE
capacity modelsessions/s · concurrency · headroom
scaling controllerthreshold rules · IDP
ECS UpdateServicedesiredCount ×N
predictivescheduledpre-warmmanual
PUBLIC SERVICES app subnet private
Main Web + BFF
Booking UI
WebSocket Hub
Admin UI
Report UI
Check-in UI
ECS Service Connect
INTERNAL SERVICES app subnet private
Main API
Identity API
Admin API
Booking API
Inventory API
Payment API
Cache API
Check-in API
×N = ECS tasks per service, scaled by workload
📮 MQ / DLQ
INBOUNDOUTBOUND
carriescommandsevents
deliveryorderedfan-out
under loadabsorbs the onsale burstretry with backoff
on failureDLQ → seat releasedDLQ → replay later
EVENT DRIVEN
WebSocket Hubpush to browser
Lambdaticket · notify
externalPSP webhook · KOPIS
VPC endpoints (S3 · DynamoDB · ECR) · NAT Gateway · VPC Flow Logs
services read / write
DATA · SCALABLE
CACHE LAYER · read first
ElastiCache (Redis)cache · seat lock · booking session
hit → served from memory
miss → read through to Aurora
on cache miss
AURORA · GLOBAL DATABASE data subnet private
PRIMARY REGION · MULTI-AZ
RDS Proxyconnection pooling
WriterAZ-a
replication
Reader 1AZ-b
Reader 2AZ-c
readers are read-only
heavier traffic → add readers
DR REGION
headless secondary
backup only
storage only · no DB instance
no read traffic
on disaster →
promote to writer
OBJECT STORAGE · SEARCH · SECRETS
S3 / R2media · ticket QR / PDF
OpenSearchsearch · log analytics
Secrets Manager · KMSdb creds · PSP key · token signing
read scale-outmulti-AZcross-region DR
paid.success
TICKET GENERATION
Lambda
Generate QR / PDF
S3 / R2
ticket.created
events
NOTIFY & REPORT
EVENT DRIVENSERVERLESS
EventBridge
Lambda
Notificationemail / SMS
KOPIS Reportmandatory daily · Korean government
OTLP · all services
OBSERVABILITY
o11y subnet private
Alloycollector
Tempotraces
Prometheusmetrics
Lokilogs
Grafanadashboards
alert rulesthreshold · anomaly
LINEon-call
Slack#incident
Emaildaily digest
LEGACY
≥ $5,600 / month EC2 + RDS ≈ 55% of the bill — the same fixed cost every day, onsale or not
pay per use Fargate scales with workload — quiet days cost less, onsales scale out
next → cell-based
lift this whole microservice block (compute + MQ + data) into 1 cell — then repeat per concert
NEWERGO TO CELL-BASED by NU PANUWAT · DevOps / Cloud Infrastructure Engineer