🏗️ Reading: Engineering Blog — Monolith to Microservices
3 exercises — read an engineering blog post about migrating from a Rails monolith to microservices and answer questions about architectural reasoning, trade-off language, and the strangler fig migration pattern.
Engineering blog reading essentials
- "Deliberately left" → conscious choice, not oversight — look for the reasoning
- "Fail independently" → fault isolation — a service failure doesn't cascade
- "Strangler fig" → incremental extraction alongside the running system
- "Big-bang" → replace everything at once — higher risk, faster in theory
- "What we'd do differently" → the most honest and educational part of any blog post
0 / 3 completed
1 / 3
Engineering Blog — Monolith to Microservices Migration
{ex.passage} The post says the team "deliberately left authentication, billing, and user management in the monolith." What engineering reasoning justifies this decision?
Service boundary selection — one of the hardest microservices decisions
The blog post gives a clear engineering rationale for not extracting certain domains: "extracting these would have required cross-service transactions that our team wasn't ready to handle."
Why authentication and billing are hard to extract:
Key vocabulary from the passage:
The blog post gives a clear engineering rationale for not extracting certain domains: "extracting these would have required cross-service transactions that our team wasn't ready to handle."
Why authentication and billing are hard to extract:
- Authentication is a cross-cutting concern — nearly every service needs to verify user identity. As a separate service, every API call might require a synchronous call to an auth service. If the auth service is slow or down, everything is slow or down.
- Billing involves financial transactions that must be atomic: debit account + update subscription + send receipt must all succeed or all fail together. Distributed transactions across services are notoriously difficult to implement correctly (two-phase commit, saga pattern) and introduce failure modes that don't exist in a monolith.
- User management is another cross-cutting concern — user IDs and profile data are referenced by nearly every other service. Without careful API design, extracting this creates tight coupling between services.
Key vocabulary from the passage:
- "Fail independently" → a service failure doesn't cascade to other services (fault isolation)
- "Well-defined interfaces" → clear input/output contracts, not entangled with other domain logic
- "Cross-service transactions" → operations that must atomically span multiple services — a core microservices challenge