Advanced

Claude Code के साथ Implement Rate Limiting कैसे करें

Claude Code का उपयोग करके implement rate limiting सीखें। Practical code examples और step-by-step guidance शामिल है।

なぜレート制限がज़रूरीか

APIを公開する際、レート制限はserviceの安定運用に不可欠 है।DDoS攻撃の防御、リソースの公平な配分、コストmanagement आदि、多くの目的で使われ है।Claude Code का उपयोग करके、要件に合ったレート制限のimplementationをकम समय मेंgenerateでき है।

tokenバケットアルゴリズム

もっとも一般的なレート制限アルゴリズムをTypeScriptでimplement करते हैं。

> tokenバケットアルゴリズムでレート制限をimplement करो。
> Redisを使ったスケーラブルなimplementationにして。
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

    -- tokenの補充
    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 के रूप मेंuse करना

उपरोक्तのロジックを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数がऊपर限に達し हुआ।しばらく待って से再試行して करें।",
        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 }));

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

Redisなしの簡易implementation

小規模なProjectではインメモリでのimplementationも有効 है।

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

レート制限 के साथ combineてsearchfeaturesをimplement करना方法はsearchfeaturesのimplementationदेखें。APIの設計全般के बारे मेंはClaude Codeのintroduction guideभी reference के लिएなり है।

Summary

Claude Code का उपयोग करके、tokenバケット सेRedisintegration तक、Projectに合ったレート制限を素早くimplementationでき है।security要件を自然言語で伝えれば、appropriateなアルゴリズムとsettings値を提案してくれ है।

विस्तार से जानने के लिएClaude Codeofficial documentationをदेखें。

#Claude Code #rate limiting #API #security #Node.js
मुफ़्त

मुफ़्त PDF: 5 मिनट में Claude Code चीटशीट

बस अपना ईमेल दर्ज करें और हम तुरंत A4 एक-पृष्ठ चीटशीट PDF भेज देंगे।

हम आपकी व्यक्तिगत जानकारी की सुरक्षा करते हैं और स्पैम नहीं भेजते।

Masa

लेखक के बारे में

Masa

Claude Code का गहराई से उपयोग करने वाले इंजीनियर। claudecode-lab.com चलाते हैं, जो 10 भाषाओं में 2,000 से अधिक पेजों वाला टेक मीडिया है।