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

Redis と Lua を使用してスケーラブルな分散レート リミッターを構築する – ステップバイステップ ガイド

Redis と Lua を使用してスケーラブルな分散レート リミッターを構築する – ステップバイステップ ガイド

この包括的なガイドでは、Redis および Lua スクリプトを使用して分散レート リミッタを構築し、高トラフィック環境でのユーザー リクエストを制御します。

レート制限は、悪用を防止し、トラフィックを管理し、リソースを保護するために、どのシステムでも重要です。 Redis と Lua を活用することで、バックエンド サービスを安全に保ちながら、大量のリクエストを処理できる効率的でスケーラブルなレート制限システムを構築できます。

また、ユーザーがトラフィックをシミュレートし、適用されているレート制限を観察し、ブロックされたリクエストのログを表示できるインタラクティブなデモも含まれます。

何を学ぶか

  • Redis を使用してレート制限システムを構築する方法。

  • Redis で Lua スクリプトを使用してアトミックな操作を実現する方法。

  • 効率的なリクエスト追跡のための Redis データ構造の理解。

  • 分散システムで高トラフィックを処理するためのテクニック。

  • Docker を使用して分散レート リミッターをシミュレートし、スケーリングします。

前提条件

開始する前に、以下がインストールされていることを確認してください。

  • Node.js (v14 以降)

  • レディス

  • Docker (分散環境のシミュレーション用)

  • Node.js、Redis、Lua スクリプトの基本的な理解。

目次

  • 何を学ぶか

  • 前提条件

  • プロジェクトの概要

  • ステップ 1:プロジェクトのセットアップ方法

  • ステップ 2:Redis をセットアップする方法

  • ステップ 3:Redis と Lua を使用してレート リミッターを実装する方法

  • ステップ 4:Node.js API サーバーを作成する方法

  • ステップ 5:レート リミッターをテストする方法

  • ステップ 6:レート制限メトリクスを視覚化する方法

  • ステップ 7:Docker を使用してデプロイする方法

  • 結論:学んだこと

プロジェクトの概要

このチュートリアルでは、次のことを行います。

