Перейти к основному содержимому
Didit привлёк $7,5 млн на инфраструктуру для идентификации и борьбы с мошенничеством
Didit
В блог
Блог · 6 марта 2026 г.

Продвинутая обработка ошибок в асинхронных рабочих процессах верификации личности (RU)

Надежная обработка ошибок в асинхронной верификации личности критически важна для стабильных систем. Это руководство исследует стратегии, такие как повторные попытки с экспоненциальной задержкой, автоматические выключатели и.

Автор: DiditОбновлено
advanced-error-handling-in-asynchronous-identity-verification-workflows.png

Надежные повторные попыткиВнедрите экспоненциальную задержку и джиттер для временных ошибок при вызовах API к внешним службам верификации личности, предотвращая перегрузку системы и повышая успешность.

Паттерны автоматических выключателейЗащитите свою систему от каскадных сбоев, временно приостанавливая запросы к сбойным службам, позволяя им восстановиться и сохраняя общую стабильность приложения.

Комплексное логирование и мониторингИспользуйте структурированное логирование, идентификаторы корреляции и мониторинг в реальном времени для быстрого выявления, диагностики и разрешения проблем в распределенных асинхронных конвейерах верификации личности.

Встроенная отказоустойчивость DiditИИ-нативная, модульная платформа Didit предлагает оркестрованные рабочие процессы и надежный дизайн API, абстрагируя сложную обработку ошибок для основных проверок KYC, проверки живости и AML, повышая надежность и удобство для разработчиков.

В мире верификации личности скорость и надежность имеют первостепенное значение. По мере масштабирования бизнеса асинхронные рабочие процессы становятся неотъемлемой частью обработки больших объемов запросов без блокировки основного потока приложения. Однако эта распределенная и неблокирующая природа вносит значительные сложности, особенно когда речь идет об обработке ошибок. Проблемы с сетью, сбои в работе служб, несоответствия данных и неожиданные ответы API могут нарушить процесс верификации личности, что приведет к ухудшению пользовательского опыта, рискам соответствия требованиям и операционной неэффективности.

Эта статья в блоге посвящена продвинутым стратегиям обработки ошибок для асинхронных рабочих процессов верификации личности, с особым акцентом на реализации на Python. Мы рассмотрим, как создавать более устойчивые и отказоустойчивые системы, гарантируя, что даже в случае сбоев ваши процессы верификации останутся надежными.

Проблема асинхронных ошибок в верификации личности

Асинхронная верификация личности часто включает в себя несколько внешних сервисов: поставщика верификации личности, такого как Didit, для оптического распознавания символов (OCR) и проверки живости, службу проверки AML, базу данных подтверждения адреса и, возможно, другие источники данных. Каждое из этих взаимодействий является потенциальной точкой отказа. Традиционная синхронная обработка ошибок (например, простой блок try-except) недостаточна, когда операции могут завершиться гораздо позже, в другом процессе или даже тихо завершиться неудачей без немедленной обратной связи.

Рассмотрим типичный рабочий процесс KYC: пользователь загружает свое удостоверение личности, выполняется проверка живости, а затем инициируется проверка AML. Если служба проверки живости сталкивается с временной проблемой сети, простая немедленная повторная попытка может усугубить проблему. Если служба AML полностью не работает, повторные попытки только потратят ресурсы и задержат процесс регистрации пользователя.

Реализация надежных повторных попыток с экспоненциальной задержкой и джиттером

Один из наиболее распространенных типов ошибок в распределенных системах — это временные сбои. Это временные проблемы, такие как сбои сети, ошибки занятости службы или конфликты баз данных, которые устраняются сами по себе через короткое время. Слепая немедленная повторная попытка после сбоя может перегрузить сбойную службу, что приведет к каскадному сбою. Решение заключается в интеллектуальных повторных попытках с использованием экспоненциальной задержки и джиттера.

Экспоненциальная задержка включает в себя экспоненциальное увеличение времени ожидания между повторными попытками. Например, ждать 1 секунду, затем 2, затем 4, затем 8 и так далее. Это дает службе время для восстановления. Джиттер добавляет небольшую случайную задержку к времени задержки, предотвращая одновременные повторные попытки всех клиентов, что может создать проблему «громового стада».


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())

Этот паттерн бесценен при интеграции с внешними сервисами, включая API верификации личности Didit, пассивной и активной проверки живости или AML-скрининга, все из которых выигрывают от устойчивой связи.

Реализация паттерна автоматического выключателя

Хотя повторные попытки помогают при временных ошибках, они могут усугубить ситуацию, если служба испытывает длительные сбои. Паттерн автоматического выключателя предотвращает повторные вызовы вашего приложения к службе, которая, вероятно, выйдет из строя. Он работает путем мониторинга сбоев, и если они превышают определенный порог в течение заданного времени, он «срабатывает», открывая цепь, чтобы предотвратить дальнейшие вызовы к сбойной службе. После настраиваемого тайм-аута он переходит в «полуоткрытое» состояние, позволяя нескольким тестовым запросам проверить, восстановилась ли служба.


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())

