Por que seu Airflow pode estar lento? O papel do XCom e do banco de metadados
- Gilmar Pupo
- 26 de set.
- 3 min de leitura
Ao rodar pipelines no Apache Airflow, é comum notar que a latência entre tasks às vezes parece maior do que deveria. Muitas vezes, o "culpado invisível" está no mecanismo de troca de mensagens interno: o XCom.
Como funciona o XCom?
O XCom (cross-communication) é a forma padrão de uma task passar dados para outra. Por baixo dos panos, ele funciona assim:
Task 1 executa e dá um return ou xcom_push.
Esse valor é serializado e armazenado na tabela xcom no banco de metadados do Airflow.
Task 2 ao dar xcom_pull, busca o valor no banco e desserializa para uso.
Ou seja, não existe "memória compartilhada direta" entre tasks. Tudo passa pelo banco de dados.

Onde entra a latência?
Se o banco de metadados estiver em um local fisicamente distante do cluster de execução (workers e scheduler), cada escrita/leitura do XCom vai atravessar a rede. Isso adiciona tempo em cada interação:
Task 1 → grava resultado no banco remoto.
Task 2 → lê resultado do banco remoto.
Esse round trip pode ser pequeno, mas em pipelines com muitas tasks, ele se acumula e vira um gargalo.
Como melhorar
Aproxime o banco dos workersColoque o banco de metadados na mesma região ou VPC do cluster. Isso reduz a latência de rede.
Evite XComs grandesO XCom foi feito para pequenos metadados (strings curtas, números, caminhos de arquivos).Não é boa prática empurrar JSONs gigantes ou DataFrames inteiros.Para dados grandes, use storage externo (S3, GCS, Azure Blob, etc.) e passe apenas o path via XCom.
Monitore o banco de metadadosEle é central para o Airflow. Se estiver sobrecarregado, não só os XComs, mas todo o sistema pode sofrer.
XCom Backends Customizados com Object Storage
O mecanismo padrão de XCom utiliza a tabela xcom no seu banco de dados (Postgres, MySQL, etc.) para armazenar e recuperar os dados trocados entre as tarefas. Para ambientes de produção, essa abordagem apresenta três desafios principais:
Sobrecarga do Metadado: Seu banco de dados é o cérebro da operação do Airflow, gerenciando status de tarefas, agendamentos e conexões. Sobrecarregá-lo com dados de XComs pode degradar a performance geral do seu ambiente.
Limitação de Tamanho: Bancos de dados relacionais não foram feitos para armazenar grandes volumes de dados binários ou dataframes. Tentar passar um arquivo de alguns megabytes via XCom padrão é uma receita para o desastre.
Latência de Rede: Como discutido anteriormente, se seus workers e seu banco de dados estão em redes ou regiões diferentes, cada xcom_push e xcom_pull se torna uma viagem de ida e volta que adiciona latência e lentidão às suas DAGs.
A Solução: A Arquitetura com Object Storage
A beleza da abordagem com um backend customizado é sua simplicidade e eficiência. Em vez de salvar o dado em si no banco de dados, o Airflow faz o seguinte:
Escrita Inteligente: A tarefa de origem (task1) envia o dado do XCom diretamente para um serviço de armazenamento de objetos, como Amazon S3, Google Cloud Storage (GCS) ou Azure Blob Storage.
Ponteiro Leve: Em seguida, ela salva apenas um ponteiro (a URI para o objeto recém-criado) na tabela xcom do banco de dados.
Leitura Eficiente: A tarefa de destino (task2) primeiro lê o ponteiro leve do banco de dados e, em seguida, usa essa informação para buscar o dado real diretamente do serviço de armazenamento.
Mão na Massa: Configurando seu Backend no Airflow 3
Configurar isso é surpreendentemente simples e é feito através de algumas configurações no seu airflow.cfg ou por meio de variáveis de ambiente. Usando o provedor common-io e o Amazon S3 como exemplo:
1. Instale o Provedor:
Bash
pip install apache-airflow-providers-common-io
2. Configure as Variáveis de Ambiente:
Bash
# Define o backend a ser usado
export AIRFLOW__CORE__XCOM_BACKEND='airflow.providers.common.io.xcom.backend.XComObjectStorageBackend'
# Define o caminho no S3, incluindo a conexão Airflow para a AWS
export AIRFLOW__COMMON_IO__XCOM_OBJECTSTORAGE_PATH='s3://minha-conexao-aws@meu-bucket-de-xcoms/caminho/'
# (Opcional) Define um limite. XComs menores que este valor (em bytes)
# ainda usarão o banco de dados. Ótimo para pequenos valores como strings.
export AIRFLOW__COMMON_IO__XCOM_OBJECTSTORAGE_THRESHOLD='-1' # -1 força tudo para o S3
Benefícios Imediatos
Ao adotar essa arquitetura, você ganha:
🚀 Escalabilidade Quase Infinita: Passe dataframes, modelos de machine learning, ou qualquer outro artefato, sem se preocupar com os limites do seu banco de dados.
⚡ Performance Acelerada: Libere seu banco de dados para focar no que ele faz de melhor: gerenciar metadados. As operações de I/O de dados são delegadas para um serviço altamente otimizado para isso.
❤️ Saúde do Ambiente: Mantenha seu banco de dados enxuto e rápido, garantindo a estabilidade e a responsividade do seu Airflow a longo prazo.
Abandonar o XCom backend padrão em favor de uma solução baseada em object storage não é apenas uma otimização; é uma evolução na forma como seus pipelines de dados se comunicam. Para qualquer ambiente Airflow 3 sério e em produção, essa é a abordagem recomendada para garantir performance, escalabilidade e confiabilidade.



Comentários