A high-throughput event processing system built with Spring Boot microservices, Redis pub/sub, and WebSockets — capable of handling 10,000+ events per minute with live streaming to a React dashboard.
Portfolio rebuild — inspired by production work at Power R&D Consultants. Core architecture and patterns are original; sensitive business logic has been replaced with generic equivalents.
┌─────────────────┐ WebSocket ┌─────────────────────┐
│ React Dashboard│◄───────────────────│ Spring Boot API │
│ (TypeScript) │ │ Gateway Service │
└─────────────────┘ └─────────┬───────────┘
│ REST
┌────────────▼────────────┐
│ Event Processor │
│ (Spring Boot) │
└────────────┬────────────┘
│
┌──────────────────▼──────────────────┐
│ Redis │
│ • pub/sub for live event fanout │
│ • cache layer (65% DB load reduction)│
└──────────────────┬──────────────────┘
│
┌────────────▼────────────┐
│ PostgreSQL │
│ (event store + stats) │
└─────────────────────────┘
- Live event streaming via WebSocket with connection pooling and message queuing — zero perceptible lag on the dashboard
- Redis pub/sub fanout — decouples event ingestion from delivery; multiple subscribers with no extra DB load
- Async processing pipeline — Spring Boot
@Async+ thread pool executor handles bursts without blocking - 65% database load reduction through Redis caching of aggregated stats and hot-path queries
- React dashboard with real-time charts (Recharts), auto-reconnecting WebSocket client, and optimistic UI updates
| Layer | Technology |
|---|---|
| Frontend | React 18, TypeScript, Redux Toolkit, Recharts, WebSocket API |
| Backend | Java 17, Spring Boot 3, Spring WebSocket, Spring Data JPA |
| Messaging | Redis 7 (pub/sub + cache) |
| Database | PostgreSQL 15 |
| Infra | Docker Compose (local), AWS ECS + RDS (production pattern) |
| Testing | JUnit 5, Mockito, Jest, React Testing Library |
- Java 17+
- Node.js 18+
- Docker & Docker Compose
# Start infrastructure
docker-compose up -d postgres redis
# Start backend
cd backend
./mvnw spring-boot:run
# Start frontend
cd frontend
npm install
npm run devApp runs at http://localhost:5173
# Backend
cd backend && ./mvnw test
# Frontend
cd frontend && npm testWhy Redis pub/sub over Kafka? For this scale (10K events/min), Redis pub/sub avoids the operational overhead of a Kafka cluster while delivering the same decoupling pattern. Kafka would be the right call beyond ~100K events/min or where message replay is needed.
Why WebSockets over SSE? The dashboard requires bidirectional communication (filter changes, subscription management) — SSE is simpler but one-way only.
Why Spring Boot over Node.js for the backend? The event processing logic benefits from Java's strong typing, thread pool management, and Spring's mature async support. Node.js would be a better fit for a pure I/O-bound API gateway.
| Metric | Result |
|---|---|
| Sustained event throughput | 10,000+ events/min |
| WebSocket latency (p99) | < 50ms |
| Dashboard load time | < 1.2s |
| DB query time (cached) | < 10ms |
| DB query time (uncached) | < 80ms |
├── backend/
│ ├── event-processor/ # Core ingestion & processing service
│ ├── api-gateway/ # WebSocket + REST API layer
│ └── shared/ # Common models, DTOs
├── frontend/
│ ├── src/
│ │ ├── components/ # Dashboard, charts, filters
│ │ ├── hooks/ # useWebSocket, useEventStream
│ │ └── store/ # Redux slices
└── docker-compose.yml
Shreya H S — Full Stack Software Engineer, London
LinkedIn · GitHub