class LockingXComBackend(BaseXCom): @classmethod def set(cls, key, value, task_id, dag_id, session, **kwargs): with acquire_lock(f"dag_id.task_id.key"): return super().set(key, value, task_id, dag_id, session, **kwargs)
| Practice | Why it matters | |----------|----------------| | (>1MB) | XCom is stored in the metadata DB; large data degrades performance. Use S3/GCS for big payloads. | | Use explicit keys | Avoid default return_value key; name keys uniquely. | | Limit cross-DAG XCom | xcom_pull(dag_id='other_dag') breaks encapsulation. | | Clear XCom after use | Delete sensitive or one-time data manually. | | Set xcom_disable=True for tasks that don't need it | Reduces DB bloat. | | Use taskflow API for automatic XCom handling | Reduces race conditions by design. | airflow xcom exclusive