Skip to Content
Nextra 4.0 is released 🎉
DocumentationDesign A Rate LimiterUnderstand the Problem and Establish Design Scope

āϰ⧇āϟ āϞāĻŋāĻŽāĻŋāϟāĻžāϰ āĻĄāĻŋāϜāĻžāχāύ āĻ•āϰāĻž (Design A Rate Limiter)

āĻāĻ•āϟāĻŋ āύ⧇āϟāĻ“ā§ŸāĻžāĻ°ā§āĻ• āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡ āĻ•ā§āϞāĻžā§Ÿā§‡āĻ¨ā§āϟ āĻŦāĻž āϏāĻžāĻ°ā§āĻ­āĻŋāϏ⧇āϰ āĻĒāĻžāĻ āĻžāύ⧋ āĻŸā§āϰāĻžāĻĢāĻŋāϕ⧇āϰ āĻšāĻžāϰ (rate of traffic) āύāĻŋ⧟āĻ¨ā§āĻ¤ā§āϰāĻŖ āĻ•āϰāϤ⧇ āϰ⧇āϟ āϞāĻŋāĻŽāĻŋāϟāĻžāϰ (rate limiter) āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšā§ŸāĨ¤ āĻāχāϚāϟāĻŋāϟāĻŋāĻĒāĻŋ (HTTP) āĻĻ⧁āύāĻŋ⧟āĻžā§Ÿ, āĻāĻ•āϟāĻŋ āϰ⧇āϟ āϞāĻŋāĻŽāĻŋāϟāĻžāϰ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āϏāĻŽāϝāĻŧ⧇āϰ āĻŽāĻ§ā§āϝ⧇ āĻ•ā§āϞāĻžā§Ÿā§‡āĻ¨ā§āĻŸā§‡āϰ āĻĒāĻžāĻ āĻžāύ⧋ āϰāĻŋāĻ•ā§‹ā§Ÿā§‡āĻ¸ā§āĻŸā§‡āϰ āϏāĻ‚āĻ–ā§āϝāĻž āϏ⧀āĻŽāĻŋāϤ āĻ•āϰ⧇āĨ¤ āϝāĻĻāĻŋ āĻāĻĒāĻŋāφāχ (API) āϰāĻŋāĻ•ā§‹ā§Ÿā§‡āĻ¸ā§āĻŸā§‡āϰ āϏāĻ‚āĻ–ā§āϝāĻž āϰ⧇āϟ āϞāĻŋāĻŽāĻŋāϟāĻžāϰ⧇āϰ āύāĻŋāĻ°ā§āϧāĻžāϰāĻŋāϤ āϏ⧀āĻŽāĻž (threshold) āĻ…āϤāĻŋāĻ•ā§āϰāĻŽ āĻ•āϰ⧇, āϤāĻŦ⧇ āĻ…āϤāĻŋāϰāĻŋāĻ•ā§āϤ āϏāĻŽāĻ¸ā§āϤ āĻ•āϞ āĻŦā§āϞāĻ• āĻŦāĻž āφāϟāϕ⧇ āĻĻ⧇āĻ“ā§ŸāĻž āĻšā§ŸāĨ¤ āύāĻŋāĻšā§‡ āĻāϰ āĻ•ā§Ÿā§‡āĻ•āϟāĻŋ āωāĻĻāĻžāĻšāϰāĻŖ āĻĻ⧇āĻ“ā§ŸāĻž āĻšāϞ⧋:

  • āĻāĻ•āϜāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āĻĒā§āϰāϤāĻŋ āϏ⧇āϕ⧇āĻ¨ā§āĻĄā§‡ ⧍āϟāĻŋāϰ āĻŦ⧇āĻļāĻŋ āĻĒā§‹āĻ¸ā§āϟ āϞāĻŋāĻ–āϤ⧇ āĻĒāĻžāϰāĻŦ⧇āύ āύāĻžāĨ¤
  • āφāĻĒāύāĻŋ āĻāĻ•āχ āφāχāĻĒāĻŋ (IP) āĻ āĻŋāĻ•āĻžāύāĻž āĻĨ⧇āϕ⧇ āĻĻāĻŋāύ⧇ āϏāĻ°ā§āĻŦā§‹āĻšā§āϚ ā§§ā§ĻāϟāĻŋ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŦ⧇āύāĨ¤
  • āφāĻĒāύāĻŋ āĻāĻ•āχ āĻĄāĻŋāĻ­āĻžāχāϏ āĻĨ⧇āϕ⧇ āϏāĻĒā§āϤāĻžāĻšā§‡ ā§Ģ āĻŦāĻžāϰ⧇āϰ āĻŦ⧇āĻļāĻŋ āϰāĻŋāĻ“ā§ŸāĻžāĻ°ā§āĻĄ (reward) āĻĻāĻžāĻŦāĻŋ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŦ⧇āύ āύāĻžāĨ¤

