All Case Studies

Re-architecting mission-critical
ETL for event-driven scale

How I designed and implemented a new execution model that separated orchestration from compute, removed a scaling bottleneck, standardized workloads with containers, and reduced both processing time and infrastructure cost.

Platform Modernization
  • Healthcare
  • 8 min read
Role
Cloud Architect
Responsibility
Architecture + Implementation
Scope
Enterprise ETL Platform
Platform
Google Cloud
Impact
85%+ lower daily infrastructure cost
14h → 4h processing window
01Context

A reporting platform that had
outgrown its execution model.

The platform processed healthcare and financial data across multiple hospital systems, feeding centralized BigQuery tables used by operational, analytical, and revenue-sensitive reporting workflows.

As adoption grew, thousands of ETL jobs increasingly depended on a Cloud Composer environment that was doing two jobs at once: orchestrating workflows and executing compute-heavy processing.

That coupling became the platform’s main scaling constraint. Delayed processing no longer meant only slower pipelines — it affected downstream reporting and business operations.

02The Constraint

Composer had become both
scheduler and compute platform.

Apache Airflow was a good fit for workflow orchestration, but the environment had gradually accumulated thousands of tightly coupled processing tasks executing directly inside Composer workers.

As workload volume increased, the orchestration layer itself became a bottleneck.

  1. Scheduling pressure
  2. Slower processing throughput
  3. Dependency conflicts
  4. Rising infrastructure cost
  5. Increasing operational complexity
Four data sources feed a single Cloud Composer environment whose scheduler shares its boundary with a dense grid of processing tasks; one route leads on to BigQuery.SOURCESCOMPOSERSCHEDULERORCHESTRATION + COMPUTE · ONE OPERATIONAL BOUNDARYBIGQUERY
Orchestration and compute competed inside the same operational boundary.
03Architectural Decision

Separate orchestration
from execution.

Rather than continuing to scale Composer vertically, I designed and implemented a new responsibility boundary between orchestration and execution.

Composer would remain responsible for scheduling, dependency management, and workflow state. Compute-heavy ETL stages would move into independently deployable containers running on Cloud Run.

That changed the architecture from a tightly coupled orchestration environment into an event-driven execution model where workloads could scale independently.

A smaller Cloud Composer environment sends triggers to five independent Cloud Run units, whose outputs converge on BigQuery.COMPOSERORCHESTRATION · SCHEDULING · STATECLOUD RUNEXECUTION · SCALES INDEPENDENTLYBIGQUERY
Composer orchestrates. Cloud Run executes. BigQuery remains the downstream data platform.
04Platform Decision

The simplest platform that
solved the scaling problem.

I evaluated Kubernetes, but it would have introduced cluster lifecycle and operational overhead that the organization was not yet positioned to absorb.

Cloud Run provided the characteristics the platform actually needed:

  • Container-native execution
  • Independent horizontal scaling
  • Usage-based billing
  • Minimal infrastructure administration
  • Faster adoption by teams still building container operational maturity

The decision was less about choosing the most sophisticated platform and more about choosing the simplest platform that satisfied the scaling requirement.

Operational simplicity was a feature,
not a compromise.

05Standardizing Execution

Containers became the
execution boundary.

Moving execution out of Composer also exposed another problem: workload environments were inconsistent.

Python dependencies, package versions, and runtime assumptions varied between pipelines. Containerization gave every ETL service a reproducible execution boundary.

I standardized workloads around Docker images stored in Artifact Registry, giving teams independently deployable environments with isolated dependencies and consistent delivery patterns.

Before, three workloads share one dependency stack with crossing paths and a conflict; after, each runs in its own container frame with its own dependencies, pulled from a single image registry.SHARED RUNTIMEDEPENDENCIESSHARED DEPENDENCIES · VERSION DRIFTREGISTRYCONTAINERSCONTAINER 01CONTAINER 02CONTAINER 03ISOLATED · REPRODUCIBLE · INDEPENDENTLY DEPLOYABLE
Independent container environments replaced shared runtime dependencies.
06Reliability

Modernization could not
trade away recoverability.

The platform supported reporting workflows where missed processing windows had operational and financial consequences, so modernization also had to improve recoverability.

I designed a disaster-recovery approach around reproducible infrastructure, backup Composer environments, DAG synchronization, and Terraform-driven environment reconstruction.

The goal wasn’t an expensive permanently active duplicate platform. It was a recovery model that could recreate critical orchestration infrastructure consistently while keeping the standby footprint economical.

Recovery was treated as
infrastructure state, not tribal knowledge.

A Terraform layer spans the top; a solid line holds the primary Composer environment, an amber dashed line rebuilds a smaller standby environment, and DAG sync runs between the two.TERRAFORMINFRASTRUCTURE STATERECONSTRUCTPRIMARYCOMPOSER · ACTIVESTANDBYCOMPOSER · MINIMAL FOOTPRINTDAG SYNC
07Results

The architecture changed
the operating envelope.

85%+

Lower daily infrastructure cost

approx. $2,000/day$300/day

14h 4h

End-to-end processing window

approx. 14 hours4 hours

Externalizing compute reduced pressure on Composer, enabled greater processing parallelism, and shifted the platform toward consumption-based execution.

The architectural change also established containerization and standardized deployment patterns that could be reused by other engineering teams.

08What I Learned

Three decisions that
carried forward.

  1. Lesson 01

    Separate control planes from workload execution.

    Systems become difficult to scale when orchestration and compute compete for the same operational boundary.

  2. Lesson 02

    Choose operational complexity deliberately.

    GKE could have solved the compute problem, but Cloud Run solved it without introducing a second operational problem.

  3. Lesson 03

    Standardization compounds.

    Docker was initially an execution mechanism. It eventually became a common deployment boundary that improved reproducibility, onboarding, and service ownership.