ํด๋ผ์ด์ธํธ/์๋น์ค๊ฐ ๋ณด๋ด๋ ํธ๋ํฝ ์ฒ๋ฆฌ์จ(rate)๋ฅผ ์ ์ดํ๋ ์ฅ์น.
HTTP ์ด ์ฅ์น๊ฐ ํน์ ๊ธฐ๊ฐ ๋ด์ ์ ์กํ๋ ํด๋ผ์ด์ธํธ ์์ฒญ ํ์๋ฅผ ์ ํํ๋ค. api ์์ฒญ ํ์๊ฐ ์๊ณ์น๋ฅผ ๋์ด์๋ฉด ์ถ๊ฐ๋ก ๋๋ฌํ ๋ชจ๋ ํธ์ถ์ ๋งํ๋ค.
- ์ด๋น 2ํ ์ด์ ์ ๊ธ์ ์ฌ๋ฆด ์ ์๋ค. ๊ฐ์ IP๋ก๋ ํ๋ฃจ 10๊ฐ ์ด์ ๊ณ์ ์์ฑ์ด ์๋๋ค ๋ฑ๋ฑ
DoS(Denial of Service) ๊ณต๊ฒฉ์ ์ํ ์์ ๊ณ ๊ฐ(resource starvation)์ ๋ฐฉ์งํ ์ ์๋ค.
์ฒ๋ฆฌ์จ ์ ํ ์ฅ์น๋ ์ถ๊ฐ ์์ฒญ์ ๋ํด์๋ ์ฒ๋ฆฌ๋ฅผ ์ค๋จํจ์ผ๋ก์จ DoS ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๋ค.
์ 3์(thrid-party) API์ ์ฌ์ฉ๋ฃ๋ฅผ ์ง๋ถํ๋ ํ์ฌ๋ค์๊ฒ๋ ์์ฃผ ์ค์ํ๋ค.
์๋ฒ ๋ถํ๋ฅผ ๋ง๋๋ค. ์๋ชป๋ ์ด์ฉ ํจํด์ผ๋ก ์ ๋ฐ๋ ํธ๋ํฝ์ ๊ฑธ๋ฌ๋ด๋ ๊ฒ์ ์ฒ๋ฆฌ์จ ์ ํ ์ฅ์น๋ฅผ ํ์ฉ๊ฐ๋ฅํ๋ค.
ALPHA-HELIX ๋ third-party๋ฅผ ์ฌ์ฉ, ๋ถ์ฐ ํ๊ฒฝ์์๋ ๋์ํด์ผํ๋ ๋๊ท๋ชจ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์์ด์ผํ๋ค.
1๋จ๊ณ : ๋ฌธ์ ์ดํด ๋ฐ ์๊ตฌ์ฌํญ ์ค๊ณ ๋ฒ์ ํ์
- ์ค์ ๋ ์ฒ๋ฆฌ์จ์ ์ด๊ณผํ๋ ์์ฒญ์ ์ ํํ ์ ํํ๋ค.
- ๋ฎ์ ์๋ต์๊ฐ: ์ฒ๋ฆฌ์จ ์ ํ์ฅ์น๋ http ์๋ต์๊ฐ์ ๋ถ์ ์ ์ธ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
- ๊ฐ๋ฅํ ์ ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ค.
- ๋ถ์ฐํ ์ฒ๋ฆฌ์จ ์ ํ: ํ๋์ ์ฒ๋ฆฌ์จ ์ ํ ์ฅ์น๋ฅผ, ์ฌ๋ฌ ์๋ฒ/ํ๋ก์ธ์ค์์ ๊ณต์ ํ๋ค.
- ์์ธ ์ฒ๋ฆฌ: ์์ฒญ์ด ์ ํ๋์์ ๋ ์ฌ์ค์ ์ฌ์ฉ์์๊ฒ ๋ถ๋ช ํ ๋ณด์ฌ์ค๋ค.
- ๋์ ๊ฒฐํจ ๊ฐ๋ด์ฑ(fault tolerance) : ์ ํ ์ฅ์น์ ์ฅ์ ๊ฐ ์๊ฒจ๋ ์ ์ฒด ์์คํ ์ ์ํฅ ์ฃผ์ด์๋ ์๋๋ค
2๋จ๊ณ : ๊ฐ๋ต์ ์ค๊ณ์ ์ ์ ๋ฐ ๋์ ๊ตฌํ๊ธฐ
ํด๋ผ์ด์ธํธ or ์๋ฒ ์ธก์๋ ์ด ์ฅ์น๋ฅผ ๋ ์ ์๋ค. ํด๋ผ์ด์ธํธ ์ธก์ ํต์ ๊ฐ ์ด๋ ค์ฐ๋ ๋์ง ์๋๋ค.
์๋ฒ์ ๋๋ค๋ฉด, ์์ ํ ์๋ฒ์ธก์ ์ฒ๋ฆฌ์จ ์ ํ ์ฅ์น๋ฅผ ๋๊ฑฐ๋

์ฒ๋ฆฌ์จ ์ ํ ์ฅ์น๋ฅผ API์๋ฒ์ ๋๋ ๋์ ์, ๋ฏธ๋ค์จ์ด๋ฅผ ๋ง๋ค์ด์, ํด๋น ๋ฏธ๋ค ์จ์ด๋ก API ์๋ฒ๋ก ๊ฐ๋ ์์ฒญ์ ํต์ ํ๋ ๋ฐฉ๋ฒ์ด๋ค.

