Saltar al contenido principal
Didit recauda 7,5M $ para construir la infraestructura para identidad y fraude
Didit
Volver al blog
Blog · 6 de marzo de 2026

Manejo Avanzado de Errores en Flujos de Verificación de Identidad Asincrónicos (ES)

Dominar el manejo de errores en la verificación de identidad asincrónica es crucial. Esta guía explora estrategias como reintentos con retroceso exponencial, disyuntores y registro integral en Python, asegurando la resiliencia.

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

Reintentos RobustosImplemente retroceso exponencial y "jitter" para errores transitorios en llamadas API a servicios externos de verificación de identidad, previniendo la sobrecarga del sistema y mejorando las tasas de éxito.

Patrones de DisyuntorProteja su sistema de fallos en cascada deteniendo temporalmente las solicitudes a servicios fallidos, permitiéndoles recuperarse y preservando la estabilidad general de la aplicación.

Registro y Monitoreo IntegralUtilice registro estructurado, IDs de correlación y monitoreo en tiempo real para identificar, diagnosticar y resolver rápidamente problemas dentro de las tuberías de verificación de identidad asincrónicas distribuidas.

Resiliencia Incorporada de DiditLa plataforma modular y nativa de IA de Didit ofrece flujos de trabajo orquestados y un diseño de API robusto, abstraendo el complejo manejo de errores para las verificaciones KYC, de vivacidad y AML principales, mejorando la fiabilidad y la experiencia del desarrollador.

En el mundo de la verificación de identidad, la velocidad y la fiabilidad son primordiales. A medida que las empresas escalan, los flujos de trabajo asincrónicos se vuelven esenciales para manejar grandes volúmenes de solicitudes sin bloquear el hilo principal de la aplicación. Sin embargo, esta naturaleza distribuida y no bloqueante introduce complejidades significativas, especialmente en lo que respecta al manejo de errores. Problemas de red, interrupciones del servicio, inconsistencias de datos y respuestas inesperadas de la API pueden descarrilar un proceso de verificación de identidad, lo que lleva a una mala experiencia de usuario, riesgos de cumplimiento e ineficiencias operativas.

Esta publicación de blog profundiza en estrategias avanzadas de manejo de errores para flujos de trabajo de verificación de identidad asincrónicos, centrándose específicamente en implementaciones de Python. Exploraremos cómo construir sistemas más resilientes y tolerantes a fallos, asegurando que incluso cuando las cosas salgan mal, sus procesos de verificación sigan siendo robustos.

El Desafío de los Errores Asincrónicos en la Verificación de Identidad

La verificación de identidad asincrónica a menudo implica múltiples servicios externos: un proveedor de verificación de ID como Didit para OCR y verificaciones de vivacidad, un servicio de detección AML, una base de datos de prueba de domicilio y potencialmente otras fuentes de datos. Cada una de estas interacciones es un posible punto de fallo. El manejo de errores síncrono tradicional (por ejemplo, un simple bloque try-except) es insuficiente cuando las operaciones pueden completarse mucho más tarde, en un proceso diferente, o incluso fallar silenciosamente sin una retroalimentación inmediata.

Considere un flujo de trabajo KYC típico: un usuario carga su ID, se realiza una verificación de vivacidad y luego se inicia una detección AML. Si el servicio de verificación de vivacidad experimenta un problema de red transitorio, simplemente reintentar inmediatamente podría exacerbar el problema. Si el servicio AML está completamente caído, los intentos repetidos solo desperdiciarán recursos y retrasarán la incorporación del usuario.

Implementación de Reintentos Robustos con Retroceso Exponencial y Jitter

Uno de los tipos de errores más comunes en sistemas distribuidos son los fallos transitorios. Estos son problemas temporales como fallas de red, errores de servicio ocupado o contención de bases de datos que se resuelven solos después de un corto período. Reintentar ciegamente inmediatamente después de un fallo puede sobrecargar un servicio con problemas, lo que lleva a un fallo en cascada. La solución son los reintentos inteligentes utilizando retroceso exponencial y "jitter".

