Redis
 Computer >> コンピューター >  >> プログラミング >> Redis

UpstashRedisを使用したNext.jsAPIルートのレート制限

この記事では、Upstashレート制限SDKを使用してNext.jsAPIルートをレート制限する方法を示します

データベースのセットアップ

UpstashConsoleまたはUpstashCLIを使用してRedisデータベースを作成します。 UPSTASH_REDIS_REST_URLをコピーします およびUPSTASH_REDIS_REST_TOKEN 次のステップのために。

プロジェクトの設定

Next.jsアプリケーションを作成し、Vercelにデプロイします。

npx create-next-app@latest

@ upstash / ratelimitをインストールします:

npm install @upstash/ratelimit @upstash/redis
コード

pages/api/hello.jsを更新します 以下のように、UPSTASH_REDIS_REST_URLを置き換えます およびUPSTASH_REDIS_REST_TOKEN

pages / api / hello.js
import {Ratelimit} from "@upstash/ratelimit";
import {Redis} from "@upstash/redis";


const redis = new Redis({
  url: 'UPSTASH_REDIS_REST_URL',
  token: 'UPSTASH_REDIS_REST_TOKEN',
})

// Create a new ratelimiter, that allows 5 requests per 5 seconds
const ratelimit = new Ratelimit({
  redis: redis,
  limiter: Ratelimit.fixedWindow(5, "5 s"),
});

export default async function handler(req, res) {
// Use a constant string to limit all requests with a single ratelimit
// Or use a userID, apiKey or ip address for individual limits.
  const identifier = "api";
  const result = await ratelimit.limit(identifier);
  res.setHeader('X-RateLimit-Limit', result.limit)
  res.setHeader('X-RateLimit-Remaining', result.remaining)

  if (!result.success) {
    res.status(200).json({message: 'The request has been rate limited.', rateLimitState: result})
    return
  }

  res.status(200).json({name: 'John Doe', rateLimitState: result})
}

ここでは、5秒あたり5つのリクエストを許可しています。

実行

npm run devでアプリを実行します 。ブラウザを5回以上更新すると、レート制限が機能していることがわかります。

{"message":"The request has been rate limited.","rateLimitState":{"success":false,"limit":5,"remaining":-1,"reset":1654546770000,"pending":{}}}
可能な拡張機能
  • ユーザーのIDまたはIPアドレスを識別子として使用して、ユーザーごとの使用を制限します。
   const identifier = getClientIp(req);
   const result = await ratelimit.limit(identifier);
  • スライディングウィンドウアルゴリズムを使用して、よりスムーズな(ただしより高価な)レート制限エクスペリエンスを実現します。
 const ratelimit = new Ratelimit({
  redis: redis,
  limiter: Ratelimit.slidingWindow(10, "10 s"),
});
  • トークンバケットアルゴリズムを使用して、ある程度のスパイクを許容します。
 const ratelimit = new Ratelimit({
  redis: redis,
  limiter: Ratelimit.tokenBucket(5, "10 s", 10),
});
  • Next.jsアプリケーションが異なるリージョンにデプロイされている場合は、異なるリージョンで複数のRedisを使用してください。これにより、さまざまな場所の遅延を最小限に抑えることができます。

  • UpstashRedisのクレデンシャルを環境変数またはシークレットストアから保持して読み取ります。


  1. サーバーレスRedisでのレンダリングの使用

    Renderは、特に即時展開と自動スケーリングを提供する強力なインフラストラクチャプラットフォームです。今日は、Upstashを使用して単純なNext.jsアプリケーションを作成し、それをRenderにデプロイします。 注:このチュートリアルは、UpstashでRedisインスタンスをすでに設定していることを前提としています。 まだ行っていない場合は、Upstashコンソールを使用して行うことができます。 はじめに まず、新しいNext.jsアプリとcdを作成しましょう それに。 npx create-next-app upstash-render && cd upstas

  2. サーバーレスRedisのパイプラインRESTAPI

    Upstashは、ネイティブのRedisAPIに加えてRESTAPIをサポートしています。 REST APIは、開発者がサーバーレスおよびエッジ関数からの接続の問題なしにRedisにアクセスするのに役立ちます。ただし、同じ関数で複数のRedisコマンドを実行する場合、これはデータベースを複数回呼び出すことを意味します。コミュニティメンバーの1人(@MasterGates)が、Discordチャンネルで素晴らしい提案をしてくれました。パイプラインAPI: パイプラインAPI Pipeline APIは、RedisPIPELINEコマンドをRESTAPIに適合させたものです。 1つのhtt