๋ง์ฝ์ ๋๋ฌด ๋ง์ ์์ฒญ์ด ์งง์ ์๊ฐ๋ด์ API ์๋ฒ๋ก ์์ฒญ์ด๋๋ฉด, HTTP ์ํ์ฝ๋ 429๋ฅผ ๋ฐํํ๋ฉฐ, ์ฌ์ฉ์๊ฐ ๋๋ฌด ๋ง์ ์์ฒญ์ ๋ณด๋ด๋ ค๊ณ ํ๋ค(Too many requests)๋ฅผ ์๋ฆฌ๋ ๊ฒ์ด๋ค.

์ผ๋จ API ๊ฒ์ดํธ ์จ์ด=์ฒ๋ฆฌ์จ ์ ํ์ ์ง์ํ๋ ๋ฏธ๋ค์จ์ด ๋ผ๋๊ฑธ ๊ธฐ์ตํ์.
1. ์ฒ๋ฆฌ์จ ์ ํ ์ฅ์น๋ ์ด๋์ ๋์ด์ผํ๋?
2. ์๋ฒ? ๊ฒ์ดํธ์จ์ด?
์์ฉ API ๊ฒ์ดํธ ์จ์ด๋ฅผ ์ฐ๋๊ฒ ํจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ์ผ ๊ฒ์ด๋ค.
์ฒ๋ฆฌ์จ ์ ํ ์๊ณ ๋ฆฌ์ฆ
1. ํ ํฐ ๋ฒํท ์๊ณ ๋ฆฌ์ฆ(Token Bucket)
ํญ๋๊ฒ ์ด์ฉ๋๋ค. ์๋ง์กด ์คํธ๋ผ์ดํ๊ฐ api ์์ฒญ์ ํต์ (throttle) ํ๊ธฐ ์ํด์ ์ด ์๊ณ ๋ฆฌ์ฆ์ ์ด๋ค.

ํ ํฐ ๋ฒํท์ ์ง์ ๋ ์ฉ๋์ ๊ฐ๋ ๊ทธ๋ฆ์ด๋ค. ์ด ๋ฒํท์๋ ์ฌ์ ์ค์ ๋ ์์ ํ ํฐ์ด ์ฃผ๊ธฐ์ ์ผ๋ก ์ฑ์์ง๋ค.
๊ฝ์ฐฌ ๋ฒํท์๋ ๋์ด์ ํ ํฐ์ ์ถ๊ฐ๋์ง ์๋๋ค. ๋ฒํท์ด ๊ฐ๋ ์ฐจ๋ฉด ์ถ๊ฐ๋ก ๊ณต๊ธ๋ ํ ํฐ์ ๋ฒ๋ ค์ง๋ค(overflow)

๊ฐ ์์ฒญ์ด ์ฒ๋ฆฌ๋ ๋๋ง๋ค ํ๋์ ํ ํฐ์ ์ฌ์ฉํ๋ค ์์ฒญ์ด ๋์ฐฉํ๋ฉด ๋ฒํท์ ์ถฉ๋ถํ ํ ํฐ์ด ์๋์ง ๊ฒ์ฌํ๋ค.
- ์ถฉ๋ถํ ํ ํฐ์ด ์๋? ๋ฒํท์์ ํ๋ ํ ํฐ์ ๊บผ๋ด์ ์์ฒญ์ ์์คํ ์ ์ ๋ฌ
- ์ถฉ๋ถํ ํ ํฐ์ด ์๋? ํด๋น ์์ฒญ์ ๋ฒ๋ฆฐ๋ค. (dropped)

ํ ํฐ ๋ฒํท ์๊ณ ๋ฆฌ์ฆ์ 2๊ฐ์ parameter๋ฅผ ๋ฐ๋๋ค.
1. ๋ฒํท์ ํฌ๊ธฐ : ๋ฒํท์ ๋ด๊ธฐ๋ ์ต๋ ํ ํฐ ์
2. ํ ํฐ ๊ณต๊ธ๋ฅ (refill rate) : ์ด๋น ๋ช๊ฐ์ ํ ํฐ์ ์ฑ์ฐ๋๊ฐ?
ํต์์ ์ผ๋ก api endpoint ๋ง๋ค ๋ณ๋ ๋ฒํท์ ๋๋ค. ์๋ฅผ ๋ค์ด์, user๋ ํ๋ฃจ์ ํ๋ฒ ํฌ์คํ ๋๊ณ , ์น๊ตฌ๋ 150๋ช ์ถ๊ฐ๊น์ง๋ง ๋๊ณ , ์ข์์๋ ํ๋ฃจ์ 5๋ฒ๋ง ๋๋ฅผ ์ ์๋ค๋ฉด, user ๋ง๋ค 3๊ฐ์ ํ ํฐ ๋ฒํท์ด ์์ด์ผ ํ๋ค.
IP ์ฃผ์๋ณ๋ก ์ฒ๋ฆฌ์จ ์ ํ ์ ์ฉํด์ผํ๋ค๋ฉด, IP์ฃผ์๋ง๋ค ๋ฒํท์ ํ ๋นํด์ผํ๋ค.
์์คํ ์ฒ๋ฆฌ์จ ์ด๋น 10,000๊ฐ ์์ฒญ์ผ๋ก ์ ํํ๊ณ ์ถ๋ค๋ฉด ๋ชจ๋ ์์ฒญ์ด ํ๋์ ๋ฒํท์ ๊ณต์ ํด๋๋กํด์ผํ๋ค.
- ๊ตฌํ์ด ์ฝ๋ค. ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ํจ์จ์ ์ด๋ค.
- ์งง์ ์๊ฐ ์ง์ค๋๋ ํธ๋ํฝ๋ ์ฒ๋ฆฌ ๊ฐ๋ฅํ๋ค.
- 2๊ฐ์ ์ธ์๋ง์ผ๋ก, ์ ์ ํ ํ๋์ ๊ฐ๋ค๋กญ๋ค.
๋์ถ ๋ฒํท ์๊ณ ๋ฆฌ์ฆ(Leaky bucket)
ํ ํฐ ๋ฒํท ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋น์ทํ์ง๋ง ์์ฒญ ์ฒ๋ฆฌ์จ์ด ๊ณ ์ ๋์ด ์๋ค. ๋ณดํต FIFO ํ๋ก ๊ตฌํํ๋ค.

