chicong115.com
Back to work
blog

Building Scalable Microservices from Scratch

2024
MicroservicesArchitectureDDDCQRSEvent-Driven

Lessons from 6+ Architectures

After designing microservice architectures for Modoho, Egitech, TasConnect, FPT Software, and more, these are the patterns and practical trade-offs that actually matter in production.

Core Principles

  • Start with a well-structured modular monolith before splitting into services
  • Use DDD bounded contexts to define service boundaries — not technical layers
  • CQRS shines when read and write patterns differ significantly in scale
  • Event-Driven Architecture provides loose coupling but adds operational complexity
  • API-First Design (OpenAPI/Swagger) as a contract between teams
  • Dead-letter queues and circuit breakers are not optional
yaml
# Microservices Decision Framework
when_to_split:
  - Service has independent deployment cadence
  - Team owns the full lifecycle (you build it, you run it)
  - Clear bounded context with well-defined API

patterns_that_work:
  - CQRS: Separate read/write models for scale
  - Event Sourcing: Audit-critical domains (finance, compliance)
  - Saga Pattern: Distributed transactions across services
  - API Gateway: Unified entry point, auth, rate limiting

patterns_to_avoid:
  - Nano-services: Don't split too small
  - Distributed monolith: Shared databases across services
  - Over-engineering: Start simple, measure, then optimize

The Human Side

Microservices are as much an organizational pattern as a technical one. Each service should map to a team. Conway's Law is real — your architecture will mirror your communication structure. Design both intentionally.