SuperAPI AI 工具集

idempotency-handling

编程与开发

查看项目

更新于 10-15 12:08

技能介绍

Idempotency Handling

用途

实现幂等(idempotency),确保操作无论执行多少次都产生相同结果。用于避免重试、回调重复触发或消息重复投递带来重复副作用。

何时使用

  • 支付处理
  • 带重试的 API 端点
  • Webhook 与回调
  • 消息队列消费者
  • 分布式事务
  • 银行转账
  • 订单创建
  • 邮件发送
  • 资源创建

快速开始

文档提供一个基于 Express、ioredis 与 Node crypto 的最小示例:定义了 IdempotentRequest 接口(key、status:processing/completed/failed、response、error、createdAt、completedAt),以及 IdempotencyService 类,使用 Redis 存储,TTL 为 86400 秒(24 小时),通过 getRequest(key) 读取 idempotency:${key} 的缓存记录并解析。完整实现见参考指南。

import express from "express";
import Redis from "ioredis";
import crypto from "crypto";

interface IdempotentRequest {
  key: string;
  status: "processing" | "completed" | "failed";
  response?: any;
  error?: string;
  createdAt: number;
  completedAt?: number;
}

class IdempotencyService {
  private redis: Redis;
  private ttl = 86400; // 24 hours

  constructor(redisUrl: string) {
    this.redis = new Redis(redisUrl);
  }

  async getRequest(key: string): Promise<IdempotentRequest | null> {
    const data = await this.redis.get(`idempotency:${key}`);
    return data ? JSON.parse(data) : null;
  }
// ... (see reference guides for full implementation)

参考指南

references/ 目录中的详细实现:

  • Express Idempotency Middleware
  • Database-Based Idempotency
  • Stripe-Style Idempotency
  • Message Queue Idempotency

最佳实践

应做(DO):

  • 对变更类操作要求幂等键
  • 请求与响应一起存储
  • 为幂等记录设置合适的 TTL
  • 校验请求体与已存请求是否匹配
  • 优雅处理并发请求
  • 对重复请求返回相同响应
  • 清理旧的幂等记录
  • 使用数据库约束保证原子性

不应做(DON'T):

  • 对 GET 请求应用幂等
  • 永久存储幂等数据
  • 跳过请求体校验
  • 使用非唯一的幂等键
  • 并发处理同一请求
  • 为重复请求改变响应

限制

资料仅给出上述接口、存储方式、TTL 与参考指南目录,未提供具体安装命令、完整代码实现细节、支持平台或版本要求;相关内容暂未提供。