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

サーバーレスレート制限

システムの可用性を維持することは、どの製品にとっても最も重要なタスクの1つです。残念ながら、人々はあなたのリソースを圧倒することによってそれを悪用するかもしれません、あるいはあなたはそれの使用と料金を制限したいと思うかもしれません。レート制限は、これらの問題の多くに対する標準的な解決策であり、箱から出してすぐに機能するはずです。結局のところ、あなたはすでにシステムを構築しており、サーバーレス機能などのステートレス環境でうまく機能するレート制限システムの設計にこれ以上時間を費やしたくありません。

@ upstash/ratelimitを発表

GitHub、npm、またはDenoで利用可能

本日、@upstash/ratelimitをリリースします 、Vercel、Cloudflare、Deno、Fastly、Netlifyなどのサーバーレス環境でのレート制限のソリューション。 UpstashサーバーレスRedisの上に構築され、1つ以上のデータベースを使用してレート制限ソリューションを提供し、世界中のユーザーに低遅延エクスペリエンスを提供します!

はじめに

@upstash/ratelimit これまでに3つの異なる標準化されたアルゴリズムを実装しており、プロジェクトのREADMEでそれらの詳細を読むことができます。

2つの方法を提供します:

  • limit(identifier: string): Promise<RatelimitResponse>

limit trueを返します またはfalse 残りのリクエストに関するメタデータもあり、設定した制限を超えてすべてのリクエストを拒否する場合に使用できます。

  • blockUntilReady(identifier: string, timeout: number): Promise<RatelimitResponse>

リクエストをすぐに拒否したくないが、処理できるようになるまで待つ場合。一部のプラットフォームでは、関数の実行時間に対して課金されることに注意してください。

単一の地域データベース

単一のデータベースでのレート制限は簡単です。 Upstashでデータベースを作成し、使用を開始します:

import { Ratelimit } from "@upstash/ratelimit";
import { Redis } from "@upstash/redis";

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

// 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 { success } = await ratelimit.limit(identifier);

if (!success) {
  return "Unable to process at this time";
}
doExpensiveCalculation();
return "Here you go!";
グローバルに複製されたレート制限

米国とヨーロッパに顧客がいると仮定しましょう。この場合、Upstash上に2つのリージョナルredisデータベースを作成でき、ユーザーは最も近いデータベースのレイテンシーを享受できます。

import { GlobalRatelimit } from "@upstash/ratelimit"; // for deno: see above
import { Redis } from "@upstash/redis";

// Create a new ratelimiter, that allows 10 requests per 10 seconds
const ratelimit = new GlobalRatelimit({
  redis: [
    new Redis({
      /* europe */
    }),
    new Redis({
      /* north america */
    }),
  ],
  limiter: Ratelimit.slidingWindow(10, "10 s"),
});
最後の言葉

ご不明な点がございましたら、GitHubまたは以下のチャネルでお問い合わせください。

DiscordandTwitterでフォローしてください。


  1. サーバーレスとエッジのグローバルデータベース

    近年、サーバーレスアーキテクチャとエッジコンピューティングは、アプリケーションの展開で非常に人気が高まっています。ただし、アプリケーションの状態とデータをサーバーレス関数やエッジ関数内に保存することは別の話です。データベースへの接続の管理、複数の場所からの高速アクセスにデータを利用できるようにするなど、多くの問題があります。サーバーレスアクセスをサポートするデータベースサービスはごくわずかであり、エッジ機能にも適しているものはごくわずかです。(ここで詳細な分析を読むことができます。 ) Upstashでは、初日から、低レイテンシでリクエストごとの価格設定モデルを備えたサーバーレスRedis互

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

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