Saltar para o conteúdo principal
Didit angaria 7,5 milhões de dólares para construir a infraestrutura para identidade e fraude
Didit
Voltar ao blog
Blog · 6 de março de 2026

Gestão Avançada de Erros em Fluxos de Verificação de Identidade Assíncronos (PT-PT)

Dominar a gestão de erros em verificação de identidade assíncrona é crucial para sistemas robustos. Este guia explora estratégias como retentativas com "backoff", "circuit breakers" e registos abrangentes em Python, garantindo.

Por DiditAtualizado
advanced-error-handling-in-asynchronous-identity-verification-workflows.png

Retentativas RobustasImplemente "exponential backoff" e "jitter" para erros transitórios em chamadas de API a serviços externos de verificação de identidade, prevenindo a sobrecarga do sistema e melhorando as taxas de sucesso.

Padrões de "Circuit Breaker"Proteja o seu sistema contra falhas em cascata, interrompendo temporariamente os pedidos a serviços com falhas, permitindo a sua recuperação e preservando a estabilidade geral da aplicação.

Registo e Monitorização AbrangentesUtilize registos estruturados, IDs de correlação e monitorização em tempo real para identificar, diagnosticar e resolver rapidamente problemas em pipelines assíncronos distribuídos de verificação de identidade.

Resiliência Integrada da DiditA plataforma modular e nativa de IA da Didit oferece fluxos de trabalho orquestrados e um design de API robusto, abstraindo a complexidade da gestão de erros para verificações essenciais de KYC, prova de vida e AML, melhorando a fiabilidade e a experiência do programador.

No mundo da verificação de identidade, a velocidade e a fiabilidade são primordiais. À medida que as empresas crescem, os fluxos de trabalho assíncronos tornam-se essenciais para lidar com grandes volumes de pedidos sem bloquear o "thread" principal da aplicação. No entanto, esta natureza distribuída e não bloqueante introduz complexidades significativas, especialmente no que diz respeito à gestão de erros. Problemas de rede, interrupções de serviço, inconsistências de dados e respostas inesperadas da API podem desviar um processo de verificação de identidade, levando a uma má experiência do utilizador, riscos de conformidade e ineficiências operacionais.

Esta publicação no blogue aprofunda as estratégias avançadas de gestão de erros para fluxos de trabalho de verificação de identidade assíncronos, focando especificamente em implementações Python. Exploraremos como construir sistemas mais resilientes e tolerantes a falhas, garantindo que, mesmo quando as coisas correm mal, os seus processos de verificação permaneçam robustos.

O Desafio dos Erros Assíncronos na Verificação de Identidade

A verificação de identidade assíncrona envolve frequentemente múltiplos serviços externos: um fornecedor de verificação de ID como a Didit para verificações de OCR e prova de vida, um serviço de rastreio de AML, uma base de dados de prova de morada e potencialmente outras fontes de dados. Cada uma destas interações é um ponto potencial de falha. A gestão de erros síncrona tradicional (por exemplo, um simples bloco "try-except") é insuficiente quando as operações podem ser concluídas muito mais tarde, num processo diferente, ou até falhar silenciosamente sem feedback imediato.

Considere um fluxo de trabalho KYC típico: um utilizador carrega o seu ID, é realizada uma verificação de prova de vida e, em seguida, inicia-se um rastreio de AML. Se o serviço de verificação de prova de vida sofrer um problema de rede transitório, uma simples nova tentativa imediata pode exacerbar o problema. Se o serviço AML estiver completamente inativo, as tentativas repetidas apenas desperdiçarão recursos e atrasarão a integração do utilizador.

Implementar Retentativas Robustas com "Exponential Backoff" e "Jitter"

Um dos tipos de erros mais comuns em sistemas distribuídos são as falhas transitórias. São problemas temporários como falhas de rede, erros de serviço ocupado ou contenção de base de dados que se resolvem após um curto período. Tentar novamente cegamente imediatamente após uma falha pode sobrecarregar um serviço em dificuldades, levando a uma falha em cascata. A solução são as retentativas inteligentes usando "exponential backoff" e "jitter".

O "exponential backoff" envolve aumentar o tempo de espera entre as retentativas exponencialmente. Por exemplo, esperar 1 segundo, depois 2, depois 4, depois 8 e assim por diante. Isso dá tempo ao serviço para recuperar. O "jitter" adiciona um pequeno atraso aleatório ao tempo de "backoff", impedindo que todos os clientes tentem novamente no mesmo momento exato, o que poderia criar um problema de "thundering herd".


import asyncio
import random

