跳到主要内容
Didit 融资 750 万美元,打造身份与欺诈基础设施
Didit
返回博客
博客 · 2026年3月7日

使用 Python Asyncio 提升 Didit API 吞吐量 (ZH)

了解 Python 的 Asyncio 如何显著提高您的应用程序在使用 Didit 身份验证 API 时的吞吐量和效率。.

作者:Didit更新于
boost-didit-api-throughput-with-python-asyncio.png

优化 API 消费: Python Asyncio 支持非阻塞 I/O 操作,显著提高了向 Didit 等服务进行身份验证时进行大量 API 调用的应用程序的效率。

掌握速率限制: 使用 Asyncio 实现复杂的速率限制策略,以遵守 Didit 的 API 限制,防止 429 错误,并确保在高吞吐量场景下服务的持续可用性。

构建可扩展解决方案: 利用 Asyncio 的并发模型设计健壮且可扩展的系统,能够每秒处理数千个身份验证请求,而无需承担高昂的基础设施成本。

Didit 的 API 优先优势: Didit 以开发者为中心的方法,通过清晰的 API 和即时沙盒,非常适合与异步框架集成,从而实现从身份验证到活体检测的无缝、高性能身份验证工作流。

提速需求:为什么 API 调用需要 Asyncio?

在当今快节奏的数字世界中,应用程序通常需要执行大量的外部 API 调用来完成其功能。当这些调用是阻塞的,即应用程序在处理下一个请求之前等待每个响应时,性能瓶颈很快就会出现。对于身份验证服务来说尤其如此,一个单一的用户入职流程可能涉及多个 API 交互:身份验证、被动和主动活体检测、1:1 人脸比对以及 AML 筛选。对于用户量大的企业来说,这些顺序操作可能导致显著的延迟和糟糕的用户体验。

Python 的 asyncio 库提供了一个强大的框架,用于使用 async/await 语法编写并发代码。与传统的多线程(可能为 CPU 密集型任务引入诸如全局解释器锁 (GIL) 等复杂性)不同,asyncio 专为 I/O 密集型操作而设计。API 调用本质上是 I/O 密集型的(等待网络响应),这使得 asyncio 成为提高应用程序高效消费外部 API 能力的理想选择。通过允许程序在等待 API 响应时执行其他任务,asyncio 可以显著提高吞吐量,而无需将应用程序架构完全重写为分布式系统。

了解 Didit 的 API 概况和速率限制

Didit 作为一个人脸识别身份平台,提供了一套全面的 API 用于身份验证,包括身份验证(OCR、MRZ、条形码)、被动和主动活体检测、1:1 人脸比对、AML 筛选和监控等。我们的 API 旨在实现高性能和可靠性,但与所有强大的 API 一样,它采用速率限制来确保所有客户端的稳定性和公平使用。了解这些限制对于任何高吞吐量消费者都至关重要。

Didit 强制执行全局和特定端点的速率限制。例如,对于 GET 和写入/删除端点,全局限制通常是每个应用程序每分钟 300 个请求。对于高影响操作,例如 POST /v2/session/(用于创建验证工作流)的 600 RPM 和 GET /v2/session/<id>/decision/(用于检索会话决策)的 100 RPM,会应用更严格的限制。当超出这些限制时,API 会返回 429 Too Many Requests 状态码,以及有用的头部信息,如 X-RateLimit-LimitX-RateLimit-RemainingRetry-After(纪元秒),以指导您的退避策略。

实现 asyncio 可以让您更有效地管理这些速率限制。异步应用程序可以智能地排队请求、实现指数退避并重试失败的调用,而不会阻塞整个应用程序的流程,而不是单个阻塞线程达到限制。这会使 API 消费更顺畅,中断更少,确保您的身份验证过程即使在高峰负载期间也能不间断地进行。

使用 Asyncio 实现 Didit API 并发调用

asyncio 与 Didit 的 API 集成涉及使用异步 HTTP 客户端,例如 aiohttp。以下是您如何构建异步 API 调用的概念性大纲:


import asyncio
import aiohttp
import time

API_KEY = "YOUR_DIDIT_API_KEY"
BASE_URL = "https://verification.didit.me/v3/"

async def call_didit_api(session, endpoint, payload=None, method='POST'):
    headers = {
        'accept': 'application/json',
        'x-api-key': API_KEY
    }
    if method == 'POST':
        headers['content-type'] = 'application/json'

    url = f"{BASE_URL}{endpoint}"
    
    async with session.request(method, url, json=payload, headers=headers) as response:
        if response.status == 429:
            retry_after = int(response.headers.get('Retry-After', '5'))
            print(f"Rate limit hit. Retrying after {retry_after} seconds...")
            await asyncio.sleep(retry_after) # Implement simple backoff
            return await call_didit_api(session, endpoint, payload, method) # Retry
        response.raise_for_status()
        return await response.json()

