Advanced

Cara Implement Rate Limiting dengan Claude Code

Pelajari cara implement rate limiting menggunakan Claude Code. Dilengkapi contoh kode praktis dan panduan langkah demi langkah.

なぜレート制限がdiperlukanか

API publikasi 際、レート制限 service 安定operasi 不可欠.DDoS攻撃 防御、リソース 公平な配分、コストmanajemen dll.、多く 目的 使われ.Claude Code 使えば、要件 合ったレート制限 implementasi waktu singkat generate bisa dilakukan.

tokenバケットalgoritma

juga っ dan juga 一般的なレート制限algoritma TypeScript implementasi.

> tokenバケットalgoritma dengan レート制限 implementasikan.
> Redis 使ったスケーラブルなimplementasi.
import Redis from "ioredis";

const redis = new Redis();

interface RateLimitResult {
  allowed: boolean;
  remaining: number;
  resetAt: number;
}

export async function checkRateLimit(
  key: string,
  maxTokens: number,
  refillRate: number, // token/秒
  windowSeconds: number
): Promise<RateLimitResult> {
  const now = Date.now();
  const luaScript = `
    local key = KEYS[1]
    local max_tokens = tonumber(ARGV[1])
    local refill_rate = tonumber(ARGV[2])
    local now = tonumber(ARGV[3])
    local window = tonumber(ARGV[4])

    local data = redis.call('HMGET', key, 'tokens', 'last_refill')
    local tokens = tonumber(data[1]) or max_tokens
    local last_refill = tonumber(data[2]) or now

    -- トークンの補充
    local elapsed = (now - last_refill) / 1000
    tokens = math.min(max_tokens, tokens + elapsed * refill_rate)

    local allowed = tokens >= 1
    if allowed then
      tokens = tokens - 1
    end

    redis.call('HMSET', key, 'tokens', tokens, 'last_refill', now)
    redis.call('EXPIRE', key, window)

    return {allowed and 1 or 0, math.floor(tokens), now + math.floor((1 - tokens) / refill_rate * 1000)}
  `;

  const result = await redis.eval(
    luaScript, 1, key,
    maxTokens, refillRate, now, windowSeconds
  ) as number[];

  return {
    allowed: result[0] === 1,
    remaining: result[1],
    resetAt: result[2],
  };
}

Express middlewareとして使う

上記 ロジック Expressmiddleware 組み込み.

import { Request, Response, NextFunction } from "express";
import { checkRateLimit } from "./rate-limiter";

interface RateLimitOptions {
  maxRequests: number;
  windowSeconds: number;
  keyGenerator?: (req: Request) => string;
}

export function rateLimit(options: RateLimitOptions) {
  const {
    maxRequests,
    windowSeconds,
    keyGenerator = (req) => req.ip || "unknown",
  } = options;

  return async (req: Request, res: Response, next: NextFunction) => {
    const key = `rate_limit:${keyGenerator(req)}`;
    const result = await checkRateLimit(
      key, maxRequests, maxRequests / windowSeconds, windowSeconds
    );

    res.setHeader("X-RateLimit-Limit", maxRequests);
    res.setHeader("X-RateLimit-Remaining", result.remaining);
    res.setHeader("X-RateLimit-Reset", Math.ceil(result.resetAt / 1000));

    if (!result.allowed) {
      return res.status(429).json({
        error: "Too Many Requests",
        message: "request数 上限 達しま。しばらく待ってからretry ください。",
        retryAfter: Math.ceil((result.resetAt - Date.now()) / 1000),
      });
    }

    next();
  };
}

// Usage example
import express from "express";
const app = express();

// API全体 適用:1分あたり60request
app.use("/api", rateLimit({ maxRequests: 60, windowSeconds: 60 }));

// 認証endpoint より厳しく:1分あたり5request
app.use("/api/auth", rateLimit({
  maxRequests: 5,
  windowSeconds: 60,
  keyGenerator: (req) => `auth:${req.ip}`,
}));

簡易implementasi Redisなし

小規模なproyek インメモリ implementasi juga efektif.

const requestCounts = new Map<string, { count: number; resetAt: number }>();

export function simpleRateLimit(maxRequests: number, windowMs: number) {
  // Periodic cleanup
  setInterval(() => {
    const now = Date.now();
    for (const [key, data] of requestCounts) {
      if (data.resetAt < now) requestCounts.delete(key);
    }
  }, windowMs);

  return (req: Request, res: Response, next: NextFunction) => {
    const key = req.ip || "unknown";
    const now = Date.now();
    const record = requestCounts.get(key);

    if (!record || record.resetAt < now) {
      requestCounts.set(key, { count: 1, resetAt: now + windowMs });
      return next();
    }

    if (record.count >= maxRequests) {
      return res.status(429).json({ error: "Too Many Requests" });
    }

    record.count++;
    next();
  };
}

レート制限 dan 組み合わせてpencarian機能 implementasi metode pencarian機能 implementasi silakan lihat.API 設計全般 mengenai Claude Code 入門panduan juga bisa dijadikan referensi.

Summary

Dengan Claude Code, tokenバケット dari Redisintegrasiま 、proyek 合ったレート制限 素早くimplementasi bisa dilakukan.セキュリティ要件 自然言語 伝えれば、tepatなalgoritma dan pengaturan値 提案 くれ.

Untuk detail lebih lanjut, lihat Dokumentasi Resmi Claude Code.

#Claude Code #rate limiting #API #security #Node.js