Idempotência, bloqueios e nova tentativa.
As proteções operacionais reduzem o processamento duplicado e gravações simultâneas acidentais. Eles complementam o orquestrador; eles não substituem o design correto do trabalho.
Políticas de idempotência
| Política | Comportamento |
|---|---|
always_run | Execute sempre. Este é o padrão. |
skip_if_success | Pule quando a mesma chave já tiver sido bem-sucedida. |
fail_if_success | Falha quando a mesma chave já foi bem-sucedida. |
rerun_if_failed | Execute somente quando a execução anterior da chave falhou. |
Exemplo
- YAML
- Python
idempotency_key: "orders:${run_date}"
idempotency_policy: skip_if_success
lock_enabled: true
retry_attempts: 5
retry_backoff_seconds: 10
result = ingest(
...,
idempotency_key="orders:${run_date}",
idempotency_policy="skip_if_success",
lock_enabled=True,
retry_attempts=5,
retry_backoff_seconds=10,
)
Fechaduras
Os bloqueios são cooperativos e de melhor esforço. Eles protegem os escritores do ContractForge de pisarem uns nos outros, mas não podem impedir que um trabalho do Spark não relacionado seja gravado no mesmo destino.
- Use bloqueios para trabalhos agendados que gravam o mesmo destino.
- Mantenha as mensagens de bloqueio acionáveis para os operadores.
- A liberação acontece em caminhos de falha por meio do bloco de orquestração
finally.
Tentar novamente
A nova tentativa é útil para conflitos Delta transitórios e ruído de infraestrutura. Ele não deve ocultar falhas determinísticas de contrato, como esquema inválido, credenciais incorretas ou barreiras de qualidade quebradas.