Agendamento e Reconciliação

Como funciona a auto-materialização declarativa e a propagação de atualizações de assets no Dagster.

O pipeline do Urbis Datalake utiliza a abordagem de Auto-Materialização Declarativa (Declarative Asset Reconciliation) do Dagster em substituição a jobs cron imperativos tradicionais.

Isso elimina falhas de orquestração ao processar assets particionados dinamicamente e garante que todas as camadas downstream sejam atualizadas assim que novos dados chegarem.


⚙️ Como Funciona o Fluxo Declarativo

Diagrama Interativo
Carregando diagrama...

1. Agendamento Semanal na Origem (Raw)

Os assets da camada raw (dados obtidos via WFS, ArcGIS REST ou scrapers) utilizam uma condição de automação cron semanal:

automation_condition = AutomationCondition.on_cron("0 0 * * 0", "America/Sao_Paulo")

Isso garante que todas as origens busquem atualizações automaticamente todo domingo à meia-noite.

2. Efeito Dominó Eager (Downstream)

Os assets das camadas subsequentes (bronze, silver e gold) são configurados com a política reativa:

automation_condition = AutomationCondition.eager()

Assim que um asset pai (upstream) for materializado com sucesso, o daemon do Dagster automaticamente escalona uma run para materializar o asset filho (downstream).


🎯 Configuração Centralizada

Para evitar duplicar código de automação em centenas de arquivos de assets, a regra é aplicada de forma programática e declarativa no ponto de entrada dagster_urbis.py:

from dagster import AutomationCondition, Definitions

# Aplica cron nos assets Raw e eager() nos demais
raw_assets = [asset.with_automation_condition(AutomationCondition.on_cron("0 0 * * 0", "America/Sao_Paulo")) for asset in raw_definitions]
bronze_assets = [asset.with_automation_condition(AutomationCondition.eager()) for asset in bronze_definitions]
silver_assets = [asset.with_automation_condition(AutomationCondition.eager()) for asset in silver_definitions]
gold_assets = [asset.with_automation_condition(AutomationCondition.eager()) for asset in gold_definitions]

defs = Definitions(
    assets=[*raw_assets, *bronze_assets, *silver_assets, *gold_assets],
    resources=global_resources,
)

🌟 Benefícios Desta Abordagem

  • Suporte Nativo a Partições Dinâmicas: Assets divididos por setores ou zonas fiscais (ex: lotes cadastrais) recalculam apenas as partições que sofreram mutação na fonte.
  • Resiliência e Consistência de Banco: Se ocorrer uma inconsistência na camada Bronze, as camadas Silver e Gold não são disparadas para aquele fluxo, preservando o banco PostGIS íntegro.
  • Manutenção Centralizada: Alterações de periodicidade são configuradas no ponto de entrada global, sem necessidade de editar assets individuais.