1. ์์ฒญ์ด ๋์ฐฉํ๋ฉด Queue๊ฐ ๊ฐ๋์ฐจ์๋ ํ์ธํ๋ค. ๋น์๋ฆฌ๊ฐ ์์ผ๋ฉด ํ์ ์์ฒญ์ ์ถ๊ฐํ๋ค.
2. ํ๊ฐ ๊ฐ๋ ์ฐจ์์ผ๋ฉด ์ ์์ฒญ์ ๋ฒ๋ฆฐ๋ค.
3. ์ง์ ๋ ์๊ฐ๋ง๋ค ํ์์ ์์ฒญ์ ๊บผ๋ด์ ์ฒ๋ฆฌํ๋ค.
๋์ถ ๋ฒํท ์๊ณ ๋ฆฌ์ฆ์ 2๊ฐ์ parameter๋ฅผ ๋ฐ๋๋ค.
- ๋ฒํท ํฌ๊ธฐ : ํ ์ฌ์ด์ฆ
- ์ฒ๋ฆฌ์จ(outflow rate) : ์ง์ ๋ ์๊ฐ๋ง๋ค ๋ช๊ฐ์ ์์ฒญ์ ์ง์ ํ๋ค. ๋ณดํต ์ด ๋จ์์ด๋ค.
ํ ํฌ๊ธฐ๊ฐ ์ ํ๋์ด ์์ผ๋ฏ๋ก, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ธก๋ฉด์ด ํจ์จ์ ์ด๋ค. ๊ณ ์ ๋ ์ฒ๋ฆฌ์จ(outflow rate)์ ๊ฐ๊ณ ์์์ผ๋ก stable ์ถ๋ ฅ์ ์ ํฉํ๋ค. ๋จ์๊ฐ์ ํธ๋ํฝ์ด ๋ชฐ๋ฆฌ๋ฉด, ์ต์ ์์ฒญ๋ค์ด ๋ฒ๋ ค์ง๊ณ , ์ค๋๋ ์์ฒญ๋ค์ด ์์ด๊ฒ๋๋ค. 2๊ฐ ์ธ์๋ก ์ฌ๋ฐ๋ฅธ ํ๋์ด ๊น๋ค๋กญ๋ค.
๊ณ ์ ์๋ ์นด์ดํฐ ์๊ณ ๋ฆฌ์ฆ(fixed window counter)
ํ์๋ผ์ธ์ ๊ณ ์ ๋ ๊ฐ๊ฒฉ์ ์๋(window)๋ก ๋๋๊ณ , ๊ฐ ์๋๋ง๋ค ์นด์ดํฐ(counter)๋ฅผ ๋ถ์ธ๋ค.
์์ฒญ์ด ์ ์๋๋ฉด ์นด์ดํฐ ๊ฐ์ 1์ฉ ์ฆ๊ฐํ๋ค.
์นด์ดํฐ ๊ฐ์ด ์ฌ์ ์ ์ค์น๋ ์๊ณ์น ๋๋ฌํ๋ฉด ์๋ก์ด ์์ฒญ์ ์ ์๋๊ฐ ์ด๋ฆด๋ ๊น์ง ๋ฒ๋ ค์ง๋ค.


