iT邦幫忙

2025 iThome 鐵人賽

DAY 24
0
自我挑戰組

API 全攻略系列 第 24

Day 24:API Rate Limit 與流量控制

  • 分享至 

  • xImage
  •  

前言

在開發 API 的過程中,除了功能實現與資料正確性之外, 穩定性與防護性 也是關鍵。假設沒有任何限制,惡意或大量的請求可能會導致:

  • 伺服器 過載 (Denial of Service, DoS 攻擊)
  • 服務被 濫用 (例如免費 API 被自動化抓取)
  • 造成 使用者體驗不佳 (真正的用戶無法獲得及時回應)
    因此,我們需要設計 Rate Limit(速率限制)流量控制 機制,來保障系統健康運作。

1. 什麼是 Rate Limit?

Rate Limit 指的是 在一定時間內,限制使用者的請求次數
例如:

  • 每個使用者 每分鐘最多 60 次請求
  • 每個 IP 每小時最多 1000 次請求
    超過限制的請求,會被伺服器拒絕,通常回傳 429 Too Many Requests 錯誤。

2. 常見的流量控制策略

1. Fixed Window(固定視窗)

在固定時間段內(例如 1 分鐘),限制最大請求數。
缺點:如果用戶在時間邊界狂發請求,可能造成「尖峰流量」。

2. Sliding Window(滑動視窗)

以時間為連續軸計算請求數,更平滑地控制流量。

3. Token Bucket(令牌桶)

  • 系統以固定速率產生「令牌」
  • 每次請求需消耗一個令牌
  • 令牌用完時,請求會被拒絕
    優點:允許「短時間的突發流量」。

4. Leaky Bucket(漏桶)

  • 所有請求進入桶子
  • 以固定速率處理請求
  • 超過容量的請求被丟棄
    優點:流量輸出穩定,缺點是突發流量會被丟棄。

3. Express 中的 Rate Limit 實作

我們可以使用 express-rate-limit 套件。
安裝

npm install express-rate-limit

使用範例

import express from "express";
import rateLimit from "express-rate-limit";

const app = express();

// 設定每個 IP 每分鐘最多 10 次請求
const limiter = rateLimit({
  windowMs: 60 * 1000, // 1 分鐘
  max: 10, // 最大 10 次
  message: {
    status: 429,
    error: "Too many requests, please try again later."
  },
});

// 套用到所有路由
app.use(limiter);

app.get("/", (req, res) => {
  res.send("API 正常運作");
});

app.listen(3000, () => {
  console.log("Server running on http://localhost:3000");
});

現在,當同一個 IP 在 1 分鐘內請求超過 10 次,就會收到 429 Too Many Requests 錯誤。


小結

  • Rate Limit 是 API 設計的重要防護機制,避免濫用與過載。
  • 常見策略包含 Fixed Window、Sliding Window、Token Bucket、Leaky Bucket
  • 在 Node.js / Express 中,可以用 express-rate-limit 快速實作。
  • 在大型系統中,建議透過 API Gateway雲服務 來集中管理流量控制。

上一篇
Day 23:WebSocket 與即時 API
系列文
API 全攻略24
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言