Skip to content

Repository files navigation

Distributed Order Processing System

Disclaimer: This project was built for learning purposes to explore event-driven microservices architecture using modern Java technologies. It is not intended for production use.

Overview

An event-driven microservices system where placing an order triggers asynchronous notifications to both a stock service and an email service via Apache Kafka. Orders are persisted to a PostgreSQL database.

Architecture

POST /api/v1/orders
        │
        ├──► PostgreSQL (persist order)
        │
        └──► Kafka "order_topics"
                    │
          ┌─────────┴─────────┐
          ▼                   ▼
    stock-service       email-service
   (updates stock)     (sends email)

Services

Service Description Port
order-service REST API that accepts orders, saves to DB, and publishes to Kafka 8080
stock-service Kafka consumer that processes stock updates -
email-service Kafka consumer that processes email notifications -
order-base-domains Shared library containing the OrderEvent class -

Tech Stack

  • Java 17 + Spring Boot 4
  • Apache Kafka — event streaming between services
  • PostgreSQL — order persistence
  • Spring Data JPA — database access
  • Docker + Docker Compose — containerized local development
  • k6 — load testing
  • JUnit 5 + Mockito — unit testing

Running Locally

Prerequisites: Docker Desktop

# Build all services
cd order-base-domains && ./mvnw install -DskipTests
cd ../order-service && ./mvnw package -DskipTests
cd ../stock-service && ./mvnw package -DskipTests
cd ../email-service && ./mvnw package -DskipTests

# Start everything
cd ..
docker compose up --build

API

Place an Order

curl -X POST http://localhost:8080/api/v1/orders \
  -H "Content-Type: application/json" \
  -d '{"name": "iPhone 15", "status": "PENDING"}'

Query Orders in Database

docker exec postgres psql -U postgres -d ordersdb -c "SELECT * FROM orders;"

Running Tests

Unit tests run without any infrastructure (no Docker, no database, no Kafka needed):

cd order-service
./mvnw test

Tests cover OrderController:

  • placeOrder returns success message
  • placeOrder saves order to database
  • placeOrder sends message to Kafka

Load Test Results

Tested with k6 on local Docker environment:

Metric Result
Concurrent users 200
Throughput 1,867 req/s
p95 latency 20ms
Error rate 0.1%
Total requests 56,198
k6 run load-tests/order-load-test.js

About

Event-driven microservices system using Spring Boot, Apache Kafka, PostgreSQL, and Docker. Orders are persisted to a database and fan out to stock and email consumers via Kafka. Sustained 1,867 req/s at 20ms p95 latency. Built to learn distributed systems architecture.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages