top of page

Por que seu Airflow pode estar lento? O papel do XCom e do banco de metadados

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:

  1. Task 1 executa e dá um return ou xcom_push.

  2. Esse valor é serializado e armazenado na tabela xcom no banco de metadados do Airflow.

  3. 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.

ree

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

  1. Aproxime o banco dos workersColoque o banco de metadados na mesma região ou VPC do cluster. Isso reduz a latência de rede.

  2. 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.

  3. 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:

  1. 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.

  2. 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.

  3. 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:

  1. 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.

  2. Ponteiro Leve: Em seguida, ela salva apenas um ponteiro (a URI para o objeto recém-criado) na tabela xcom do banco de dados.

  3. 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


bottom of page