async def create_verification_session(session, workflow_id, user_id):
    endpoint = "session/"
    payload = {
        "workflow_id": workflow_id,
        "vendor_data": user_id,
        "callback": "https://your-app.com/didit-callback"
    }
    return await call_didit_api(session, endpoint, payload, method='POST')

async def get_session_decision(session, session_id):
    endpoint = f"session/{session_id}/decision/"
    return await call_didit_api(session, endpoint, method='GET')

async def main():
    async with aiohttp.ClientSession() as session:
        tasks = []
        # Example: Create 10 verification sessions concurrently
        for i in range(10):
            tasks.append(create_verification_session(session, "YOUR_WORKFLOW_ID", f"user_{i}"))
        
        results = await asyncio.gather(*tasks)
        for res in results:
            print(f"Created session: {res.get('session_id')}")

        # Example: Retrieve decisions for some sessions concurrently
        decision_tasks = []
        for res in results[:5]: # Take first 5 for decision retrieval
            session_id = res.get('session_id')
            if session_id:
                decision_tasks.append(get_session_decision(session, session_id))
        
        decision_results = await asyncio.gather(*decision_tasks)
        for decision in decision_results:
            print(f"Session decision: {decision}")

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

此示例演示了如何并发创建多个验证会话并检索其决策。call_didit_api 函数包含一个针对 429 Too Many Requests 的基本重试机制,使用 Retry-After 头部来实现指数退避。对于生产系统,建议采用更复杂的退避和断路器模式,但这说明了核心原理。

通过使用 asyncio.gather,您可以同时发起多个 API 请求,允许您的应用程序处理其他任务或并发等待响应,从而与顺序阻塞调用相比显著提高性能。

高并发身份验证策略

使用 Asyncio 实现 Didit API 的高吞吐量不仅仅是并发请求。请考虑以下策略:

  • 智能批量处理: 尽管 Didit 的核心验证通常由用户发起,但对于 AML 监控或某些数据查找等操作,您可以设计允许批量处理的工作流(如果适用),从而减少 API 调用的总数。
  • 自适应速率限制: 除了简单的指数退避之外,实现一个自适应速率限制器,该限制器监控 X-RateLimit-Remaining 并动态调整 asyncio 任务的并发级别。如果剩余调用量低,则减速;如果高,则加速。
  • Webhook 驱动更新: 对于会话结果(例如,在身份验证或活体检测之后),请依赖 Didit 的 Webhook,而不是过多的轮询。这减少了对 /v2/session/<id>/decision/ 的 GET 请求数量,该请求具有更严格的 100 RPM 速率限制。Didit 的模块化架构意味着您可以为各种状态更改设置 Webhook 通知,将实时更新推送到您的系统,而无需持续查询。
  • 错误处理和可观察性: 为网络问题、API 错误(除了 429 之外)和超时实现强大的错误处理。当触发重试或持续达到速率限制时,记录或发出警报。这为优化您的 API 消费策略提供了关键的见解。
  • 资源管理: 仔细管理您的 aiohttp.ClientSession 实例。为每个请求创建新会话是低效的,因为存在连接开销。重用单个会话进行多个请求通常是最佳实践。

Didit 如何提供帮助

Didit 从一开始就是为开发者和高性能应用程序而构建的,这使其成为 Python Asyncio 实现的理想合作伙伴。我们的模块化架构允许您即插即用身份检查,如身份验证、被动和主动活体检测、1:1 人脸比对以及 AML 筛选,每个都可以通过清晰、文档完善的 API 访问。这种模块化意味着您可以根据您的特定需求编排复杂的验证工作流,然后使用异步技术优化其消费。

我们相信让身份验证触手可及,这就是我们提供 免费核心 KYC 的原因。这使您可以在没有前期成本的情况下进行实验并构建您的异步集成。我们的人脸识别方法确保我们的验证服务快速准确,完美补充 Asyncio 的速度优势。Didit 没有设置费,并采用按成功检查付费的模式,为希望实施高吞吐量身份验证的企业提供经济高效且可扩展的解决方案。我们的即时沙盒环境和全面的 API 文档进一步赋能开发者快速集成和优化 Didit 服务的使用,无论您是构建新系统还是增强现有系统。

准备好开始了吗?

准备好亲身体验 Didit 的强大功能了吗?立即获取免费演示

使用 Didit 的免费套餐 开始免费验证身份。

身份与欺诈基础设施。

一个 API 即可实现 KYC、KYB、交易监控和钱包筛选。5 分钟即可集成。

让 AI 总结此页面
使用 Python Asyncio 提升 Didit API 吞吐量.