ํ์๋ผ์ธ์ ๋จ์๊ฐ 1์ด์ผ๋, ์์คํ ์ 1์ด๋น 3๊ฐ ์์ฒญ๋ง ํ์ฉํ๋ค.
๋งค์ด๋ง๋ค ์ด๋ฆฌ๋ ์๋์ฐ์์ 3๊ฐ ์ด์์์ ๋์ด๊ฐ๋ ์์ฒญ๋ค์ ์ฒ๋ฆฌ์จ ์ ํ์ ๊ฑธ๋ ค์ ๋ฒ๋ ค์ง๋ค. ์ด ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ์ฅ ํฐ ๋ฌธ์ ์๋ ๊ฒฝ๊ณ์์ ์๊ฐ์ ์ผ๋ก ๋ง์ ํธ๋ํฝ์ด ์ง์ค๋๋ฉด, ์๋์ ํ ๋น๋ ์๋ณด๋ค ๋ ๋ง์ ์์ฒญ์ด ์ฒ๋ฆฌ๋ ์ ์๋ค๋ ๊ฒ์ด๋ค.
์๋๊ฐ ๋ซํ๋ ์์ ์ ์นด์ดํฐ๋ฅผ ์ด๊ธฐํํ๋ ๋ฐฉ์์ ํน์ ํ ํธ๋ํฝ ํจํด์ ์ฒ๋ฆฌํ๊ธฐ์ ์ ํฉํ๋ค.
์๋ ๊ฒฝ๊ณ์์ ์ผ์์ ์ผ๋ก ๋ง์ ํธ๋ํฝ์ด ๋ชฐ๋ฆฌ๋ฉด, ๊ธฐ๋ํ ์ฒ๋ฆฌํ๋๋ณด๋ค ๋ ๋ง์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ฒ ๋๋ค.
์ด๋ ์๋ ๋ก๊น ์๊ณ ๋ฆฌ์ฆ
์ด ์๊ณ ๋ฆฌ์ฆ์, ๊ณ ์ ์๋ ์นด์ดํฐ ์๊ณ ๋ฆฌ์ฆ์ ์ค๋ํ ๋ฌธ์ ์ธ ๊ฒฝ๊ณ๋ถ๊ทผ์ ํธ๋ํฝ์ด ์ง์ค๋๋ฉด ๊ธฐ๋ํ๊ณ์น๋ณด๋ค ๋ง์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ฒ ๋๋ค๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.

์ด ์ฒ๋ฆฌ์จ ์ ํ๊ธฐ๋ ๋ถ๋น ์ต๋ 2๋ฒ์ ์์ฒญ์ ์ฒ๋ฆฌํ๋ค. ๋ณดํต ๋ก๊ทธ์ ๋ณด๊ด๋๋ ๊ฐ์ ๋ฆฌ๋ ์ค ํ์ ์คํฌํ์ด๋ค.
์๋ก์ด ์์ฒญ์ด 1:00:30 ์ ๋์ฐฉํ๋ฉด, ํด๋น ํ์์คํฌํ ๋ก๊ทธ์ ์ถ๊ฐ๋๋ค.
์ถ๊ฐ ์งํ ๋ก๊ทธ ํฌ๊ธฐ๋ 2๋ฉฐ, ํ์ฉ ํ๋๋ณด๋ค ํฌ์ง ์๊ธฐ ๋๋ฌธ์ ์์ฒญ์ ์์คํ ์ ์ ๋ฌํ๋ค.
์๋ก์ด ์์ฒญ์ด 1:00:50์ ๋์ฐฉํ๋ค. ํด๋น ํ์์คํฌํ๊ฐ ๋ก๊ทธ์ ์ถ๊ฐ๋๋ค.
๋ก๊ทธ ํฌ๊ธฐ๊ฐ 3์ด๋ฏ๋ก, ํ์์คํฌํ๋ ๋ก๊ทธ์ ๋จ์ง๋ง ์์ฒญ์ ๊ฑฐ๋ถ๋๋ค.
1๋ถ ์์ ์๋ ์๋์ฐ ์ดํ์, ์ด์ ์ ๋ง๋ฃ๋ ๋๊ฐ์ ํ์์คํฌํ๋ ๋ก๊ทธ์์ ์ญ์ ํ๋ค. ์ดํ 1:01:40 ์ ์ ๊ท์์ฒญ๊น์ง ์์คํ ์ ์ ๋ฌ๋๋ค.
์ด๋ ์๋ ์นด์ดํฐ ์๊ณ ๋ฆฌ์ฆ (sliding window counter)


๊ณ ์ ์๋ ์นด์ดํฐ ์๊ณ ๋ฆฌ์ฆ + ์ด๋ ์๋ ๋ก๊น ์๊ณ ๋ฆฌ์ฆ์ ํฉํ ๊ฒ์ด๋ค.
์ฒ๋ฆฌ์จ ์ ํ ์ฅ์น์ ํ๋๊ฐ ๋ถ๋น 7๊ฐ ๋ก ์ค์ ๋์ด์๋ค. ์ด์ 1๋ถ๋์ 5๊ฐ ์์ฒญ, ํ์ฌ 1๋ถ ๋์ 3๊ฐ ์์ฒญ์ด ๋ค์ด์๋ค๊ณ ์น์,
ํ์ฌ 1๋ถ์ 30% ์์ ์ ๋์ฐฉํ ์ ์์ฒญ์, ํ์ฌ ์๋์ ๋ช๊ฐ ์์ฒญ์ด ์จ๊ฒ์ผ๋ก ๋ณด๊ณ ์ฒ๋ฆฌํด์ผํ๋?
๊ฐ๋ต์ ์ธ ์ํคํ ์ฒ
์ฒ๋ฆฌ์จ ์ ํ ์๊ณ ๋ฆฌ์ฆ์ ๊ธฐ๋ณธ ์์ด๋์ด๋, ๊ฒฐ๊ตญ ์ผ๋ง๋ ๋ง์ ์์ฒญ์ด ์ ์๋์๋์ง ์ถ์ ํ๋ ์นด์ดํฐ๋ฅผ ์ถ์ ๋์๋ณ๋ก ๋๊ณ
(User๋ณ? IP๋ณ? API ์๋ํฌ์ธํธ๋ณ? ์ด ์๋น์ค ๋จ์๋ก?), ์นด์ดํฐ ๊ฐ์ด ํ์ฉ ํ๋๋ฅผ ๋์ด์๋ฉด, ๋์ด์ ์์ฒญ์ ๊ฑฐ๋ถํ๋๊ฑฐ๋ค.
์นด์ดํฐ ๊ฐ์ ๋ณด๊ด์ ๋ฉ๋ชจ๋ฆฌ ์์์ ์บ์๊ฐ ๋ฐ๋์งํ๋ค. ๋น ๋ฅด๊ณ , ์๊ฐ์ ๊ธฐ๋ฐํ ๋ง๋ฃ ์ ์ฑ ์ ์ง์ํ๊ธฐ ๋๋ฌธ์ด๋ค.

