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

サーバーレスアプリケーションのレート制限

サーバーレスの最も優れている点の1つは、トラフィックが急増した場合でも拡張できることです。しかし残念ながら、スケーリングは経済的にも技術的にも無料ではありません。そのため、開発者はアプリケーションのスケーラビリティを制御する必要があります。サーバーレスアプリケーションでレート制限メカニズムが必要になる主な理由は次のとおりです。

1-リソースを保護します: パブリックAPIを提供している場合、トラフィックの急増によりサービスの品質が低下し、すべてのユーザーのサービスが停止する可能性があります。このようなカスケード障害や自発的なDdosインシデントからシステムを保護する必要があります。アプリケーションのバグは、システムでそのような問題を引き起こす可能性があります。障害が発生した場合にエンドポイントを無期限に再試行する内部プロセスは、リソースを簡単に使い果たしてしまう可能性があります。

2-ユーザー割り当ての管理: サービスを公正に使用するために、ユーザーの割り当てを定義することをお勧めします。また、さまざまな料金階層でサービスを提供する場合は、割り当てが必要になる場合があります。

3-コストを管理する: 制御されていないシステムがどのように多額の請求を引き起こす可能性があるかについては、実際の例がたくさんあります。非常にスケーラブルな性質があるため、これはサーバーレスアプリケーションにとってかなりのリスクです。レート制限は、これらのコストを管理するのに役立ちます。

ソリューション

さまざまなレイヤーに複数の代替レート制限ソリューションがあります。簡単な賛否両論の分析とともに3つの主要なものをリストします。

1-同時実行レベルの機能:

クラウドプロバイダーは、サーバーレス関数の実行をスケーリングするために複数のコンテナーを作成します。同時コンテナ/インスタンスの最大数に制限を設定できます。これは同時実行を制限するのに役立ちますが、1秒間に関数が呼び出される回数を制御することはできません。

AWSLambdaとGoogleCloudFunctionsの同時実行を制限する方法は次のとおりです。

長所:

  • オーバーヘッドなし
  • 設定が簡単

短所:

  • 完全な解決策ではありません。同時実行のみを制御します。 1秒あたりの実行回数に制限はありません。

2-APIGatewayのレート制限

API Gatewayを介して機能にアクセスしている場合は、レート制限ポリシーをAPIGatewayに適用できます。 AWSとGCPの両方に、ソリューションの構成方法に関するガイドがあります。

長所:

  • オーバーヘッドなし
  • 設定が簡単

短所:

  • APIGatewayを使用している場合にのみ適用されます。
  • ユーザーごとまたはIPごとの割り当てなどのより高度なケースはサポートされていません。

3-Redisによるレート制限

これは最も完全で強力なソリューションです。多くのRedisベースのレート制限ライブラリが利用可能です。 Jeremy Dalyのブログ投稿で、彼は可能な解決策としてElasticacheを拒否し、*this adds a “non-serverless” component and another thing to manage *。ここで、Upstashは、サーバーレスモデルとリクエストごとの価格設定により、非常に優れた代替手段になります。

長所:

  • 強力で、ユーザーモデルに合わせてカスタマイズされたロジックを実装できます。
  • スケーラブルなソリューション。 Githubがレート制限にRedisをどのように使用しているかをご覧ください
  • 豊富なエコシステム、多くのオープンソースライブラリ:redis_rate、redis-cell、node-ratelimiter

短所:

  • Redisの使用のオーバーヘッド。

コード:Redisによるレート制限

レート制限ライブラリのおかげで、アプリケーションコードにレート制限を適用するのは非常に簡単です。以下のサンプルコードでは、1秒あたりのIPあたりのAWSLambda関数の実行を制限しています。

const RateLimiter = require("async-ratelimiter");
const Redis = require("ioredis");
const { getClientIp } = require("request-ip");

const rateLimiter = new RateLimiter({
  db: new Redis("YOUR_REDIS_URL"),
  max: 1,
  duration: 5_000,
});

module.exports.hello = async (event) => {
  const clientIp = getClientIp(event) || "NA";
  const limit = await rateLimiter.get({ id: clientIp });
  if (!limit.remaining) {
    return {
      statusCode: 429,
      body: JSON.stringify({
        message: "Sorry, you are rate limited. Wait for 5 seconds",
      }),
    };
  }

  return {
    statusCode: 200,
    body: JSON.stringify({
      message: "hello!",
    }),
  };
};

完全な例については、チュートリアルにアクセスしてください。

読書リスト

https://cloud.google.com/architecture/rate-limiting-strategies-techniques

https://www.jeremydaly.com/throttling-third-party-api-calls-with-aws-lambda/

https://medium.com/google-cloud/rate-limit-your-api-usage-with-cloud-endpoints-quotas-1270da55d2bf

https://github.blog/2021-04-05-how-we-scaled-github-api-sharded-replicated-rate-limiter-redis/

https://redis.io/commands/incr#pattern-rate-limiter

https://stripe.com/blog/rate-limiters


  1. Windows 10 コンピュータの RAM を解放する方法

    Windows 10 PC に、システムのメモリが不足しているという警告メッセージが表示されますか?または、メモリ使用量が多いためにシステムがハングまたはフリーズしますか?恐れる必要はありません。私たちはこれらの問題を解決するためにここにいます。そのため、このガイドでは、Windows 10 コンピューターで RAM を解放する 9 つの異なる方法について説明します。 歩くのが遅い、物を噛む音が大きい、旅行の遅れ、Wi-Fi やインターネット接続の悪さ、コンピュータの遅延などは、世界で最も厄介なものの 1 つです。結局のところ、空き容量が十分にある場合でも、パソコンの動作が遅くなることが

  2. Mac の既定のアプリケーションを変更する手順

    Mac の既定のアプリケーションは使いやすいです。ただし、デフォルトのアプリの中には、必要な機能が欠けているものがあります。または、実行したい操作がありますが、Mac の既定のプログラムでは利用できません。では、そのようなシナリオで何ができるのでしょうか? 私たちにできることは、Mac で使用したいものから Mac の既定のアプリケーションを変更することだけです。 今日、この記事では、Mac の既定のプログラムを、私たちが好んで使用するものから変更する方法について、順を追って説明します。 Mac の既定のカレンダーを変更する このプロセスにより、Mac のデフォルトのカレンダー アプリケ