I see junior developers building todo apps with ONE service. This makes me physically ill.

The Architecture

Here’s my production-grade todo application:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚           API Gateway (Kong)                 β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                  β”‚
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β–Ό             β–Ό             β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Auth  β”‚   β”‚ Todo-Read β”‚   β”‚Todo-Writeβ”‚
β”‚Serviceβ”‚   β”‚  Service  β”‚   β”‚ Service  β”‚
β””β”€β”€β”€β”¬β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜
    β”‚             β”‚              β”‚
    β–Ό             β–Ό              β–Ό
[84 more services omitted for brevity]

Service Breakdown

  • TodoItemCreationValidationService β€” Validates that a todo item exists before creating it
  • TodoItemCharacterCountService β€” Counts characters (separate from words, obviously)
  • TodoItemWordCountService β€” Counts words
  • TodoItemWordCountCacheInvalidationService β€” Invalidates word count cache
  • TodoItemEmojiFlagDetectionService β€” Detects if todo contains emoji (legal compliance)
  • TodoCompletionCelebrationService β€” Sends Kafka event to trigger confetti in UI
  • TodoDeletionGriefCounselingService β€” Handles emotional attachment to deleted todos

The Message Flow

When a user creates a todo:

  1. Request hits Kong β†’ validates JWT with Auth0
  2. Auth0 talks to our AuthService via gRPC
  3. AuthService checks Redis for session
  4. Redis miss β†’ query PostgreSQL
  5. PostgreSQL replica lag β†’ retry with exponential backoff
  6. Request forwarded to TodoCreationOrchestratorService
  7. Orchestrator publishes to Kafka topic todo.creation.requested.v2.internal.prod
  8. 47 services consume this event
  9. Eventually consistent write to DynamoDB
  10. DynamoDB streams trigger Lambda
  11. Lambda writes to Elasticsearch
  12. User sees todo after 3-7 seconds

This is fine.

Infrastructure

  • 23 Kubernetes clusters (one per service category)
  • 847 Helm charts
  • 12 Terraform modules
  • 4 full-time SREs just for the todo app
  • $847,000/month AWS bill

β€œWhy Not a Monolith?”

Because then how would I justify my title of β€œPrincipal Distributed Systems Architect”?

XKCD 927 shows the problem with standardsβ€”too many of them. My solution? 847 microservices, each with its own standard. Problem solved through chaos.

Dilbert predicted this in 1995 when the Pointy-Haired Boss said: β€œWe need to be more agile. Let’s add more layers of management.” Same energy.

Next article: Why your startup needs a Service Mesh before product-market fit.


The author has 3 todo items and 847 services. All todos are marked β€œin progress” since 2019.