Evolution Paths
15 pathsStructured models of how backend architectures evolve under scaling pressure. Each path captures the topology mutations, migration stages, operational risks, and coupling changes that occur during a real architecture transition.
15 paths
Replacing nightly or hourly batch ETL jobs with a continuous CDC pipeline that captures database writes from the source WAL, publishes change events to Kafka, and delivers updates to analytics systems within seconds: at the cost of significantly higher operational complexity, schema evolution management, and permanent consumer lag monitoring.
Separating the write model (commands to a normalized database) from the read model (denormalized projections optimized per query pattern), enabling independent read/write scaling at the cost of read model staleness and projection maintenance complexity.
Decomposing a modular monolith into independently deployed services communicating over an event stream, introducing async processing boundaries and eventual consistency in exchange for independent deployability and fault isolation.
Incrementally extracting domains from a monolith into independently deployable services behind an API gateway using the strangler fig pattern: routing specific endpoint sets to new services while the monolith handles the remainder, until the monolith is replaced.
Introducing internal module boundaries within a monolith to reduce deploy coupling, improve team autonomy, and establish ownership domains: without the operational overhead of distributed services.
Separating analytical workloads from the OLTP database by introducing a columnar store (ClickHouse, Snowflake) fed by CDC or export pipelines, eliminating analytical query interference with transactional performance and enabling sub-second analytics on multi-year datasets.
Introducing horizontal table partitioning within PostgreSQL to distribute write load, reduce per-partition index size, enable partition pruning on range queries, and push single-node storage limits without leaving the PostgreSQL operational model.
Migrating from PostgreSQL ILIKE or tsvector full-text search to a dedicated search engine (Elasticsearch or OpenSearch) to enable relevance ranking, fuzzy matching, faceted filters, and sub-100ms query latency at scale: at the cost of index synchronization lag, Elasticsearch cluster operational burden, and eventual consistency between source and search index.
Migrating from RabbitMQ's broker-centric push model to Kafka's log-based pull model to gain event replay, independent consumer scaling, fan-out without queue proliferation, and durable event retention: at the cost of higher operational complexity.
Horizontally distributing a PostgreSQL dataset across N independent shards so that write throughput and storage scale linearly with shard count: permanently changing the data access model, eliminating cross-shard ACID transactions, and making the shard key the most consequential and irreversible architectural decision in the system.
Replacing self-hosted PostgreSQL, Redis, and Kafka with managed equivalents (RDS, ElastiCache, MSK) to eliminate infrastructure maintenance overhead: automated backups, managed failover, and compliance certifications: at the cost of reduced configuration control, vendor lock-in, and higher cost at very large scale.
Evolving from a single Redis node (or small cluster) to a distributed cache topology using consistent hashing, enabling horizontal memory scaling, geographic distribution, and cache isolation between workload types: at the cost of increased operational complexity and potential hotspot concentration.
Introducing streaming replication and a read routing layer so that read-only queries are served from one or more standby replicas, relieving the primary of read load : at the cost of replication lag, dual connection pool management, and the permanent operational requirement to monitor replica health.
Expanding from a single-region deployment to active-passive or active-active multi-region replication to reduce read latency for global users, increase availability during regional failures, and meet geographic data residency requirements : at the cost of replication lag, consistency complexity, and operational burden.
Replacing synchronous HTTP service dependencies with an event-driven message broker so that producers publish events and consumers subscribe independently: eliminating synchronous call failure cascades at the cost of eventual consistency, idempotent consumer design, and permanent operational overhead for broker and pipeline health.