Redis[11] ๋ ์ฒ๋ฆฌ์จ ์ ํ ์ฅ์น ๊ตฌํ์ ์์ฃผ ์ฌ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ ์ ์ฅ ์ฅ์น๋ค.
- INCR: ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ์นด์ดํฐ ๊ฐ์ 1์ฉ ์ฆ๊ฐํ๋ค.
- EXPIRE: ์นด์ดํฐ์ ํ์์์ ๊ฐ์ ์ค์ ํ๋ค. ์ค์ ๋ ์๊ฐ์ด์ง๋๋ฉด ์นด์ดํฐ๋ ์๋ ์ญ์ ๋๋ค.
ํด๋ผ์ด์ธํธ๊ฐ Rate Limiting Middleware์ ์์ฒญ์ ๋ณด๋ธ๋ค.
๋ฏธ๋ค์จ์ด๋๋ ๋์ค ์ง์ ๋ฒํท์์ ์นด์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ํ๋์ ๋๋ฌํ๋์ง ์๊ณ ๋ฆฌ์ฆ๊ธฐ๋ฐ ์ฒดํนํ๋ค.
ํ๋ ์ดํ๋ฉด ์์ฒญ์ api์๋ฒ์ ์ ๋ฌํ๋ค. ๋ฏธ๋ค์จ์ด๋ ์นด์ดํฐ ๊ฐ์ ์ฆ๊ฐ์ํค๊ณ ๋ค์ ๋ ๋์ค์ ์ ์ฅํ๋ค.
3๋จ๊ณ : ์์ธ ์ค๊ณ
์ฒ๋ฆฌ์จ ์ ํ ๊ท์น
๋ฆฌํํธ(Lyft)๋ ์ฒ๋ฆฌ์จ ์ ํ์ ์คํ์์ค๋ฅผ ์ฌ์ฉํ๋ค. [12]


