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
。
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のクレデンシャルを環境変数またはシークレットストアから保持して読み取ります。
-
サーバーレスRedisでのレンダリングの使用
Renderは、特に即時展開と自動スケーリングを提供する強力なインフラストラクチャプラットフォームです。今日は、Upstashを使用して単純なNext.jsアプリケーションを作成し、それをRenderにデプロイします。 注:このチュートリアルは、UpstashでRedisインスタンスをすでに設定していることを前提としています。 まだ行っていない場合は、Upstashコンソールを使用して行うことができます。 はじめに まず、新しいNext.jsアプリとcdを作成しましょう それに。 npx create-next-app upstash-render && cd upstas
-
サーバーレスRedisのパイプラインRESTAPI
Upstashは、ネイティブのRedisAPIに加えてRESTAPIをサポートしています。 REST APIは、開発者がサーバーレスおよびエッジ関数からの接続の問題なしにRedisにアクセスするのに役立ちます。ただし、同じ関数で複数のRedisコマンドを実行する場合、これはデータベースを複数回呼び出すことを意味します。コミュニティメンバーの1人(@MasterGates)が、Discordチャンネルで素晴らしい提案をしてくれました。パイプラインAPI: パイプラインAPI Pipeline APIは、RedisPIPELINEコマンドをRESTAPIに適合させたものです。 1つのhtt