Services¶
Overview¶
┌──────────────────────────────────────────────────────────┐
│ NGINX Proxy │
│ / → Frontend │ /api → Orders │ /ws → Notifications │
└──────────────────────────────────────────────────────────┘
│ │ │
┌────▼────┐ ┌──────▼──────┐ ┌───────▼────────┐
│Frontend │ │Order Service│ │Notifications │
│ (React) │ │ (FastAPI) │ │ (FastAPI) │
└─────────┘ └──────┬──────┘ └───────┬────────┘
│ │
┌──────▼──────┐ ┌───────▼────────┐
│ Delivery │ │ Simulator │
│ (FastAPI) │ │ (Python) │
└─────────────┘ └────────────────┘
Service |
Port |
Role |
|---|---|---|
|
8003 |
Order management, menu, stock control |
|
8001 |
Delivery record creation and tracking |
|
8002 |
WebSocket gateway for real-time updates |
|
– |
Drives order lifecycle transitions |
|
3000 |
React UI for browsing, ordering, tracking |
Order Service¶
The entry point for all business logic. Handles order creation with stock validation inside MongoDB transactions, and publishes domain events to Redis Streams.
- Endpoints
GET /api/v1/menu– list menu items with stock levels
POST /api/v1/orders– create an order (validates stock, decrements atomically)
GET /api/v1/orders/{id}– get order details and current status
GET /api/v1/health– readiness check
GET /metrics– Prometheus metrics
- Publishes to
orders-stream,simulate-order-stream- Consumes from
order-status-stream(status updates from simulator)- Key behavior
Order creation runs inside a MongoDB transaction. Stock is checked and decremented atomically – if two users order the last pizza simultaneously, one gets the order and the other gets a 400 error. The event is published only after the transaction commits.
Delivery Service¶
Reacts to orders reaching “out for delivery” status. Creates delivery records and tracks the delivery lifecycle.
- Endpoints
GET /api/v1/health– readiness check
GET /metrics– Prometheus metrics
- Publishes to
deliveries-stream,simulate-delivery-stream- Consumes from
orders-stream(new orders),delivery-status-stream(status updates from simulator)- Key behavior
Listens to
orders-streamand only acts when an order reachesout_for_deliverystatus. Creates a delivery record in MongoDB and publishes adelivery.createdevent. Has no REST API for delivery management – everything is event-driven.
Notifications Service¶
The WebSocket gateway. Bridges the event bus to the browser, pushing real-time status updates to connected clients.
- Endpoints
WS /ws/v1/order-tracking/{order_id}– WebSocket for live order tracking
GET /api/v1/health– readiness check
GET /metrics– Prometheus metrics
- Consumes from
orders-stream,deliveries-stream- Key behavior
When a client connects via WebSocket, the service first checks Redis cache for the latest known status (instant response), then keeps the connection alive and pushes updates as they arrive from the event bus. Uses ping/pong frames with a 60-second timeout for keepalive. No database dependency – purely stateless, backed by Redis.
Order Simulator¶
Drives the demo. Simulates realistic order lifecycle transitions with configurable delays, making the system useful without manual interaction.
- Consumes from
simulate-order-stream,simulate-delivery-stream- Publishes to
order-status-stream,delivery-status-stream- Status transitions
Order: created → confirmed → preparing → out_for_delivery Delivery: waiting → on_the_way → delivered
Each transition has a randomized delay (configurable via environment variables) to simulate real-world processing times.
Frontend¶
React 19 + TypeScript single-page application with:
Menu browsing with stock indicators
Shopping cart with real-time validation
Order placement with instant feedback
Live order tracking via WebSocket connection
Dev tools page with links to Grafana dashboards and API docs
Built with Vite, styled with Tailwind CSS + shadcn/ui, data fetching via TanStack Query, routing via TanStack Router.
Supporting Infrastructure¶
Service |
Role |
Details |
|---|---|---|
MongoDB |
Document store |
Replica set ( |
Redis |
Event bus + cache |
Streams with consumer groups, status caching with 24h TTL |
NGINX |
Reverse proxy |
Routes traffic, WebSocket upgrade, Prometheus GET-only restriction |
Prometheus |
Metrics |
Scrapes |
Grafana |
Dashboards |
3 pre-provisioned dashboards, anonymous viewer access |
Loki |
Log aggregation |
Receives logs from Promtail, 72h retention |
Promtail |
Log collector |
Docker service discovery, filters to app containers only |