Upstash Redis2026-06-20
【パフォーマンス】Upstash Redisを使用したNext.js API Gatewayにおけるマルチテナントレートリミット設計
B2B API提供における「リソース競合」の防止
SaaSや社内APIシステム(API Gateway)を公開・運用するにあたり、特定の顧客や連携プログラムからの想定以上の大量アクセス(スパイクアクセス、DoS攻撃)によるリソースの枯渇を防ぐことは、安定運用のための絶対条件です。
特にB2Bシステムでは、以下のような課題が発生します。
- 特定テナントによるAPIの占有: ある1社のデータ同期スクリプトがバグで無限ループに陥り、APIを秒間数千回叩き続けた結果、他のすべてのクライアントの接続が極めて重くなる。
- ノイジーネイバー(Noisy Neighbor)問題: マルチテナント環境において、他のテナントのアクセス負荷が自社システム全体に悪影響を及ぼす。
- 判定のオーバーヘッド: レートリミット(リクエスト頻度の制限)のチェック処理自体が重いと、本来のAPIの応答速度(レスポンスタイム)が大幅に低下する。
これらを解消するため、**Next.jsのEdge Middleware(地理的に顧客に近いグローバルなサーバーで処理を実行)**と、サーバーレスかつミリ秒未満でアクセス判定が行える Upstash Redis を利用した、高速で信頼性の高いレートリミットゲートウェイを実装します。
2. 課題解決のビフォー・アフター
| 項目 | 従来のDB(SQL)によるチェック(Before) | Next.js Edge Middleware + Upstash Redis(After) |
|---|---|---|
| 判定のレイテンシ | 50ms〜200ms(DBへのクエリ実行) | 1ms〜10ms(インメモリRedisでのアトミック操作) |
| APIパフォーマンス | 同時アクセス増に伴いDB接続プールが枯渇 | サーバーレスRedisのためプール制限がなくスケール |
| Edgeランタイム対応 | 通常のDBドライバーはEdge環境で動作しない | HTTP/RESTベースのRedisクライアントでEdgeで動作可能 |
| 制限の設定 | テナントごとに一律の設定しかできない | Redis内のハッシュテーブルで個別に制限値を即座に変更可能 |
3. 具体的な実装例:スライディングウィンドウ型レートリミット
Upstash Redis公式のレートリミットライブラリ @upstash/ratelimit を用いた、Next.js Edge Middlewareでのテナントごとの制限チェック実装例です。
Edge Middlewareコード (middleware.ts)
import { NextRequest, NextResponse } from "next/server";
import { Ratelimit } from "@upstash/ratelimit";
import { Redis } from "@upstash/redis";
// Upstash Redisインスタンスの作成
const redis = new Redis({
url: process.env.UPSTASH_REDIS_REST_URL!,
token: process.env.UPSTASH_REDIS_REST_TOKEN!,
});
// テナント用のレートリミッター定義:
// 各APIキーごとに、10秒のウィンドウ内で最大100リクエストを許可
const ratelimit = new Ratelimit({
redis: redis,
limiter: Ratelimit.slidingWindow(100, "10 s"),
analytics: true, // 管理画面でのアクセス分析用
});
export async function middleware(request: NextRequest) {
// リクエストヘッダーからAPIキー(テナント識別子)を取得
const apiKey = request.headers.get("x-api-key") || "anonymous";
// テナントキーを元に制限判定
const { success, limit, reset, remaining } = await ratelimit.limit(
`api_limit:${apiKey}`
);
if (!success) {
return new NextResponse(
JSON.stringify({
error: "Too Many Requests",
message: "APIの実行上限に達しました。しばらく時間をおいて再試行してください。",
}),
{
status: 429,
headers: {
"Content-Type": "application/json",
"X-RateLimit-Limit": limit.toString(),
"X-RateLimit-Remaining": remaining.toString(),
"X-RateLimit-Reset": reset.toString(),
},
}
);
}
// 正常な場合はリクエストを通す
const response = NextResponse.next();
response.headers.set("X-RateLimit-Remaining", remaining.toString());
return response;
}
// /api/ 配下のみにミドルウェアを適用
export const config = {
matcher: "/api/:path*",
};
4. HadayaLabのAPIパフォーマンス設計
HadayaLabでは、大量のデータ連携や外部システムとのAPI通信を行う企業様向けに、以下のようなトラフィック設計とインフラ統合を行っています。
- APIレートリミット設計: APIの悪用を防ぎながら、正規のB2Bユーザーがストレスなく接続できる最適なアルゴリズムの選定。
- Upstash Redisによる分散キャッシュ: 頻繁に参照されるマスタデータや商品情報をエッジにキャッシュし、バックエンドDBの負荷を削減。
- Next.jsのEdge Rendering: ページの表示速度とデータセキュリティを両立させた次世代フロントエンドアーキテクチャ。
APIのレスポンス向上や、同時アクセス増加時のシステムダウン対策を検討されているIT責任者の方は、ぜひHadayaLabへお問い合わせください。