Этот паттерн особенно полезен для критически важных сервисов, таких как AML-скрининг Didit или крупномасштабные операции поиска лиц, где сбойная зависимость может повлиять на многих пользователей.

Комплексное логирование, мониторинг и оповещение

Даже при надежных повторных попытках и автоматических выключателях ошибки будут возникать. Ключ к успеху — знать, когда они происходят, понимать, почему, и быстро реагировать. Комплексное логирование, мониторинг в реальном времени и проактивное оповещение являются обязательными для асинхронных рабочих процессов.

  • Структурированное логирование: Сообщения журнала должны быть в машиночитаемом формате (например, JSON) и включать контекст, такой как session_id, workflow_id, имя службы, временная метка и тип ошибки. Это позволяет легко агрегировать и анализировать данные.
  • Идентификаторы корреляции: Назначайте уникальный идентификатор корреляции каждому запросу на верификацию личности в точке его входа и передавайте его через все последующие вызовы служб. Это позволяет отслеживать путь одного пользователя через сложную распределенную систему, даже при использовании модульных служб, таких как верификация личности Didit и оценка возраста.
  • Панели мониторинга: Визуализируйте ключевые метрики, такие как процент успешных вызовов API, задержка, частота ошибок и длина очередей для каждого компонента вашего рабочего процесса. Такие инструменты, как Prometheus, Grafana или облачные службы мониторинга, бесценны.
  • Оповещение: Настройте оповещения для критических порогов (например, превышение частоты ошибок 5% в течение 5 минут или недоступность определенной службы). Оповещения должны поступать в нужную команду через PagerDuty, Slack или электронную почту, обеспечивая немедленные действия.

Например, когда пользователь инициирует сеанс верификации с использованием оркестрованных рабочих процессов Didit, генерируется session_id. Этот идентификатор должен быть записан в ваших журналах для каждого шага, от первоначального вызова API Didit до окончательного обратного вызова веб-хука с результатами верификации. Если возникает проблема, вы можете быстро отфильтровать журналы по этому session_id, чтобы точно определить точку отказа.

Как Didit помогает

Didit, как ИИ-нативная платформа идентификации, ориентированная на разработчиков, предназначена для упрощения сложных рабочих процессов верификации личности, включая присущие им проблемы обработки ошибок. Наша модульная архитектура означает, что, хотя вы можете создавать глубоко настроенные решения, большая часть базовой отказоустойчивости обрабатывается за вас.

  • Оркестрованные рабочие процессы: Механизм рабочих процессов Didit без кода позволяет определять сложные последовательности верификации (например, верификация личности + проверка живости + AML-скрининг) без написания обширного кода для оркестрации или управления состоянием. Didit обрабатывает внутренние повторные попытки и переходы состояний, значительно снижая нагрузку на обработку ошибок с вашей стороны.
  • Надежные API и веб-хуки: Наши чистые API созданы для надежности, а наша система веб-хуков предоставляет обновления статуса верификации в реальном времени. Didit управляет доставкой этих веб-хуков со встроенными механизмами повторных попыток, гарантируя получение критически важных обновлений, даже если ваша конечная точка временно недоступна.
  • Бесплатный базовый KYC: Начните с основной верификации личности, включая верификацию личности (OCR, MRZ, штрих-коды) и пассивную и активную проверку живости, без первоначальных затрат. Это позволяет вам реализовать надежную верификацию, не беспокоясь о надежности базовой инфраструктуры.
  • Надежность на основе ИИ: Наши системы на основе ИИ изначально разработаны для высокой доступности и производительности, минимизируя внутренние ошибки и обеспечивая согласованные результаты для таких продуктов, как сопоставление лиц 1:1 и оценка возраста.
  • Структурированные данные идентификации: Все результаты верификации предоставляются в виде структурированных данных, что упрощает обработку результатов и программное устранение исключений вашими системами.

Используя платформу Didit, вы можете снять с себя большую часть сложности асинхронной обработки ошибок, сосредоточившись вместо этого на своей основной бизнес-логике, обеспечивая при этом надежный и безопасный опыт верификации личности для ваших пользователей.

Готовы начать?

Готовы увидеть Didit в действии? Получите бесплатную демонстрацию сегодня.

Начните верификацию личности бесплатно с бесплатным тарифом Didit.

Инфраструктура для идентификации и борьбы с мошенничеством.

Единый API для KYC, KYB, мониторинга транзакций и проверки кошельков. Интеграция за 5 минут.

Попросите ИИ кратко изложить эту страницу
Продвинутая обработка ошибок в асинхронной верификации.