レート制限により、API ベースのサービスの可用性が保護および向上します。 API と通信していて、HTTP 429 Too Many Requests 応答ステータス コードを受信した場合は、レートが制限されています。これは、一定時間内に許可されるリクエストの数を超えたことを意味します。必要なのは、速度を落とし、少し待ってから再試行することだけです。
推奨ビデオ チュートリアル: nodejs チュートリアル
独自の API ベースのサービスを制限することを検討する場合は、ユーザー エクスペリエンス、セキュリティ、パフォーマンスの間のトレードオフを比較検討する必要があります。
#データ フローを制御する最も一般的な理由は、API ベースのサービスの可用性を維持することです。ただし、偶発的または意図的な受信トラフィックの急増により貴重なリソースが占有され、他のユーザーの可用性に影響を与える可能性があるため、セキュリティ上の利点もあります。
受信リクエストの速度を制御することで、次のことが可能になります。
レート制限は、クライアント レベル、アプリケーション レベル、インフラストラクチャ レベル、またはその中間のレベルで実装できます。 API サービスへの受信トラフィックを制御するには、いくつかの方法があります。
これらのレート制限のいずれかを (または組み合わせて) 使用できます。
実装方法に関係なく、レート制限の目標は、リソースへのアクセス要求を拒否または通過するチェックポイントを確立することです。多くのプログラミング言語とフレームワークには、これを実現するための機能やミドルウェアが組み込まれており、さまざまなレート制限アルゴリズムのオプションも備えています。
Node と Redis を使用して独自のレート リミッターを作成する 1 つの方法は次のとおりです:
ノード アプリの作成
GitHub でコード例をご覧ください。始める前に、コンピューターに Node と Redis がインストールされていることを確認してください。 ステップ 1: ノード アプリケーションをセットアップするコマンド ラインから新しいノード アプリケーションをセットアップします。 CLI プロンプトでデフォルトのオプションを受け入れるか、
—yes フラグを追加します。
$ npm init --yes
index.js という名前のファイルを作成します。
$ touch index.js
index.js でサーバーを初期化します。
const express = require('express') const app = express() const port = process.env.PORT || 3000 app.get('/', (req, res) => res.send('Hello World!')) app.listen(port, () => console.log(`Example app listening at http://localhost:${port}`))
$ node index.js
index.js に戻り、ルートを作成し、最初にレート制限を確認し、制限を超えていない場合はユーザーがリソースにアクセスできるようにします。
app.post('/', async (req, res) => { async function isOverLimit(ip) { // to define } // 检查率限制 let overLimit = await isOverLimit(req.ip) if (overLimit) { res.status(429).send('Too many requests - try again later') return } // 允许访问资源 res.send("Accessed the precious resources!") })
isOverLimit を定義します。
スライディング ウィンドウ カウンターの例 。ユーザーが適度な数の呼び出しを送信するか、時間をかけて間隔をあければ、レート制限に達することはありません。 10 秒以内に最大リクエストを超えたユーザーは、リクエストを再開するのに十分な時間を待つ必要があります。
コマンド ラインからノードに ioredis という名前の Redis クライアントをインストールします。
$ npm install ioredis
$ redis-server
index.js で Redis クライアントを要求して初期化します。
const redis = require('ioredis') const client = redis.createClient({ port: process.env.REDIS_PORT || 6379, host: process.env.REDIS_HOST || 'localhost', }) client.on('connect', function () { console.log('connected'); });
async function isOverLimit(ip) { let res try { res = await client.incr(ip) } catch (err) { console.error('isOverLimit: could not increment key') throw err } console.log(`${ip} has value: ${res}`) if (res > 10) { return true } client.expire(ip, 10) }
ユーザーが API を呼び出すと、Redis をチェックしてユーザーが制限を超えているかどうかを確認します。その場合、API はすぐに リクエストが多すぎます — 後でもう一度試してください
というメッセージを含む HTTP 429 ステータス コードを返します。ユーザーが制限内にある場合は、コードの次のブロックに進み、保護されたリソース (データベースなど) へのアクセスを許可します。
レート制限チェック中に、Redis でユーザーのレコードを見つけてリクエスト数を増やします。Redis にそのユーザーのレコードがない場合は、新しいレコードを作成します。最後に、各レコードは、最新のアクティビティから 10 秒以内に期限切れになります。
次のステップでは、速度リミッターが適切に機能していることを確認してください。
変更を保存し、サーバーを再起動します。 Postman を使用して、http:// localhost:3000
でローカルに実行されている API サーバーに POST
リクエストを送信します。
#レート制限に達するまで、リクエストを連続して送信し続けます。
レート制限に関する最終的な考え方これは、Node と Redis のレート制限の簡単な例です。始まり。レート制限を構築して実装するために使用できる戦略やツールは数多くあります。この例では、応答本文の
ヘッダーとして、再試行する前にユーザーに通知するなど、他の機能強化も検討できます。待ったほうがいいでしょうか
英語の元のアドレス: https://codeburst.io/api-rate-limiting-with-node-and-redis-95354259c768その他のプログラミング関連の知識、
プログラミング入門をご覧ください。 !
以上がNode+Redi による API レート制限の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。