āĻāχ āĻ…āĻ§ā§āϝāĻžā§Ÿā§‡, āφāĻĒāύāĻžāϕ⧇ āĻāĻ•āϟāĻŋ āϰ⧇āϟ āϞāĻŋāĻŽāĻŋāϟāĻžāϰ āĻĄāĻŋāϜāĻžāχāύ āĻ•āϰāϤ⧇ āĻŦāϞāĻž āĻšā§Ÿā§‡āϛ⧇āĨ¤ āĻĄāĻŋāϜāĻžāχāύ āĻļ⧁āϰ⧁ āĻ•āϰāĻžāϰ āφāϗ⧇, āϚāϞ⧁āύ āĻāĻ•āϟāĻŋ āĻāĻĒāĻŋāφāχ (API) āϰ⧇āϟ āϞāĻŋāĻŽāĻŋāϟāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ⧇āϰ āϏ⧁āĻŦāĻŋāϧāĻžāϗ⧁āϞ⧋ āĻĻ⧇āϖ⧇ āύāĻŋāχ:

  • āĻĄāĻŋāύāĻžā§ŸāĻžāϞ āĻ…āĻĢ āϏāĻžāĻ°ā§āĻ­āĻŋāϏ (Denial of Service āĻŦāĻž DoS) āĻ…ā§āϝāĻžāϟāĻžāϕ⧇āϰ āĻ•āĻžāϰāϪ⧇ āϏ⧃āĻˇā§āϟ āϰāĻŋāϏ⧋āĻ°ā§āϏ āĻ¸ā§āϟāĻžāϰāϭ⧇āĻļāύ (resource starvation - āϰāĻŋāϏ⧋āĻ°ā§āϏ⧇āϰ āϘāĻžāϟāϤāĻŋ) āĻĒā§āϰāϤāĻŋāϰ⧋āϧ āĻ•āϰ⧇ [ā§§]: āĻŦ⧜ āĻŦ⧜ āĻŸā§‡āĻ• āϕ⧋āĻŽā§āĻĒāĻžāύāĻŋāϗ⧁āϞ⧋āϰ āĻĒā§āϰāĻ•āĻžāĻļāĻŋāϤ āĻĒā§āϰāĻžā§Ÿ āϏāĻŦ āĻāĻĒāĻŋāφāχ-āϤ⧇āχ āϕ⧋āύ⧋ āύāĻž āϕ⧋āύ⧋ āϧāϰāύ⧇āϰ āϰ⧇āϟ āϞāĻŋāĻŽāĻŋāϟāĻŋāĻ‚ āĻĒā§āĻ°ā§Ÿā§‹āĻ— āĻ•āϰāĻž āĻĨāĻžāϕ⧇āĨ¤ āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, āϟ⧁āχāϟāĻžāϰ (Twitter) āĻĒā§āϰāϤāĻŋ ā§Š āϘāĻŖā§āϟāĻžā§Ÿ āϏāĻ°ā§āĻŦā§‹āĻšā§āϚ ā§Šā§Ļā§ĻāϟāĻŋ āϟ⧁āχāϟ āĻ•āϰāĻžāϰ āϏ⧀āĻŽāĻž āύāĻŋāĻ°ā§āϧāĻžāϰāĻŖ āĻ•āϰ⧇ āĻĻā§‡ā§Ÿ [⧍]āĨ¤ āϗ⧁āĻ—āϞ āĻĄāĻ•āϏ (Google docs) āĻāĻĒāĻŋāφāχ-āϤ⧇ āϰāĻŋāĻĄ āϰāĻŋāĻ•ā§‹ā§Ÿā§‡āĻ¸ā§āĻŸā§‡āϰ āϜāĻ¨ā§āϝ āĻĄāĻŋāĻĢāĻ˛ā§āϟ āϞāĻŋāĻŽāĻŋāϟ āĻšāϞ⧋: āĻĒā§āϰāϤāĻŋ ā§Ŧā§Ļ āϏ⧇āϕ⧇āĻ¨ā§āĻĄā§‡ āĻĒā§āϰāϤāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āϜāĻ¨ā§āϝ ā§Šā§Ļā§ĻāϟāĻŋ āϰāĻŋāĻ•ā§‹ā§Ÿā§‡āĻ¸ā§āϟ [ā§Š]āĨ¤ āĻāĻ•āϟāĻŋ āϰ⧇āϟ āϞāĻŋāĻŽāĻŋāϟāĻžāϰ āχāĻšā§āĻ›āĻžāĻ•ā§ƒāϤ āĻŦāĻž āĻ…āύāĻŋāĻšā§āĻ›āĻžāĻ•ā§ƒāĻ¤â€”āϝ⧇āϕ⧋āύ⧋ āĻ…āϤāĻŋāϰāĻŋāĻ•ā§āϤ āĻ•āϞ āĻŦā§āϞāĻ• āĻ•āϰāĻžāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ DoS āĻ…ā§āϝāĻžāϟāĻžāĻ• āĻĒā§āϰāϤāĻŋāϰ⧋āϧ āĻ•āϰ⧇āĨ¤
  • āĻ–āϰāϚ āĻ•āĻŽāĻžāύ⧋ (Reduce cost): āĻ…āϤāĻŋāϰāĻŋāĻ•ā§āϤ āϰāĻŋāĻ•ā§‹ā§Ÿā§‡āĻ¸ā§āϟ āϏ⧀āĻŽāĻŋāϤ āĻ•āϰāĻžāϰ āĻ…āĻ°ā§āĻĨ āĻšāϞ⧋ āĻ•āĻŽ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻāĻŦāĻ‚ āωāĻšā§āϚ āĻ…āĻ—ā§āϰāĻžāϧāĻŋāĻ•āĻžāϰāĻĒā§āϰāĻžāĻĒā§āϤ (high priority) āĻāĻĒāĻŋāφāχāϗ⧁āϞ⧋āϰ āϜāĻ¨ā§āϝ āĻŦ⧇āĻļāĻŋ āϰāĻŋāϏ⧋āĻ°ā§āϏ āĻŦāϰāĻžāĻĻā§āĻĻ āĻ•āϰāĻžāĨ¤ āϝ⧇āϏāĻŦ āϕ⧋āĻŽā§āĻĒāĻžāύāĻŋ āĻĒ⧇āχāĻĄ āĻĨāĻžāĻ°ā§āĻĄ-āĻĒāĻžāĻ°ā§āϟāĻŋ āĻāĻĒāĻŋāφāχ (paid third party APIs) āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇, āϤāĻžāĻĻ⧇āϰ āϜāĻ¨ā§āϝ āϰ⧇āϟ āϞāĻŋāĻŽāĻŋāϟāĻŋāĻ‚ āĻ…āĻ¤ā§āϝāĻ¨ā§āϤ āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖāĨ¤ āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, āύāĻŋāĻšā§‡āϰ āĻāĻ•ā§āϏāϟāĻžāĻ°ā§āύāĻžāϞ āĻāĻĒāĻŋāφāχāϗ⧁āϞ⧋āϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āφāĻĒāύāĻžāϕ⧇ āĻĒā§āϰāϤāĻŋ-āĻ•āϞ⧇āϰ (per-call basis) āĻ“āĻĒāϰ āϚāĻžāĻ°ā§āϜ āĻĻāĻŋāϤ⧇ āĻšā§Ÿ: āĻ•ā§āϰ⧇āĻĄāĻŋāϟ āĻšā§‡āĻ• āĻ•āϰāĻž, āĻĒ⧇āĻŽā§‡āĻ¨ā§āϟ āĻ•āϰāĻž, āĻšā§‡āϞāĻĨ āϰ⧇āĻ•āĻ°ā§āĻĄ āϰāĻŋāĻŸā§āϰāĻŋāĻ­ āĻŦāĻž āϏāĻ‚āĻ—ā§āϰāĻš āĻ•āϰāĻž āχāĻ¤ā§āϝāĻžāĻĻāĻŋāĨ¤ āĻ–āϰāϚ āĻ•āĻŽāĻžāύ⧋āϰ āϜāĻ¨ā§āϝ āĻ āϧāϰāύ⧇āϰ āĻ•āϞ⧇āϰ āϏāĻ‚āĻ–ā§āϝāĻž āϏ⧀āĻŽāĻŋāϤ āĻ•āϰāĻž āĻ…āĻĒāϰāĻŋāĻšāĻžāĻ°ā§āϝāĨ¤
  • āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻ“āĻ­āĻžāϰāϞ⧋āĻĄā§‡āĻĄ (overloaded) āĻšāĻ“ā§ŸāĻž āϰ⧋āϧ āĻ•āϰ⧇: āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇āϰ āϞ⧋āĻĄ āĻ•āĻŽāĻžāύ⧋āϰ āϜāĻ¨ā§āϝ, āĻŦāϟ (bots) āĻŦāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āĻ…āϏāĻĻāĻžāϚāϰāϪ⧇āϰ āĻ•āĻžāϰāϪ⧇ āφāϏāĻž āĻ…āϤāĻŋāϰāĻŋāĻ•ā§āϤ āϰāĻŋāĻ•ā§‹ā§Ÿā§‡āĻ¸ā§āϟāϗ⧁āϞ⧋āϕ⧇ āĻĢāĻŋāĻ˛ā§āϟāĻžāϰ āĻ•āϰ⧇ āĻŦāĻžāĻĻ āĻĻāĻŋāϤ⧇ āϰ⧇āϟ āϞāĻŋāĻŽāĻŋāϟāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšā§ŸāĨ¤