์ด๋ฐ ๊ท์น๋ค์ ๋ณดํต ์ค์ ํ์ผ(Configuration file)ํํ๋ก ๋์คํฌ์ ์ ์ฅ๋๋ค.
์ฒ๋ฆฌ์จ ํ๋ ์ด๊ณผ ํธ๋ํฝ์ ์ฒ๋ฆฌ
์์ฒญ์ด ํ๋ ์ ํ์ ๊ฑธ๋ฆฌ๋ฉด API ๋ HTTP์๋ต 429๋ฅผ ํด๋ผ์ด์ธํธํํ ๋ณด๋ธ๋ค.
์ฒ๋ฆฌ์จ ์ ํ ์ฅ์น๊ฐ ์ฌ์ฉํ๋ HTTPํค๋
์ฌ์ฉ์๊ฐ ๋๋ฌด ๋ง์ ์์ฒญ์ ๋ณด๋ด์ 429 too many request ์ค๋ฅ๋ฅผ X-Ratelimit-Retry-After ํค๋์ ํจ๊ป ๋ฐํํ๋๋กํ๋ค.
- X-Ratelimit-Remaining: ์๋ ๋ด์ ๋จ์ ์ฒ๋ฆฌ ๊ฐ๋ฅ ์์ฒญ์ ์
- X-Ratelimit-Limit : ๋งค ์๋๋ง๋ค ํด๋ผ์ด์ธํธ๊ฐ ์ ์กํ ์ ์๋ ์์ฒญ์ ์
- X-Ratelimit-Retry-After : ํ๋ ์ ํ์ ๊ฑธ๋ฆฌ์ง ์์ผ๋ ค๋ฉด ๋ช ์ด ๋ค์ ์์ฒญ์ ๋ค์ ๋ณด๋ด์ผ ํ๋์ง ์๋ฆผ
์ฒ๋ฆฌ์จ ์ ํ ๊ท์น์ ๋์คํฌ์ ๋ณด๊ดํ๋ค.
์์ ํ๋ก์ธ์ค(worker)๋ ์์๋ก ๊ท์น์ ๋์คํฌ์ ์ฝ์ด์ ์บ์์ ์ ์ฅํ๋ค.

ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ์ ์๋ฒ์ ๋ณด๋ด๋ฉด ์์ฒญ์ ๋จผ์ ์ฒ๋ฆฌ์จ ์ ํ ๋ฏธ๋ค์จ์ด์ ๋๋ฌํ๋ค.
์ ํ ๊ท์น์ ์บ์์์ ๊ฐ์ ธ์จ๋ค. ์นด์ดํฐ ๋ฐ ํ์์คํฌํ๋ฅผ ๋ ๋์ค ์บ์์์ ๊ฐ์ ธ์จ๋ค.
๊ฐ์ ธ์จ ๊ฐ๋ค์ ๊ทผ๊ฑฐํด์ ํด๋น ๋ฏธ๋ค์จ์ด๋ ์๋ ๊ฒฐ์ ์ ํ๋ค.
- ์ ํ์ ๊ฑธ๋ฆฌ์ง ์์ผ๋ฉด api ์๋ฒ๋ก ์์ฒญ์ ๋ณด๋ธ๋ค. - ์ ํ์ ๊ฑธ๋ฆฌ๋ฉด, 429 ์๋ฌ๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ๋ณด๋ธ๋ค.
- ์์ฒญ์ ๊ทธ๋๋ก ๋ฒ๋ฆด์๋ ์๊ณ , ๋ฉ์ธ์ง ํ์ ๋ณด๊ดํ ์๋ ์๋ค. (option 1,2)
๋ถ์ฐ ํ๊ฒฝ์์์ ์ฒ๋ฆฌ์จ ์ ํ ์ฅ์น์ ๊ตฌํ
๋จ์ผ ์๋ฒ์์ ์ง์ํ๋ ์ฒ๋ฆฌ์จ ์ ํ์ฅ์น ๊ตฌํ์ ์ฝ๋ค.
์ฌ๋ฌ ๋์ ์๋ฒ์ ๋ณ๋ ฌ ์ค๋ ๋๋ฅผ ์ง์ํ๋ ์์คํ ์ ํ์ฅํ๋๊ฑด 2๊ฐ ๋ฌธ์ ๋ฅผ ๋ ํ์ด์ผํ๋ค.
1. ๊ฒฝ์ ์กฐ๊ฑด(race condition)
- ๋ ๋์ค์์ ์นด์ดํฐ ๊ฐ์ ์ฝ๋๋ค
- ์นด์ดํฐ๊ฐ ์๊ณ์น๋ฅผ ๋๋์ง ๋ณธ๋ค.
- ์๋์ผ๋ฉด, ๋ ๋์ค์ ๋ณด๊ด๋ ์นด์ดํฐ ๊ฐ์ 1 ์ฆ๊ฐ์ํจ๋ค. ๋ณํ์ฑ์ด ์ฌํ๋ฉด, ์๋์ ๊ฒฝ์ ์กฐ๊ฑด ์ด์๊ฐ ๋ฐ์ํ๋ค.

๊ฐ์ฅ ๋๋ฆฌ ์๋ ค์ง ํด๊ฒฐ์ ๋ฝ(lock)์ด์ง๋ง, ์์คํ ์ฑ๋ฅ์ ๋งค์ฐ ๋จ์ด๋จ๋ฆฌ๋ ๋ฌธ์ ๊ฐ ์๋ค.
๋ฃจ์ ์คํฌ๋ฆฝํธ(Lua Script [13]), ์ ๋ ฌ ์งํฉ(sorted set) ์ด๋ผ๋ ๋ ๋์ค ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฐ๋ ๊ฒ ์ด๋ค.[8]
2. ๋๊ธฐํ(synchronization)
์น ๊ณ์ธต์ ๋ฌด์ํ(stateless)์ด๋ฏ๋ก, ํด๋ผ์ด์ธํธ๋ ์ค๋ฅธ์ชฝ ๊ทธ๋ฆผ์ฒ๋ผ, ๊ฐ๊ธฐ ๋ค๋ฅธ ์ ํ์ฅ์น๋ก ์์ฒญ์ ๋ณด๋ด๊ฒ ๋ ์๋ ์๋ค.
์ด๋ ์ฒ๋ฆฌ์จ ์ ํ์ฅ์น1์ ํด๋ผ์ด์ธํธ2์ ๋ํด์ ์๋ฌด๊ฒ๋ ๋ชจ๋ฅด๋ฉด, ์ฒ๋ฆฌ์จ ์ ํ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ํํ ์ ์๋ค.
๊ณ ์ ์ธ์ (sticky session)์ ํ์ฉํด์, ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์์ฒญ์ด ํญ์ ๊ฐ์ ์ฒ๋ฆฌ์จ ์ ํ์ฅ์น๋ก ๋ณด๋ด๊ฒ ํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
์ ์ฐํ์ง ์์ผ๋ฏ๋ก ๋ณ๋ก ์ถ์ฒ๋์ง๋ ์๋๋ค.

๋ ๊ฐ์ ๋ ๋ฐฉ๋ฒ์ผ๋ก๋, ๋ ๋์ค์ ๊ฐ์ ์ค์ ์ง์คํ ๋ฐ์ดํฐ ์ ์ฅ์๋ฅผ ์ฐ๋ ๊ฒ์ด๋ค.

