Vipra Software Articles Airflow Is Not Dying
Apache Airflow Orchestration Dagster Prefect Antipatterns Platform Ops

Airflow Is Not Dying —
But You're Probably Using It Wrong

A contrarian take on the orchestrator wars: where Airflow remains the boring, correct answer in 2026, the five usage patterns that cause 80% of "Airflow pain," and the honest cases where Dagster and Prefect genuinely win. With the architecture that separates orchestration from compute — the distinction most suffering teams have collapsed.

Discipline
Orchestration / Platform
Root Cause
5 antipatterns ≈ 80% of pain
Honest Exceptions
2 (Dagster, Prefect)
Vipra Practice
All three, in production
Stack
Airflow 3.x · Composer · MWAA
Published
June 2026
Executive Summary

Every cloud sells managed Airflow because demand keeps growing; the provider ecosystem is unmatched; the hiring market is full of engineers who know it; and Airflow 3.x shipped the things people actually complained about — DAG versioning, a modern UI, event-driven scheduling, first-class data assets. Tools with this much gravitational mass don't die; they get boring, and boring is a compliment in orchestration.

Most 'Airflow pain' is self-inflicted, and it concentrates in five antipatterns: computing inside tasks, shoving data through XCom, generating DAGs from mutable sources, mis-sized DAGs (one monolith or per-table confetti), and missing idempotency discipline. Fix those and the orchestrator complaints mostly evaporate — on any orchestrator.

The honest exceptions are real: asset-centric, lineage-first platforms (Dagster wins) and highly dynamic event-driven flows (Prefect wins). Vipra runs all three in production across client engagements; this article is the decision framework plus the discipline that matters more than the decision.

01 · Why the "Airflow Is Legacy" Narrative Is Wrong

Check the narrative against observables. Managed Airflow is sold by every major cloud (Composer, MWAA, Astronomer) — vendors do not build managed services for dying tools. The provider ecosystem numbers in the hundreds of maintained integrations; no challenger is within an order of magnitude. The hiring market is saturated with engineers who already operate it. And Airflow 3.x answered the historical complaints directly: DAG versioning (the deployment-archaeology problem, solved), a modern React UI, event-driven scheduling, and data assets as first-class scheduling citizens.

What actually happened: teams adopted Airflow during the boom, used it in the five wrong ways below, experienced the predictable pain, and attributed the pain to the tool just as newer tools shipped better demos. The demos are real, the pain was real — the causation, mostly, was not. Migrating an undisciplined platform relocates the mess; it does not clean it.

02 · The Architecture: Orchestrate, Don't Compute

trigger
Schedules, datasets/assets, external events. Airflow 3.x asset triggers chain domains without monoliths.
orchestrate
Airflow: thin tasks. Submit job → poll → record. Workers stay small; retries are cheap; the scheduler schedules.
compute
Engines do the work. Spark/Databricks jobs, dbt runs, BigQuery/Snowflake SQL, Kubernetes pods — sized, monitored, and scaled as compute, not as orchestrator workers.
state
Data passes by reference. Object storage and warehouse tables carry the data; XCom carries paths, run IDs, and row counts — metadata only.
observe
Lineage + alerting. Task-level SLAs, dataset freshness, and the pipeline-health layer dbt tests don't cover.

One sentence carries this whole article: Airflow is a scheduler, not a compute engine. Nearly every "Airflow is slow/flaky/unscalable" complaint we triage resolves to that boundary being collapsed — pandas transformations inside PythonOperators turning the scheduler into an underpowered, unobservable Spark cluster.

03 · The Five Ways Teams Actually Break Airflow

#AntipatternSymptom blamed on AirflowFix
1Processing data inside tasks"Workers OOM, scheduler is slow"Tasks trigger external compute and wait; thin workers, cheap retries
2XCom as a data pipe"Metadata DB is huge, UI crawls"Pass references; data lives in object storage/warehouse
3Dynamic DAGs from mutable sources"Scheduling randomly stalls"Generate from static repo config; dynamic task mapping inside stable DAGs
4Mega-DAG or per-table confetti"Retries are negotiations / lineage is invisible"Domain-sized DAGs chained by assets (§05)
5No idempotency discipline"Airflow is unreliable"Tasks as pure functions of logical date; partition-overwrite writes