āϧāĻžāĻĒ ā§§ - āϏāĻŽāĻ¸ā§āϝāĻžāϟāĻŋ āĻŦā§‹āĻāĻž āĻāĻŦāĻ‚ āĻĄāĻŋāϜāĻžāχāύ⧇āϰ āĻĒāϰāĻŋāϧāĻŋ āύāĻŋāĻ°ā§āϧāĻžāϰāĻŖ āĻ•āϰāĻž (Understand the problem and establish design scope)

āϰ⧇āϟ āϞāĻŋāĻŽāĻŋāϟāĻŋāĻ‚ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āĻ…ā§āϝāĻžāϞāĻ—āϰāĻŋāĻĻāĻŽ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻĒā§āϰāϝāĻŧā§‹āĻ— āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇, āϝāĻžāϰ āĻĒā§āϰāĻ¤ā§āϝ⧇āĻ•āϟāĻŋāϰāχ āύāĻŋāϜāĻ¸ā§āĻŦ āϏ⧁āĻŦāĻŋāϧāĻž āĻ“ āĻ…āϏ⧁āĻŦāĻŋāϧāĻž (pros and cons) āĻ°ā§Ÿā§‡āϛ⧇āĨ¤ āχāĻ¨ā§āϟāĻžāϰāĻ­āĻŋāĻ‰ā§ŸāĻžāϰ āĻāĻŦāĻ‚ āĻĒā§āϰāĻžāĻ°ā§āĻĨā§€āϰ āĻŽāĻ§ā§āϝāĻ•āĻžāϰ āĻ•āĻĨā§‹āĻĒāĻ•āĻĨāύāϟāĻŋ āφāĻŽāϰāĻž āĻ āĻŋāĻ• āϕ⧀ āϧāϰāύ⧇āϰ āϰ⧇āϟ āϞāĻŋāĻŽāĻŋāϟāĻžāϰ āϤ⧈āϰāĻŋ āĻ•āϰāĻžāϰ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰāĻ›āĻŋ āϤāĻž āĻĒāϰāĻŋāĻˇā§āĻ•āĻžāϰ āĻ•āϰāϤ⧇ āϏāĻžāĻšāĻžāĻ¯ā§āϝ āĻ•āϰ⧇āĨ¤

