サーバーレス環境向けレート制限ライブラリ「@upstash/ratelimit」を発表
システムの可用性を維持することは、あらゆるプロダクトにとって最も重要なタスクの一つです。しかし残念ながら、大量のリクエストでリソースを圧迫する悪用者への対策が必要になったり、利用量を制限して課金したいといったニーズが生じたりします。こうした問題に対する標準的な解決策がレート制限(Rate Limiting)であり、本来は追加の開発なしに使えるべきものです。せっかくシステムを構築したのに、サーバーレス関数のようなステートレスな環境で動作するレート制限機構の設計にさらに時間を割きたくはないはずです。
@upstash/ratelimit のご紹介
本日、@upstash/ratelimit をリリースしました。これは Vercel、Cloudflare、Deno、Fastly、Netlify といったサーバーレス環境向けのレート制限ソリューションです。Upstash Serverless Redis を基盤としており、1つまたは複数のデータベースを組み合わせることで、世界中のユーザーに低レイテンシの体験を提供できます。
はじめに
@upstash/ratelimit は、現在3つの標準化されたアルゴリズムを実装しています。詳細についてはプロジェクトの README を参照してください。
提供されるメソッドは以下の2つです。
limit(identifier: string): Promise<RatelimitResponse>
limit は true または false と、残りリクエスト数などのメタデータを返します。設定した上限を超えるリクエストをすべて拒否したい場合に利用できます。
blockUntilReady(identifier: string, timeout: number): Promise<RatelimitResponse>
リクエストを即座に拒否するのではなく、処理可能になるまで待機させたい場合に使用します。ただし、プラットフォームによっては関数の実行時間に対して課金される点に注意してください。
単一リージョンのデータベースを使う場合
1つのデータベースでレート制限を行うのは非常にシンプルです。Upstash でデータベースを作成し、すぐに使い始めることができます。
import { Ratelimit } from "@upstash/ratelimit";
import { Redis } from "@upstash/redis";
// 10秒間に10リクエストまで許可するレートリミッターを作成
const ratelimit = new Ratelimit({
redis: Redis.fromEnv(),
limiter: Ratelimit.slidingWindow(10, "10 s"),
});
// 定数文字列を使えば全リクエストを単一のレート制限でまとめて管理できる
// または userID・apiKey・IPアドレスを使えば個別の制限も可能
const identifier = "api";
const { success } = await ratelimit.limit(identifier);
if (!success) {
return "Unable to process at this time";
}
doExpensiveCalculation();
return "Here you go!";
グローバルレプリケーションによるレート制限
例えば、米国とヨーロッパに顧客がいるとしましょう。この場合、Upstash 上にリージョンごとの Redis データベースを2つ作成すれば、ユーザーはそれぞれ自分に最も近いデータベースの低レイテンシの恩恵を受けられます。
import { GlobalRatelimit } from "@upstash/ratelimit"; // deno の場合は上記を参照
import { Redis } from "@upstash/redis";
// 10秒間に10リクエストまで許可するレートリミッターを作成
const ratelimit = new GlobalRatelimit({
redis: [
new Redis({
/* ヨーロッパ */
}),
new Redis({
/* 北米 */
}),
],
limiter: Ratelimit.slidingWindow(10, "10 s"),
});
まとめ
@upstash/ratelimit を使えば、サーバーレス環境でも面倒な設計なしに堅牢なレート制限を実装できます。単一リージョンのシンプルな構成から、複数リージョンを活用したグローバル構成まで、アプリケーションの規模に合わせて柔軟に選択できるのが魅力です。ぜひあなたのプロジェクトでも試してみてください。
ご質問がある場合は、GitHub または以下のチャンネルからお気軽にお問い合わせください。
-
サーバーレス・エッジ時代のグローバルデータベース──Upstash Global Database徹底解説
近年、アプリケーションのデプロイにおいて、サーバーレスアーキテクチャとエッジコンピューティングが急速に普及しています。しかし、サーバーレス関数やエッジ関数の中でアプリケーションの状態やデータを保存するのは、まったく別の話です。データベースへの接続管理、複数拠点からの高速なデータアクセスの実現など、乗り越えるべき課題が数多くあります。サーバーレスアクセスに対応したデータベースサービスは限られており、さらにエッジ関数にも適したものとなると、ごくわずかしか存在しません(詳細な分析はこちらの記事をご覧ください)。Upstashでは、創業当初から低レイテンシかつリクエスト単位の従量課金モデルを採用したサ
-
UpstashのPipeline APIでサーバーレスRedisを高速化:複数コマンドを1リクエストで実行
Upstashは、ネイティブなRedis APIに加えてREST APIもサポートしており、開発者はサーバーレス関数やエッジ関数から接続の問題を気にせずRedisへアクセスできます。しかし、同じ関数内で複数のRedisコマンドを実行する場合、その回数だけデータベースへの呼び出しが発生してしまうという課題がありました。 そこで、コミュニティメンバーの一人である@MasterGates氏が、Discordチャンネルで素晴らしい提案をしてくれました。それが「Pipeline API」です。 Pipeline APIとは Pipeline APIは、RedisのPIPELINEコマンドをREST A