async def call_didit_api(data, attempt=0):
    max_retries = 5
    base_delay = 1  # seconds

    try:
        # Simula uma chamada de API para o serviço de Verificação de ID ou Prova de Vida da Didit
        if random.random() < 0.6 and attempt < 3: # Simula falha transitória
            raise ConnectionError(f"Erro de API simulado na tentativa {attempt+1}")

        print(f"API da Didit chamada com sucesso na tentativa {attempt+1} com dados: {data}")
        return {"status": "success", "result": "verification_data"}

    except (ConnectionError, asyncio.TimeoutError) as e:
        if attempt < max_retries - 1:
            delay = base_delay * (2 ** attempt) + random.uniform(0, 0.5) # Exponential backoff + jitter
            print(f"Tentativa {attempt+1} falhou: {e}. A tentar novamente em {delay:.2f} segundos...")
            await asyncio.sleep(delay)
            return await call_didit_api(data, attempt + 1)
        else:
            print(f"Todas as {max_retries} tentativas falharam para os dados: {data}")
            raise # Re-lança a última exceção se todas as retentativas falharem

async def main():
    try:
        # Exemplo de uso para a Verificação de ID da Didit
        result = await call_didit_api({"document_image": "base64_id_scan"})
        print(f"Resultado final: {result}")

        # Exemplo de uso para a Prova de Vida da Didit
        result_liveness = await call_didit_api({"liveness_video": "base64_video"})
        print(f"Resultado final da prova de vida: {result_liveness}")

    except Exception as e:
        print(f"O fluxo de trabalho falhou após as retentativas: {e}")

if __name__ == "__main__":
    asyncio.run(main())

Este padrão é inestimável ao integrar com serviços externos, incluindo a Verificação de ID, Prova de Vida Passiva e Ativa, ou APIs de Rastreio de AML da Didit, todos os quais beneficiam de comunicação resiliente.

Implementar o Padrão "Circuit Breaker"

Embora as retentativas ajudem com erros transitórios, podem piorar a situação se um serviço estiver a experimentar interrupções prolongadas. O padrão "circuit breaker" impede que a sua aplicação invoque repetidamente um serviço que provavelmente irá falhar. Funciona monitorizando as falhas e, se excederem um certo limite dentro de um determinado tempo, "dispara" o circuito, abrindo-o para evitar mais chamadas ao serviço com falha. Após um tempo limite configurável, entra num estado "half-open", permitindo alguns pedidos de teste para ver se o serviço recuperou.


import asyncio
import time
from collections import deque

class CircuitBreaker:
    def __init__(self, failure_threshold=3, recovery_timeout=10, half_open_attempts=1):
        self.state = "CLOSED"
        self.failure_threshold = failure_threshold
        self.recovery_timeout = recovery_timeout
        self.half_open_attempts = half_open_attempts
        self.failures = 0
        self.last_failure_time = None
        self.successes_in_half_open = 0

    async def __call__(self, func, *args, **kwargs):
        if self.state == "OPEN":
            if time.time() - self.last_failure_time > self.recovery_timeout:
                self.state = "HALF_OPEN"
                self.successes_in_half_open = 0
                print("Circuit Breaker: A mover para o estado HALF_OPEN.")
            else:
                raise CircuitBreakerOpenError("O circuito está ABERTO. O serviço está provavelmente inativo.")

        try:
            result = await func(*args, **kwargs)
            self._on_success()
            return result
        except Exception as e:
            self._on_failure(e)
            raise

    def _on_success(self):
        if self.state == "HALF_OPEN":
            self.successes_in_half_open += 1
            if self.successes_in_half_open >= self.half_open_attempts:
                self.state = "CLOSED"
                self.failures = 0
                print("Circuit Breaker: Serviço recuperado. A mover para o estado CLOSED.")
        elif self.state == "CLOSED":
            self.failures = 0 # Reiniciar falhas em caso de sucesso no estado fechado

    def _on_failure(self, error):
        if self.state == "HALF_OPEN":
            self.state = "OPEN"
            self.last_failure_time = time.time()
            print(f"Circuit Breaker: Falha em HALF_OPEN. A mover para o estado OPEN. Erro: {error}")
        elif self.state == "CLOSED":
            self.failures += 1
            if self.failures >= self.failure_threshold:
                self.state = "OPEN"
                self.last_failure_time = time.time()
                print(f"Circuit Breaker: Falhas excederam o limite. A mover para o estado OPEN. Erro: {error}")

class CircuitBreakerOpenError(Exception):
    pass

# Exemplo de uso com uma chamada simulada de Rastreio de AML da Didit
async def simulate_aml_screening():
    if random.random() < 0.7: # Simula falhas frequentes
        raise ConnectionError("Serviço AML indisponível")
    await asyncio.sleep(0.1)
    return {"aml_status": "clear"}

async def main():
    cb = CircuitBreaker()
    for i in range(20):
        try:
            print(f"--- Tentativa {i+1} ---")
            result = await cb(simulate_aml_screening)
            print(f"Sucesso no Rastreio de AML: {result}")
        except CircuitBreakerOpenError as e:
            print(f"Capturado: {e}")
            await asyncio.sleep(1) # Esperar um pouco antes da próxima tentativa se o circuito estiver aberto
        except ConnectionError as e:
            print(f"Capturado: {e}")
        await asyncio.sleep(0.5)