āĻĒā§āϰāĻžāĻ°ā§āĻĨā§€: āφāĻŽāϰāĻž āϕ⧀ āϧāϰāύ⧇āϰ āϰ⧇āϟ āϞāĻŋāĻŽāĻŋāϟāĻžāϰ āĻĄāĻŋāϜāĻžāχāύ āĻ•āϰāϤ⧇ āϝāĻžāĻšā§āĻ›āĻŋ? āĻāϟāĻŋ āĻ•āĻŋ āĻ•ā§āϞāĻžā§Ÿā§‡āĻ¨ā§āϟ-āϏāĻžāχāĻĄ (client-side) āϰ⧇āϟ āϞāĻŋāĻŽāĻŋāϟāĻžāϰ āύāĻžāĻ•āĻŋ āϏāĻžāĻ°ā§āĻ­āĻžāϰ-āϏāĻžāχāĻĄ (server-side) āĻāĻĒāĻŋāφāχ āϰ⧇āϟ āϞāĻŋāĻŽāĻŋāϟāĻžāϰ? āχāĻ¨ā§āϟāĻžāϰāĻ­āĻŋāĻ‰ā§ŸāĻžāϰ: āϚāĻŽā§ŽāĻ•āĻžāϰ āĻĒā§āϰāĻļā§āύāĨ¤ āφāĻŽāϰāĻž āϏāĻžāĻ°ā§āĻ­āĻžāϰ-āϏāĻžāχāĻĄ āĻāĻĒāĻŋāφāχ āϰ⧇āϟ āϞāĻŋāĻŽāĻŋāϟāĻžāϰ⧇āϰ āĻ“āĻĒāϰ āĻĢā§‹āĻ•āĻžāϏ āĻ•āϰāĻ›āĻŋāĨ¤

