Comparisons

Ten pairs that get conflated in real conversations. Neither column wins — what decides is the requirement. Each record leads with the confusion, because the confusion is the reason the record exists.

Monolith vs Microservices

What people get wrong about this pair

Microservices get chosen as the answer to "the codebase is big". Size is a modularity problem; distribution is an organisational and operational one. Splitting converts in-process calls into network calls, so partial failure, versioning, distributed tracing and data consistency all become your problem — and a badly-bounded monolith becomes a badly-bounded distributed system.

One deployable (ideally modular)
Use it when

Almost always at the start, and for a long time after: one transaction, one deploy, one trace, refactorable boundaries.

Independently deployed services
Use it when

When independent deployment, independent scaling or team autonomy is the actual constraint — and you can pay the operational cost.

DimensionOne deployable (ideally modular)Independently deployed services
TransactionsOne database transaction spans the changeSagas, outboxes, eventual consistency
Refactoring a boundaryA renameA migration across two deploy cycles
Failure modesThe process is up or downPartial failure, cascading failure, retry storms
ScalingScale the whole thingScale the hot service only
DebuggingOne stack traceDistributed tracing, or nothing
PrerequisiteDiscipline about module boundariesCI/CD, observability and on-call maturity