El retroceso exponencial implica aumentar el tiempo de espera entre reintentos exponencialmente. Por ejemplo, esperar 1 segundo, luego 2, luego 4, luego 8, y así sucesivamente. Esto le da tiempo al servicio para recuperarse. El jitter añade un pequeño retraso aleatorio al tiempo de retroceso, evitando que todos los clientes reintenten exactamente al mismo tiempo, lo que podría crear un problema de "thundering herd".


import asyncio
import random

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

    try:
        # Simulate an API call to Didit's ID Verification or Liveness service
        if random.random() < 0.6 and attempt < 3: # Simulate transient failure
            raise ConnectionError(f"Simulated API error on attempt {attempt+1}")

        print(f"Successfully called Didit API on attempt {attempt+1} with data: {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"Attempt {attempt+1} failed: {e}. Retrying in {delay:.2f} seconds...")
            await asyncio.sleep(delay)
            return await call_didit_api(data, attempt + 1)
        else:
            print(f"All {max_retries} attempts failed for data: {data}")
            raise # Re-raise the last exception if all retries fail

async def main():
    try:
        # Example usage for Didit's ID Verification
        result = await call_didit_api({"document_image": "base64_id_scan"})
        print(f"Final result: {result}")

        # Example usage for Didit's Liveness
        result_liveness = await call_didit_api({"liveness_video": "base64_video"})
        print(f"Final liveness result: {result_liveness}")

    except Exception as e:
        print(f"Workflow failed after retries: {e}")

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

Este patrón es invaluable al integrarse con servicios externos, incluidas las API de verificación de ID, vivacidad pasiva y activa, o detección AML de Didit, todas las cuales se benefician de una comunicación resiliente.

Implementación del Patrón de Disyuntor

Si bien los reintentos ayudan con los errores transitorios, pueden empeorar la situación si un servicio está experimentando interrupciones prolongadas. El patrón de disyuntor evita que su aplicación invoque repetidamente un servicio que probablemente falle. Funciona monitoreando los fallos, y si exceden un cierto umbral dentro de un tiempo determinado, "dispara" el circuito, abriéndolo para evitar más llamadas al servicio fallido. Después de un tiempo de espera configurable, entra en un estado "semiabierto", permitiendo algunas solicitudes de prueba para ver si el servicio se ha recuperado.


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: Moving to HALF_OPEN state.")
            else:
                raise CircuitBreakerOpenError("Circuit is OPEN. Service is likely down.")

        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: Service recovered. Moving to CLOSED state.")
        elif self.state == "CLOSED":
            self.failures = 0 # Reset failures on success in closed state

    def _on_failure(self, error):
        if self.state == "HALF_OPEN":
            self.state = "OPEN"
            self.last_failure_time = time.time()
            print(f"Circuit Breaker: Failure in HALF_OPEN. Moving to OPEN state. Error: {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: Failures exceeded threshold. Moving to OPEN state. Error: {error}")

class CircuitBreakerOpenError(Exception):
    pass

# Example usage with a simulated Didit AML Screening call
async def simulate_aml_screening():
    if random.random() < 0.7: # Simulate frequent failures
        raise ConnectionError("AML service unavailable")
    await asyncio.sleep(0.1)
    return {"aml_status": "clear"}

async def main():
    cb = CircuitBreaker()
    for i in range(20):
        try:
            print(f"--- Attempt {i+1} ---")
            result = await cb(simulate_aml_screening)
            print(f"AML Screening Success: {result}")
        except CircuitBreakerOpenError as e:
            print(f"Caught: {e}")
            await asyncio.sleep(1) # Wait a bit before next attempt if circuit is open
        except ConnectionError as e:
            print(f"Caught: {e}")
        await asyncio.sleep(0.5)

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

Este patrón es particularmente útil para servicios críticos como la detección AML de Didit o las operaciones de búsqueda facial a gran escala, donde una dependencia fallida podría afectar a muchos usuarios.

Registro, Monitoreo y Alerta Completos

Incluso con reintentos robustos y disyuntores, ocurrirán errores. La clave es saber cuándo suceden, entender por qué y reaccionar rápidamente. El registro completo, el monitoreo en tiempo real y las alertas proactivas son innegociables para los flujos de trabajo asincrónicos.

  • Registro Estructurado: Los mensajes de registro deben estar en un formato legible por máquina (por ejemplo, JSON) e incluir contexto como session_id, workflow_id, nombre del servicio, marca de tiempo y tipo de error. Esto permite una fácil agregación y análisis.
  • IDs de Correlación: Asigne un ID de correlación único a cada solicitud de verificación de identidad en su punto de entrada y páselo a través de todas las llamadas de servicio subsiguientes. Esto le permite rastrear el recorrido de un solo usuario a través de un sistema distribuido complejo, incluso cuando se utilizan servicios modulares como la verificación de ID y la estimación de edad de Didit.
  • Paneles de Monitoreo: Visualice métricas clave como tasas de éxito de API, latencia, tasas de error y longitudes de cola para cada componente de su flujo de trabajo. Herramientas como Prometheus, Grafana o servicios de monitoreo nativos de la nube son invaluables.
  • Alertas: Configure alertas para umbrales críticos (por ejemplo, una tasa de error que exceda el 5% durante 5 minutos, o un servicio específico que no sea accesible). Las alertas deben dirigirse al equipo correcto a través de PagerDuty, Slack o correo electrónico, lo que permite una acción inmediata.

Por ejemplo, cuando un usuario inicia una sesión de verificación utilizando los flujos de trabajo orquestados de Didit, se genera un session_id. Este ID debe capturarse en sus registros para cada paso, desde la llamada inicial a la API de Didit hasta la devolución de llamada final del webhook con los resultados de la verificación. Si surge un problema, puede filtrar rápidamente los registros por este session_id para identificar el punto exacto de fallo.

Cómo Ayuda Didit

Didit, como plataforma de identidad nativa de IA y centrada en el desarrollador, está diseñada para simplificar los complejos flujos de trabajo de verificación de identidad, incluidos sus desafíos inherentes de manejo de errores. Nuestra arquitectura modular significa que, si bien puede construir soluciones profundamente personalizadas, gran parte de la resiliencia subyacente se maneja por usted.

  • Flujos de Trabajo Orquestados: El motor de flujo de trabajo sin código de Didit le permite definir secuencias de verificación complejas (por ejemplo, verificación de ID + vivacidad + detección AML) sin escribir código extenso para la orquestación o la gestión de estados. Didit maneja los reintentos internos y las transiciones de estado, lo que reduce significativamente la carga del manejo de errores de su parte.
  • APIs y Webhooks Robustos: Nuestras API limpias están construidas para la fiabilidad, y nuestro sistema de webhooks proporciona actualizaciones en tiempo real sobre el estado de la verificación. Didit gestiona la entrega de estos webhooks con mecanismos de reintento incorporados, asegurando que reciba actualizaciones críticas incluso si su punto final no está disponible temporalmente.
  • KYC Básico Gratuito: Comience con la verificación de identidad esencial, incluida la verificación de ID (OCR, MRZ, códigos de barras) y la vivacidad pasiva y activa, sin costos iniciales. Esto le permite implementar una verificación robusta sin preocuparse por la resiliencia de la infraestructura subyacente.
  • Fiabilidad Nativa de IA: Nuestros sistemas impulsados por IA están inherentemente diseñados para una alta disponibilidad y rendimiento, minimizando los errores internos y proporcionando resultados consistentes para productos como la coincidencia facial 1:1 y la estimación de edad.
  • Datos de Identidad Estructurados: Todos los resultados de la verificación se proporcionan como datos estructurados, lo que facilita que sus sistemas procesen los resultados y manejen las excepciones mediante programación.

Al aprovechar la plataforma de Didit, puede descargar gran parte de la complejidad del manejo de errores asincrónicos, centrándose en su lógica de negocio principal mientras garantiza una experiencia de verificación de identidad fiable y segura para sus usuarios.

¿Listo para empezar?

¿Listo para ver Didit en acción? Obtenga una demostración gratuita hoy.

Comience a verificar identidades de forma gratuita con el nivel gratuito de Didit.

Infraestructura para identidad y fraude.

Una API para KYC, KYB, Monitoreo de Transacciones y Detección de Fraude en Wallets. Intégrala en 5 minutos.

Pide a una IA que resuma esta página
Manejo avanzado de errores en verificación de identidad.