Number 5 deserves its own paragraph because it is the deepest: half of perceived orchestrator unreliability is tasks that cannot be safely re-run. Every task should be a deterministic function of its logical date — same inputs, same outputs, partition-overwrite instead of append-and-hope. This is pipeline engineering, not tooling; no orchestrator fixes it, and every orchestrator is blamed for it.

04 · The Anti-Pattern Data Flow — and the Fixed One

THE BROKEN SHAPE (what we get called into) scheduler ──► PythonOperator: pd.read_sql(8GB) ──► transform in worker RAM │ XCom.push(dataframe) ←── serialized into the metadata DB ▼ PythonOperator: more pandas ──► load ──► OOM at month 9, 2am THE FIXED SHAPE (orchestrate, don't compute) scheduler ──► submit: Databricks job / dbt Cloud run / BigQuery SQL │ poll until done (worker: ~0 CPU, ~0 RAM) │ XCom.push(run_id, row_count, output_path) ← metadata only ▼ next task reads the reference, triggers the next engine │ ▼ retry semantics: re-submit the job (idempotent, partition-overwrite) scaling: the engine's problem, where it belongs observability: engine UI for compute, Airflow for flow
the thin task — what good looks like (Airflow 3.x)
@task def run_transform(logical_date=None): run = databricks.jobs.submit( job_id=TRANSFORM_JOB, params={"ds": logical_date.isoformat()}) # pure function of logical date result = databricks.jobs.wait(run.run_id, timeout=3600) return {"run_id": run.run_id, # metadata through XCom — "rows": result.metrics.rows_written, # never the data itself "path": result.output_path}

05 · Right-Sizing DAGs: Between Monolith and Confetti

Both extremes hurt, and most estates have visited both. The 400-task mega-DAG makes every retry a negotiation, every deploy a risk to everything, and the UI a crime scene. The 400 single-task DAGs make lineage invisible and cross-domain dependencies a folklore tradition. The working middle: DAGs sized to business domains (orders, payments, marketing — the boundaries along which teams own things and incidents get paged), chained by data assets rather than cross-DAG trigger spaghetti: the orders DAG declares it produces orders_gold; downstream DAGs schedule on that asset's updates. Airflow 3.x made this first-class; it is the single biggest structural upgrade available to most estates, and it costs a refactor measured in days, not quarters.

06 · Where the Challengers Honestly Win

SituationBetter toolWhy — honestly
Asset/lineage-first platform; strong local-dev and testing cultureDagsterSoftware-defined assets make lineage the primary abstraction; best-in-class local testability. If your platform thinks in assets, the fit is real.
Bursty, event-driven, highly dynamic flows; many ad-hoc runsPrefectPython-native dynamic flows without parse-time ceremony. Workflow shapes unknown until runtime are genuinely awkward in Airflow.
dbt-only shopdbt schedulerAn orchestrator on top of one tool is pure overhead.
Scheduled multi-system batch platform, mixed teamAirflowEcosystem, hiring pool, managed offerings, 3.x maturity. The boring, correct default.

We run all three in production for clients and the honest summary has not changed: tool choice moves outcomes ~20%; the disciplines in Sections 02–05 move them ~80% — on any orchestrator. A team migrating to Dagster while keeping fat tasks and append-writes will shortly publish a "Dagster pain points" post.

07 · Production Evidence: Orchestration Across Our Engagements

The thin-task, asset-chained architecture is the orchestration spine of Vipra's documented work: the 560-model banking platform (Airflow triggering dbt and BigQuery — runtime cut from 6.5 hours to 87 minutes by fixing the pipeline, not replacing the scheduler); the BigQuery modernization (Composer orchestrating a serverless stack at 62% lower TCO); and the PySpark legacy modernization, where 10-hour SSIS nights became sub-2-hour runs — orchestrated by thin Airflow tasks submitting Spark jobs, the exact pattern of Section 04. In every engagement the orchestrator survived the audit; the antipatterns did not.

6.5h→87m
Banking Pipeline —
Fixed, Not Replatformed
10h→2h
Legacy Nightly —
Thin Tasks + Spark
5
Antipatterns ≈ 80%
of "Airflow Pain"
~20%
What Tool Choice
Actually Moves

08 · Lessons Learned: The Hard Truths

  • Every "Airflow is broken" triage starts with the same grep. Search the DAG repo for pandas imports in operators. The hit count predicts the incident history with embarrassing accuracy.
  • XCom abuse is invisible until the metadata DB isn't. Dataframes through XCom work fine in the demo and produce a 400GB metadata database by year two. Pass references from the first DAG.
  • Parse-time external calls are a time bomb with a quiet fuse. The DAG factory that queries a database at import time works until that database is slow during a scheduler heartbeat — and then nothing schedules. Static config in the repo, dynamic mapping at runtime.
  • Idempotency is the cheapest reliability you will ever buy. Partition-overwrite writes and logical-date purity turned our worst client pipeline from nightly babysitting to boring. Zero orchestrator changes involved.
  • Managed Airflow is worth it for almost everyone. Scheduler HA, upgrades, and scaling are undifferentiated heavy lifting. Self-host only with platform engineers to own it and requirements managed offerings can't meet.
  • Migrations relocate mess; they don't clean it. Two clients arrived mid-migration to a challenger, carrying their antipatterns with them. Both finished the migration; both still needed the discipline work. Do the discipline first — you may find the migration unnecessary.

09 · Key Takeaways for Practitioners

🎯
Orchestrate, don't compute

Tasks submit and wait; engines work; data passes by reference. The one boundary that prevents most pain.

📦
XCom is for metadata

Paths, run IDs, row counts. Dataframes in the metadata DB are the slow Airflow you then blame.

🧬
Idempotent or unreliable

Pure functions of logical date, partition-overwrite writes. No orchestrator fixes this; every one is blamed for it.

🧩
Domain DAGs, asset-chained

Between monolith and confetti: DAGs at team boundaries, linked by Airflow 3.x data assets.

⚖️
Honest exceptions exist

Dagster for asset-first platforms, Prefect for dynamic flows, dbt's scheduler for dbt-only shops. Otherwise: boring wins.

🛠️
Discipline before migration

Tool choice moves ~20%; the five fixes move ~80%. Audit the antipatterns before funding the replatform.

The production evidence: dbt at Scale (banking), the PySpark legacy modernization, and the BigQuery FinOps engagement. For the pipeline-health layer orchestration needs beside it, see Why Your dbt Tests Are Giving You False Confidence.

FAQ · Frequently Asked Questions

Is Apache Airflow still worth learning in 2026?
Yes — it remains the most widely deployed orchestrator, every major cloud sells a managed version, and Airflow 3.x addressed the historical complaints (DAG versioning, modern UI, event-driven scheduling, data assets). The hiring market alone makes it the default skill.
Should I migrate from Airflow to Dagster or Prefect?
Only if your pain maps to their genuine strengths: Dagster for asset-centric lineage and local testability, Prefect for dynamic event-driven flows. If your pain is slow scheduling, flaky tasks, or unobservable pipelines, audit the five antipatterns first — migrating an undisciplined platform just relocates the mess.
What is the most common Airflow mistake?
Doing data processing inside tasks instead of triggering external compute. It turns the scheduler into a fragile compute cluster, makes retries expensive, and causes most perceived instability. Tasks should orchestrate; Spark, dbt, and warehouses should compute.
Is managed Airflow (Composer, MWAA, Astronomer) worth it?
For most teams, yes — scheduler HA, upgrades, and scaling are undifferentiated heavy lifting. Self-host only if you have platform engineers to own it and unusual requirements (custom executors, strict residency) that managed offerings can't meet.