<オル>
  • Redis と Lua を使用してレート リミッターを構築し、リクエスト クォータを強制します。

  • Lua スクリプトを使用してアトミックな操作を確保し、競合状態を回避します。

  • レート制限のためのトークン バケット アルゴリズムを実装します。

  • インタラクティブなデモを作成して、高トラフィックをシミュレートし、実際のレート制限を視覚化します。

  • システム アーキテクチャ

    次のコンポーネントを使用してシステムを構築します。

    <オル>
  • API サーバー :受信したユーザーリクエストを処理します。

  • レディス :リクエスト データを保存し、レート制限を適用します。

  • Lua スクリプト :レート制限のために Redis へのアトミックな更新を保証します。

  • ドッカー :複数のインスタンスを持つ分散環境をシミュレートします。

  • ステップ 1:プロジェクトの設定方法

    まずは Node.js プロジェクトを設定しましょう。

    mkdir distributed-rate-limiter
    cd distributed-rate-limiter
    npm init -y
    

    次に、必要な依存関係をインストールします。

    npm install express redis dotenv
    
    • 急行 :軽量の Web サーバー フレームワーク。

    • レディス :Redis との対話用。

    • ドテンフ :環境変数の管理用。

    .env を作成します。 次の内容のファイル:

    REDIS_HOST=localhost
    REDIS_PORT=6379
    PORT=3000
    RATE_LIMIT=5
    TIME_WINDOW=60
    

    これらの変数は、Redis ホスト、ポート、レート制限 (許可されるリクエストの数)、および時間枠 (秒単位) を定義します。

    ステップ 2:Redis をセットアップする方法

    コードに入る前に、Redis がシステムにインストールされ実行されていることを確認してください。 Redis がインストールされていない場合は、Docker を使用して簡単にセットアップできます。

    docker run -p 6379:6379 --name redis-rate-limiter -d redis
    

    ステップ 3:Redis と Lua を使用してレート リミッターを実装する方法

    レート制限を効率的に処理するために、トークン バケット アルゴリズムを使用します。このアルゴリズムでは:

    <オル>
  • 各ユーザーはトークンの「バケツ」を持っています。

  • 各リクエストはトークンを消費します。

  • トークンは、設定されたレートで定期的に補充されます。

  • 原子性を確保し、競合状態を回避するために、Redis で Lua スクリプトを使用します。 Redis の Lua スクリプトはアトミックに実行されます。つまり、実行中に他の操作によって中断されることはありません。

    レート制限用の Lua スクリプトを作成する方法

    rate_limiter.lua というファイルを作成します。 :

    local key = KEYS[1]
    local limit = tonumber(ARGV[1])
    local window = tonumber(ARGV[2])
    local current = redis.call("get", key)
    if current and tonumber(current) >= limit then
     return 0
    else
     if current then
     redis.call("incr", key)
     else
     redis.call("set", key, 1, "EX", window)
     end
     return 1
    end
    
    <オル>
  • 入力 :

    • キー[1] :ユーザーのリクエスト数を表す Redis キー。

    • ARGV[1] :レート制限 (許可されるリクエストの最大数)。

    • ARGV[2] :レート制限の時間枠 (秒単位)。

  • ロジック :

    • ユーザーがレート制限に達した場合は、0 を返します。 (リクエストはブロックされました)。

    • ユーザーが制限内にある場合は、リクエスト数を増やすか、最初のリクエストの場合は有効期限を付けて新しいカウントを設定します。

    • 1 を返します (リクエストは許可されます)。

  • ステップ 4:Node.js API サーバーを作成する方法

    server.js という名前のファイルを作成します。 :

    require('dotenv').config();
    const express = require('express');
    const redis = require('redis');
    const fs = require('fs');
    const path = require('path');
    const app = express();
    const client = redis.createClient({
     host: process.env.REDIS_HOST,
     port: process.env.REDIS_PORT
    });
    const rateLimitScript = fs.readFileSync(path.join(__dirname, 'rate_limiter.lua'), 'utf8');
    const RATE_LIMIT = parseInt(process.env.RATE_LIMIT);
    const TIME_WINDOW = parseInt(process.env.TIME_WINDOW);
    // Middleware for rate limiting
    async function rateLimiter(req, res, next) {
     const ip = req.ip;
     try {
     const allowed = await client.eval(rateLimitScript, 1, ip, RATE_LIMIT, TIME_WINDOW);
     if (allowed === 1) {
     next();
     } else {
     res.status(429).json({ message: 'Too many requests. Please try again later.' });
     }
     } catch (err) {
     console.error('Error in rate limiter:', err);
     res.status(500).json({ message: 'Internal server error' });
     }
    }
    app.use(rateLimiter);
    app.get('/', (req, res) => {
     res.send('Welcome to the Rate Limited API!');
    });
    const PORT = process.env.PORT;
    app.listen(PORT, () => {
     console.log(`Server running on port ${PORT}`);
    });
    
    <オル>
  • レート リミッタ ミドルウェア :

    • クライアントの IP アドレスを取得し、Lua スクリプトを使用してレート制限内にあるかどうかを確認します。

    • ユーザーが制限を超えた場合、429 応答が送信されます。

  • API エンドポイント :

    • ルート エンドポイントはレート制限されているため、ユーザーは指定された時間枠内で限られた回数のみアクセスできます。
  • ステップ 5:レート リミッターをテストする方法

    <オル>
  • Redis を開始 :

     docker start redis-rate-limiter
    
  • Node.js サーバーを実行する :

     node server.js
    
  • リクエストのシミュレーション :

    • curl を使用してください または Postman を使用してレート リミッタをテストします。

       curl http://localhost:3000
      
    • 複数のリクエストを迅速に送信して、レート制限が動作していることを確認します。

  • ステップ 6:レート制限メトリクスを視覚化する方法

    キャッシュ ヒットやブロックされたリクエストなどのレート制限メトリクスを監視するために、server.js のミドルウェアにログを追加します。 :

    async function rateLimiter(req, res, next) {
     const ip = req.ip;
     try {
     const allowed = await client.eval(rateLimitScript, 1, ip, RATE_LIMIT, TIME_WINDOW);
     if (allowed === 1) {
     console.log(`Allowed request from ${ip}`);
     next();
     } else {
     console.log(`Blocked request from ${ip}`);
     res.status(429).json({ message: 'Too many requests. Please try again later.' });
     }
     } catch (err) {
     console.error('Error in rate limiter:', err);
     res.status(500).json({ message: 'Internal server error' });
     }
    }
    

    ステップ 7:Docker を使用してデプロイする方法

    アプリケーションをコンテナ化して分散環境で実行しましょう。

    Dockerfile を作成します :

    FROM node:14
    WORKDIR /app
    COPY . .
    RUN npm install
    EXPOSE 3000
    CMD ["node", "server.js"]
    

    Docker コンテナを構築して実行します。

    docker build -t rate-limiter .
    docker run -p 3000:3000 rate-limiter
    

    複数のインスタンスを実行することで、レート リミッターをスケールできるようになりました。

    結論:学んだこと

    おめでとうございます! Redis および Lua スクリプトを使用して分散レート リミッターを正常に構築しました。このチュートリアルを通じて、次の方法を学習しました。

    <オル>
  • レート制限を実装して、分散システムでユーザー リクエストを制御します。

  • Redis で Lua スクリプトを使用して、アトミックな操作を実行します。

  • トークン バケット アルゴリズムを適用してリクエスト クォータを管理します。

  • レート制限メトリクスを監視してパフォーマンスを最適化します。

  • Docker を使用して、スケーラブルな分散環境をシミュレートします。

  • 次のステップ:

    <オル>
  • ユーザー ID によるレート制限の追加 :ユーザーごとのレート制限をサポートするようにシステムを拡張します。

  • Nginx との統合 :Redis によるレート制限を備えたリバース プロキシとして Nginx を使用します。

  • Kubernetes を使用したデプロイ :高可用性を実現するために、Kubernetes を使用してレート リミッターを拡張します。

  • コーディングを楽しんでください!

    無料でコーディングを学びましょう。 freeCodeCamp のオープンソース カリキュラムは、40,000 人以上の人々が開発者としての職に就くのに役立ちました。始めましょう


    1. Redis PERSIST –Redisでキーの有効期限を削除する方法

      このチュートリアルでは、コマンド– PERSIST を使用して、redisデータストアに保存されているキーの有効期限(タイムアウト)を削除する方法について学習します。 redis-cliで。 EXPIRE/PEXPIREまたはEXPIREAT/PEXPIREATを使用してキーに有効期限を設定すると、その状態は揮発性になります。 (有効期限が設定されたキー)。 PERSISTコマンドは、その状態を永続化に変更します それに関連付けられた有効期限を削除することによって状態。 redis PERSISTコマンドの構文は次のとおりです:- 構文:- redis host:post> PER

    2. RedisDeveloperHubが拡張されてDevOpsチームのニーズをサポート

      Redis Developer Hubは、Redisを使用してビルドしようとしている開発者にとって常に優れたリソースです。昨年数百万人の開発者がアクセスした200以上の無料チュートリアルで、作成を検討している開発者に貴重なトレーニングと指導を提供します。 、 開発 、 および探索 。 ただし、Redisは、DevOpsチームが開発者とは異なることに焦点を当てる必要があることを認識しています。安定性、保守性、アプリケーションの一貫したフローの改善と展開の維持などの問題です。 DevOpsプロフェッショナルとしてのあなたの仕事では、全体的に考え、インフラストラクチャに多くのアプリを世界中の規模