āĻĒā§āϰāĻžāĻ°ā§āĻĨā§€: āϰ⧇āϟ āϞāĻŋāĻŽāĻŋāϟāĻžāϰ āĻ•āĻŋ āφāχāĻĒāĻŋ (IP), āχāωāϜāĻžāϰ āφāχāĻĄāĻŋ (user ID) āύāĻžāĻ•āĻŋ āĻ…āĻ¨ā§āϝ āϕ⧋āύ⧋ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝ⧇āϰ āĻ“āĻĒāϰ āĻ­āĻŋāĻ¤ā§āϤāĻŋ āĻ•āϰ⧇ āĻāĻĒāĻŋāφāχ āϰāĻŋāĻ•ā§‹ā§Ÿā§‡āĻ¸ā§āϟ āĻĨā§āϰ⧋āϟāϞ (throttle āĻŦāĻž āύāĻŋ⧟āĻ¨ā§āĻ¤ā§āϰāĻŖ) āĻ•āϰāĻŦ⧇? āχāĻ¨ā§āϟāĻžāϰāĻ­āĻŋāĻ‰ā§ŸāĻžāϰ: āϰ⧇āϟ āϞāĻŋāĻŽāĻŋāϟāĻžāϰāϟāĻŋ āĻāĻŽāύāĻ­āĻžāĻŦ⧇ āĻĢā§āϞ⧇āĻ•ā§āϏāĻŋāĻŦāϞ (flexible) āĻšāĻ“ā§ŸāĻž āωāϚāĻŋāϤ āϝāĻžāϤ⧇ āĻāϟāĻŋ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āϧāϰāύ⧇āϰ āĻĨā§āϰ⧋āϟāϞ āϰ⧁āϞāϏ (throttle rules) āϏāĻžāĻĒā§‹āĻ°ā§āϟ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

āĻĒā§āϰāĻžāĻ°ā§āĻĨā§€: āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡āϰ āĻ¸ā§āϕ⧇āϞ (scale) āĻŦāĻž āφāĻ•āĻžāϰ āϕ⧇āĻŽāύ? āĻāϟāĻŋ āĻ•āĻŋ āϕ⧋āύ⧋ āĻ¸ā§āϟāĻžāĻ°ā§āϟāφāĻĒ⧇āϰ āϜāĻ¨ā§āϝ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇, āύāĻžāĻ•āĻŋ āĻŦāĻŋāĻļāĻžāϞ āχāωāϜāĻžāϰ āĻŦ⧇āϏ (user base) āĻĨāĻžāĻ•āĻž āĻŦ⧜ āϕ⧋āύ⧋ āϕ⧋āĻŽā§āĻĒāĻžāύāĻŋāϰ āϜāĻ¨ā§āϝ? āχāĻ¨ā§āϟāĻžāϰāĻ­āĻŋāĻ‰ā§ŸāĻžāϰ: āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽāϟāĻŋāϕ⧇ āĻ…āĻŦāĻļā§āϝāχ āĻŦāĻŋāĻĒ⧁āϞ āϏāĻ‚āĻ–ā§āϝāĻ• āϰāĻŋāĻ•ā§‹ā§Ÿā§‡āĻ¸ā§āϟ āĻšā§āϝāĻžāĻ¨ā§āĻĄā§‡āϞ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāϤ⧇ āĻšāĻŦ⧇āĨ¤