if __name__ == "__main__":
    asyncio.run(main())

Este padrão é particularmente útil para serviços críticos como o Rastreio de AML da Didit ou operações de Pesquisa Facial em larga escala, onde uma dependência com falha pode afetar muitos utilizadores.

Registo, Monitorização e Alerta Abrangentes

Mesmo com retentativas robustas e "circuit breakers", ocorrerão erros. A chave é saber quando acontecem, entender porquê e reagir rapidamente. O registo abrangente, a monitorização em tempo real e o alerta proativo são inegociáveis para fluxos de trabalho assíncronos.

  • Registo Estruturado: As mensagens de registo devem estar num formato legível por máquina (por exemplo, JSON) e incluir contexto como session_id, workflow_id, nome do serviço, carimbo de data/hora e tipo de erro. Isso permite fácil agregação e análise.
  • IDs de Correlação: Atribua um ID de correlação único a cada pedido de verificação de identidade no seu ponto de entrada e passe-o por todas as chamadas de serviço subsequentes. Isso permite rastrear a jornada de um único utilizador através de um sistema complexo e distribuído, mesmo ao usar serviços modulares como a Verificação de ID e a Estimativa de Idade da Didit.
  • Painéis de Monitorização: Visualize métricas chave como taxas de sucesso de API, latência, taxas de erro e tamanhos de fila para cada componente do seu fluxo de trabalho. Ferramentas como Prometheus, Grafana ou serviços de monitorização "cloud-native" são inestimáveis.
  • Alertas: Configure alertas para limiares críticos (por exemplo, taxa de erro excedendo 5% por 5 minutos, ou um serviço específico inacessível). Os alertas devem ser enviados para a equipa certa via PagerDuty, Slack ou e-mail, permitindo uma ação imediata.

Por exemplo, quando um utilizador inicia uma sessão de verificação usando os Fluxos de Trabalho Orquestrados da Didit, um session_id é gerado. Este ID deve ser capturado nos seus registos para cada passo, desde a chamada inicial de API para a Didit até ao "webhook callback" final com os resultados da verificação. Se surgir um problema, pode filtrar rapidamente os registos por este session_id para identificar o ponto exato de falha.

Como a Didit Ajuda

A Didit, como uma plataforma de identidade nativa de IA e focada no programador, foi concebida para simplificar fluxos de trabalho complexos de verificação de identidade, incluindo os seus desafios inerentes de gestão de erros. A nossa arquitetura modular significa que, embora possa construir soluções altamente personalizadas, grande parte da resiliência subjacente é tratada por nós.

  • Fluxos de Trabalho Orquestrados: O motor de fluxo de trabalho "no-code" da Didit permite definir sequências complexas de verificação (por exemplo, Verificação de ID + Prova de Vida + Rastreio de AML) sem escrever código extenso para orquestração ou gestão de estado. A Didit lida com as retentativas internas e transições de estado, reduzindo significativamente o fardo da gestão de erros do seu lado.
  • APIs e "Webhooks" Robustos: As nossas APIs limpas são construídas para fiabilidade, e o nosso sistema de "webhook" fornece atualizações em tempo real sobre o estado da verificação. A Didit gere a entrega destes "webhooks" com mecanismos de retentativa incorporados, garantindo que recebe atualizações críticas mesmo que o seu "endpoint" esteja temporariamente indisponível.
  • KYC Essencial Gratuito: Comece com a verificação de identidade essencial, incluindo Verificação de ID (OCR, MRZ, códigos de barras) e Prova de Vida Passiva e Ativa, sem custos iniciais. Isso permite-lhe implementar uma verificação robusta sem se preocupar com a resiliência da infraestrutura subjacente.
  • Fiabilidade Nativa de IA: Os nossos sistemas impulsionados por IA são inerentemente concebidos para alta disponibilidade e desempenho, minimizando erros internos e fornecendo resultados consistentes para produtos como Correspondência Facial 1:1 e Estimativa de Idade.
  • Dados de Identidade Estruturados: Todos os resultados da verificação são fornecidos como dados estruturados, tornando mais fácil para os seus sistemas processar resultados e lidar com exceções programaticamente.

Ao aproveitar a plataforma da Didit, pode descarregar grande parte da complexidade da gestão de erros assíncronos, focando-se antes na sua lógica de negócio principal, garantindo uma experiência de verificação de identidade fiável e segura para os seus utilizadores.

Pronto para Começar?

Pronto para ver a Didit em ação? Obtenha uma demonstração gratuita hoje.

Comece a verificar identidades gratuitamente com o nível gratuito da Didit.

Infraestrutura para identidade e fraude.

Uma API para KYC, KYB, Monitorização de Transações e Rastreio de Carteiras. Integre em 5 minutos.

Peça a uma IA para resumir esta página
Gestão Avançada de Erros em Verificação de Identidade.