์ฑ๋ฅ ์ต์ ํ
๋ฐ์ดํฐ ์ผํฐ์์ ๋ฉ๋ฆฌ ๋จ์ด์ง ์ฌ์ฉ์๋ฅผ ์ง์ํ๋ ค๋ค ๋ณด๋ฉด ์ง์ฐ์๊ฐ์ด์ฆ๊ฐ ํ ์๋ฐ์ ์๋ค.
๋๋ถ๋ถ์ ํด๋ผ์ฐ๋ ์ฌ์ ์๋ ์ธ๊ณ ๊ณณ๊ณณ์ edge server๋ฅผ ์ฌ๋๋ค.
๋๋ฒ์งธ๋ก ์ ํ ์ฅ์น ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋๊ธฐํํ ๋ ์ต์ข ์ผ๊ด์ฑ(eventual consistency model)์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. (6์ฅ ๋ฐ์ดํฐ์ผ๊ด์ฑ)
๋ชจ๋ํฐ๋ง
ํจ๊ณผ์ ์ผ๋ก ๋์ํ๊ณ ์๋์ง ๋ณด๊ธฐ์ํด์ ๋ฐ์ดํฐ๋ฅผ ๋ชจ์ ํ์๊ฐ ์๋ค.
- ์ฑํํ ์ฒ๋ฆฌ์จ ์ ํ ์๊ณ ๋ฆฌ์ฆ์ด ํจ๊ณผ์ ์ธ๊ฐ?
- ์ ์ํ ์ฒ๋ฆฌ์จ ์ ํ ๊ท์น์ด ํจ๊ณผ์ ์ธ๊ฐ?
ex) ๊น์ง ์ธ์ผ ์ด๋ฒคํธ๋ก ํธ๋ํฝ์ด ๊ธ์ฆํ๋ ๊ธฐ๊ฐ์ด๋ฉด, ์ ์ ํ ํฐ ๋ฒํท์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ฐ๊พผ๋ค.
4๋จ๊ณ : ๋ง๋ฌด๋ฆฌ
์์ฒญํ์ ๋ ์ด๋ฏธ์ง์ ํ ์คํธ๋ฅผ ๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ๊ธฐ ์ฝ๊ฒ ์ ๋ฆฌํด ๋๋ฆฝ๋๋ค.
- ๊ฒฝ์ฑ(hard) ๋๋ ์ฐ์ฑ(soft) ์ฒ๋ฆฌ์จ ์ ํ
- ๊ฒฝ์ฑ ์ฒ๋ฆฌ์จ ์ ํ: ์์ฒญ์ ๊ฐ์๋ ์๊ณ์น๋ฅผ ์ ๋ ๋์ด์ค ์ ์๋ค.
- ์ฐ์ฑ ์ฒ๋ฆฌ์จ ์ ํ: ์์ฒญ ๊ฐ์๋ ์ ์ ๋์์ ์๊ณ์น๋ฅผ ๋์ด์ค ์ ์๋ค.
- ๋ค์ํ ๊ณ์ธต์์์ ์ฒ๋ฆฌ์จ ์ ํ
- ์ด๋ฒ ์ฅ์์๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ณ์ธต(HTTP: OSI ๋คํธ์ํฌ ๊ณ์ธต๋ ๊ธฐ์ค์ผ๋ก 7๋ฒ ๊ณ์ธต)์์์ ์ฒ๋ฆฌ์จ ์ ํ์ ๋ํด์๋ง ์ดํด๋ณด์๋ค. ํ์ง๋ง ๋ค๋ฅธ ๊ณ์ธต์์๋ ์ฒ๋ฆฌ์จ ์ ํ์ด ๊ฐ๋ฅํ๋ค. ์๋ฅผ ๋ค์ด, Iptables๋ฅผ ์ฌ์ฉํ๋ฉด IP ์ฃผ์(IP๋ OSI ๊ธฐ์ค์ผ๋ก 3๋ฒ ๊ณ์ธต)์ ์ฒ๋ฆฌ์จ ์ ํ์ ์ ์ฉํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค. [15] ์ฐธ๊ณ ๋ก OSI๋ Open Systems Interconnection model์ ์ฝ์ด๋ก, ์ด 7๊ฐ์ ๊ณ์ธต์ผ๋ก ๊ตฌ์ฑ๋๋ค. [16] 1๋ฒ ๊ณ์ธต์ ๋ฌผ๋ฆฌ(physical) ๊ณ์ธต, 2๋ฒ ๊ณ์ธต์ ๋ฐ์ดํฐ ๋งํฌ(data link) ๊ณ์ธต, 3๋ฒ์ ๋คํธ์ํฌ ๊ณ์ธต, 4๋ฒ์ ์ ์ก(transport) ๊ณ์ธต, 5๋ฒ์ ์ธ์ (session) ๊ณ์ธต, 6๋ฒ์ ํํ(presentation) ๊ณ์ธต, ๊ทธ๋ฆฌ๊ณ 7๋ฒ์ ์ ํ๋ฆฌ์ผ์ด์ ๊ณ์ธต์ด๋ค.
- ์ฒ๋ฆฌ์จ ์ ํ์ ํํผํ๋ ๋ฐฉ๋ฒ. ํด๋ผ์ด์ธํธ๋ฅผ ์ด๋ป๊ฒ ์ค๊ณํ๋ ๊ฒ์ด ์ต์ ์ธ๊ฐ?
- ํด๋ผ์ด์ธํธ ์ธก ์บ์๋ฅผ ์ฌ์ฉํ์ฌ API ํธ์ถ ํ์๋ฅผ ์ค์ธ๋ค.
- ์ฒ๋ฆฌ์จ ์ ํ์ ์๊ณ์น๋ฅผ ์ดํดํ๊ณ , ์งง์ ์๊ฐ ๋์ ๋๋ฌด ๋ง์ ๋ฉ์์ง๋ฅผ ๋ณด๋ด์ง ์๋๋ก ํ๋ค.
- ์์ธ๋ ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ๋ ์ฝ๋๋ฅผ ๋์ ํ์ฌ ํด๋ผ์ด์ธํธ๊ฐ ์์ธ์ ์ํฉ์ผ๋ก๋ถํฐ ์ฐ์ํ๊ฒ(gracefully) ๋ณต๊ตฌ๋ ์ ์๋๋ก ํ๋ค.
- ์ฌ์๋(retry) ๋ก์ง์ ๊ตฌํํ ๋๋ ์ถฉ๋ถํ ๋ฐฑ์คํ(back-off) ์๊ฐ์ ๋๋ค.
4์ฅ๊น์ง ์ฑ๊ณต์ ์ผ๋ก ๋ง์น ์ฌ๋ฌ๋ถ, ์ถํํ๋ค. ๋ฉ์ง๊ฒ ๋ง๋ฌด๋ฆฌํ ์ค์ค๋ก๋ฅผ ๋ง์๊ป ๊ฒฉ๋ คํ๋๋ก ํ์!
์ฐธ๊ณ ๋ฌธํ
[1] Rate-limiting strategies and techniques: https://cloud.google.com/solutions/rate-limiting-strategies-techniques
[2] Twitter rate limits: https://developer.twitter.com/en/docs/basics/rate-limits
[3] Google docs usage limits: https://developers.google.com/docs/api/limits
[4] IBM microservices: https://www.ibm.com/cloud/learn/microservices
[5] Throttle API requests for better throughput: https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-request-throttling.html
[6] Stripe rate limiters: https://stripe.com/blog/rate-limiters
[7] Shopify REST Admin API rate limits: https://help.shopify.com/en/api/reference/rest-admin-api-rate-limits
[8] Better Rate Limiting With Redis Sorted Sets: https://engineering.classdojo.com/blog/2015/02/06/rolling-rate-limiter/
[9] System Design - Rate limiter and Data modelling: https://medium.com/@saisandeepmopuri/system-design-rate-limiter-and-data-modelling-9304b0d18250
[10] How we built rate limiting capable of scaling to millions of domains: https://blog.cloudflare.com/counting-things-a-lot-of-different-things/
[11] Redis website: https://redis.io/
[12] Lyft rate limiting: https://github.com/lyft/ratelimit
[13] Scaling your API with rate limiters: https://stripe.com/blog/rate-limiters
[14] What is edge computing: https://www.cloudflare.com/learning/serverless/glossary/what-is-edge-computing
[15] Rate Limit Requests with Iptables: https://blog.programster.org/rate-limit-requests-with-iptables
[16] OSI model: https://en.wikipedia.org/wiki/OSI_model#Layer_architecture
What Is Edge Computing?
Edge computing brings computation closer to the network edge, optimizing IoT devices and web applications. Learn how edge devices can cut costs and reduce latency.
www.cloudflare.com
Redis - Real-time data for agents & apps
Developers love Redis. Unlock the full potential of the Redis database with Redis Enterprise and start building blazing fast apps.
redis.io
Think Topics | IBM
Access explainer hub for content crafted by IBM experts on popular tech topics, as well as existing and emerging technologies to leverage them to your advantage
www.ibm.com
์ฌ์ฉ๋ ํ๋ | Google Docs | Google for Developers
Google uses AI technology to translate content into your preferred language. AI translations can contain errors. ์๊ฒฌ ๋ณด๋ด๊ธฐ ์ฌ์ฉ๋ ํ๋ ์ปฌ๋ ์ ์ ์ฌ์ฉํด ์ ๋ฆฌํ๊ธฐ ๋ด ํ๊ฒฝ์ค์ ์ ๊ธฐ์ค์ผ๋ก ์ฝํ ์ธ ๋ฅผ ์ ์ฅํ๊ณ ๋ถ๋ฅํ์ธ
developers.google.com
'๐ฉโ๐ปDeveloper ๐ก > ๐พBack-end๐๏ธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| URL ๋จ์ถ๊ธฐ ์ค๊ณ (1) | 2026.06.20 |
|---|---|
| ๋ถ์ฐ ์์คํ ์ ์ํ ์ ์ผ ID ์์ฑ๊ธฐ ์ค๊ณ (0) | 2026.06.20 |
| ๐ ์์คํ ๋์์ธ & AI ํ์ดํ๋ผ์ธ ํ์ต ์ง๋ํ (0) | 2026.06.20 |
| ๐ย ์์คํ ย ๋์์ธย &ย AIย ํ์ดํ๋ผ์ธย ํ์ตย ์ง๋ํ (0) | 2026.06.20 |
| 2์ฅ ๊ฐ๋ต์ ์ธ ๊ท๋ชจ ์ถ์ (0) | 2026.06.19 |