āĻĒā§āϰāĻžāĻ°ā§āĻĨā§€: āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽāϟāĻŋ āĻ•āĻŋ āĻāĻ•āϟāĻŋ āĻĄāĻŋāĻ¸ā§āĻŸā§āϰāĻŋāĻŦāĻŋāωāĻŸā§‡āĻĄ āĻāύāĻ­āĻžā§ŸāϰāύāĻŽā§‡āĻ¨ā§āĻŸā§‡ (distributed environment) āĻ•āĻžāϜ āĻ•āϰāĻŦ⧇? āχāĻ¨ā§āϟāĻžāϰāĻ­āĻŋāĻ‰ā§ŸāĻžāϰ: āĻšā§āϝāĻžāρāĨ¤

āĻĒā§āϰāĻžāĻ°ā§āĻĨā§€: āϰ⧇āϟ āϞāĻŋāĻŽāĻŋāϟāĻžāϰāϟāĻŋ āĻ•āĻŋ āφāϞāĻžāĻĻāĻž āϕ⧋āύ⧋ āϏāĻžāĻ°ā§āĻ­āĻŋāϏ āĻšāĻŦ⧇ āύāĻžāĻ•āĻŋ āĻāϟāĻŋ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ⧇āϰ āϕ⧋āĻĄā§‡āχ āχāĻŽāĻĒā§āϞāĻŋāĻŽā§‡āĻ¨ā§āϟ āĻŦāĻž āĻĒā§āĻ°ā§Ÿā§‹āĻ— āĻ•āϰāĻž āωāϚāĻŋāϤ? āχāĻ¨ā§āϟāĻžāϰāĻ­āĻŋāĻ‰ā§ŸāĻžāϰ: āĻāϟāĻŋ āĻĄāĻŋāϜāĻžāχāύ⧇āϰ āϏāĻŋāĻĻā§āϧāĻžāĻ¨ā§āϤ, āϝāĻž āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āφāĻĒāύāĻžāϰ āĻ“āĻĒāϰ āύāĻŋāĻ°ā§āĻ­āϰ āĻ•āϰāϛ⧇āĨ¤

āĻĒā§āϰāĻžāĻ°ā§āĻĨā§€: āϝ⧇āϏāĻŦ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϕ⧇ āĻĨā§āϰ⧋āϟāϞ āĻŦāĻž āφāϟāϕ⧇ āĻĻ⧇āĻ“ā§ŸāĻž āĻšāĻŦ⧇, āϤāĻžāĻĻ⧇āϰ āĻ•āĻŋ āφāĻŽāĻžāĻĻ⧇āϰ āχāύāĻĢāĻ°ā§āĻŽ āĻŦāĻž āϜāĻžāύāĻžāϤ⧇ āĻšāĻŦ⧇? āχāĻ¨ā§āϟāĻžāϰāĻ­āĻŋāĻ‰ā§ŸāĻžāϰ: āĻšā§āϝāĻžāρāĨ¤

āϰāĻŋāĻ•ā§‹ā§ŸāĻžāϰāĻŽā§‡āĻ¨ā§āϟāϏ (Requirements) āĻŦāĻž āĻŽā§‚āϞ āϚāĻžāĻšāĻŋāĻĻāĻžāϏāĻŽā§‚āĻš

āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽāϟāĻŋāϰ āϰāĻŋāĻ•ā§‹ā§ŸāĻžāϰāĻŽā§‡āĻ¨ā§āϟāϗ⧁āϞ⧋āϰ āĻāĻ•āϟāĻŋ āϏāĻžāϰāϏāĻ‚āĻ•ā§āώ⧇āĻĒ āύāĻŋāĻšā§‡ āĻĻ⧇āĻ“ā§ŸāĻž āĻšāϞ⧋:

  • āĻ…āϤāĻŋāϰāĻŋāĻ•ā§āϤ āϰāĻŋāĻ•ā§‹ā§Ÿā§‡āĻ¸ā§āϟāϗ⧁āϞ⧋āϕ⧇ āύāĻŋāϖ⧁āρāϤāĻ­āĻžāĻŦ⧇ āϏ⧀āĻŽāĻžāĻŦāĻĻā§āϧ (limit) āĻ•āϰāĻžāĨ¤
  • āϞ⧋ āĻ˛ā§āϝāĻžāĻŸā§‡āĻ¨ā§āϏāĻŋ (Low latency): āϰ⧇āϟ āϞāĻŋāĻŽāĻŋāϟāĻžāϰ⧇āϰ āĻ•āĻžāϰāϪ⧇ āϝ⧇āύ āĻāχāϚāϟāĻŋāϟāĻŋāĻĒāĻŋ āϰ⧇āϏāĻĒāĻ¨ā§āϏ āϟāĻžāχāĻŽ (HTTP response time) āϧ⧀āϰ āύāĻž āĻšā§Ÿā§‡ āϝāĻžā§ŸāĨ¤
  • āϝāϤāϟāĻž āϏāĻŽā§āĻ­āĻŦ āĻ•āĻŽ āĻŽā§‡āĻŽāϰāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāĨ¤
  • āĻĄāĻŋāĻ¸ā§āĻŸā§āϰāĻŋāĻŦāĻŋāωāĻŸā§‡āĻĄ āϰ⧇āϟ āϞāĻŋāĻŽāĻŋāϟāĻŋāĻ‚ (Distributed rate limiting): āϰ⧇āϟ āϞāĻŋāĻŽāĻŋāϟāĻžāϰāϟāĻŋ āĻāĻ•āĻžāϧāĻŋāĻ• āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻŦāĻž āĻĒā§āϰāϏ⧇āϏ⧇āϰ āĻŽāĻ§ā§āϝ⧇ āĻļā§‡ā§ŸāĻžāϰ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤
  • āĻāĻ•ā§āϏ⧇āĻĒāĻļāύ āĻšā§āϝāĻžāĻ¨ā§āĻĄā§‡āϞāĻŋāĻ‚ (Exception handling): āϝāĻ–āύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āϰāĻŋāĻ•ā§‹ā§Ÿā§‡āĻ¸ā§āϟ āĻĨā§āϰ⧋āϟāϞ āĻŦāĻž āφāϟāϕ⧇ āĻĻ⧇āĻ“ā§ŸāĻž āĻšāĻŦ⧇, āϤāĻ–āύ āϤāĻžāĻĻ⧇āϰ āĻ•āĻžāϛ⧇ āĻĒāϰāĻŋāĻˇā§āĻ•āĻžāϰ āĻāĻ•ā§āϏ⧇āĻĒāĻļāύ (exceptions) āĻŦāĻž āĻŦāĻžāĻ°ā§āϤāĻž āĻĒā§āϰāĻĻāĻ°ā§āĻļāύ āĻ•āϰāĻžāĨ¤
  • āĻšāĻžāχ āĻĢāĻ˛ā§āϟ āϟāϞāĻžāϰ⧇āĻ¨ā§āϏ (High fault tolerance): āϰ⧇āϟ āϞāĻŋāĻŽāĻŋāϟāĻžāϰ⧇āϰ āϕ⧋āύ⧋ āϏāĻŽāĻ¸ā§āϝāĻž āĻšāϞ⧇ (āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, āϝāĻĻāĻŋ āĻ•ā§āϝāĻžāĻļ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻ…āĻĢāϞāĻžāχāύ⧇ āϚāϞ⧇ āϝāĻžā§Ÿ), āĻāϟāĻŋ āϝ⧇āύ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽāϕ⧇ āĻĒā§āϰāĻ­āĻžāĻŦāĻŋāϤ āύāĻž āĻ•āϰ⧇āĨ¤