WebSocket Auto Scaling.md - 100-hours-a-week/KTB4-17th-wiki GitHub Wiki

WebSocket Auto Scaling ์„ ์ • ๊ทผ๊ฑฐ

WebSocket Auto Scaling

Task ์ŠคํŽ™: 0.5 vCPU / 1 GiB

๊ฒฐ์ •

WebSocket์€ Task๋‹น 4,000 Connections๋ฅผ ์šด์˜ ๊ธฐ์ค€์œผ๋กœ Target Tracking์„ ์ ์šฉํ•œ๋‹ค.

Task๋‹น ๋™์‹œ Connection ์ˆ˜๋ฅผ Primary Metric์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ , ๋™์ผํ•œ Connection ์ˆ˜์—์„œ๋„ ์—ฐ๊ฒฐ๋ณ„ ์ƒํƒœ ๋ฐ ์ฒ˜๋ฆฌ๋Ÿ‰์— ๋”ฐ๋ผ Memory๊ฐ€ ๋จผ์ € ์ฆ๊ฐ€ํ•˜๋Š” ์ƒํ™ฉ์— ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•ด Memory 70%๋ฅผ Secondary Metric์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

์ฒ˜๋ฆฌ๋Ÿ‰ ๊ธฐ์ค€ ์˜ˆ์ƒ ํ”ผํฌ Task๋Š” 4๊ฐœ์ด๋ฉฐ, ๊ฐ€์šฉ์„ฑ์„ ์œ„ํ•ด ์ตœ์†Œ 2๊ฐœ์˜ Task๋ฅผ ์œ ์ง€ํ•œ๋‹ค.

Scale-Out Cooldown์€ 60์ดˆ, Scale-In Cooldown์€ 300์ดˆ๋ฅผ ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

ํ•ญ๋ชฉ ์„ค์ •
Primary 4,000 Connections/Task
Secondary Memory 70%
Min Task 2
์˜ˆ์ƒ Peak Task 4
Max Task 8
Scale-Out Cooldown 60์ดˆ
Scale-In Cooldown 300์ดˆ

ECS์—์„œ๋Š” Task๋‹น WebSocket Connection ์ˆ˜๋ฅผ ๊ธฐ๋ณธ Scaling Metric์œผ๋กœ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, Connection ์ˆ˜๋ฅผ CloudWatch Custom Metric์œผ๋กœ ์ˆ˜์ง‘ํ•˜์—ฌ Target Tracking์— ์‚ฌ์šฉํ•œ๋‹ค.

์„ ์ • ๊ทผ๊ฑฐ

Task 1๊ฐœ์˜ ๋™์‹œ ์—ฐ๊ฒฐ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด WebSocket ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜์˜€๋‹ค.

Connections Memory Memory % CPU p95 p99
1,000 336 MiB 32.8% 16.8% 5.9 ms 8.3 ms
2,000 473 MiB 46.2% 20.8% 5.2 ms 7.4 ms
3,000 559 MiB 54.6% 24.8% 5.1 ms 7.5 ms
4,000 709 MiB 69.2% 30.3% 5.2 ms 7.0 ms
5,000 799 MiB 78.0% 37.1% 6.3 ms 282.3 ms
6,300 832 MiB 81.3% 38.5% 6.1 ms 311.6 ms

4,000 Connections๊นŒ์ง€๋Š” p99๊ฐ€ ์•ˆ์ •์ ์œผ๋กœ ์œ ์ง€๋˜์—ˆ์ง€๋งŒ, 5,000 Connections๋ถ€ํ„ฐ p99๊ฐ€ 282.3ms๋กœ ์ฆ๊ฐ€ํ•˜์˜€๋‹ค.

๋”ฐ๋ผ์„œ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์ „์ธ 4,000 Connections๋ฅผ Task 1๊ฐœ์˜ ์šด์˜ ๊ธฐ์ค€์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

Memory๋Š” Connection ์ฆ๊ฐ€์— ๋”ฐ๋ผ ์ฆ๊ฐ€ํ–ˆ์ง€๋งŒ Connection ๊ฐ์†Œ ์‹œ ๋™์ผํ•˜๊ฒŒ ๊ฐ์†Œํ•˜์ง€ ์•Š์•˜๋‹ค.

์ƒํƒœ Connection Memory
ํ”ผํฌ ํ…Œ์ŠคํŠธ ์ข…๋ฃŒ ํ›„ 0 824 MiB
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์žฌ์‹œ์ž‘ ํ›„ 0 164 MiB

JVM์ด ํ™•๋ณดํ•œ Heap์„ ์ฆ‰์‹œ OS์— ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Connection ์ˆ˜๊ฐ€ ๊ฐ์†Œํ•˜๋”๋ผ๋„ Memory ์‚ฌ์šฉ๋Ÿ‰์ด ํ•จ๊ป˜ ๊ฐ์†Œํ•œ๋‹ค๊ณ  ๋ณด์žฅํ•˜๊ธฐ ์–ด๋ ต๋‹ค.

๋”ฐ๋ผ์„œ Memory๋ฅผ ์—ฐ๊ฒฐ ๋ถ€ํ•˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” Primary Metric์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋‹ค๋งŒ ๋™์ผํ•œ Connection ์ˆ˜์—์„œ๋„ ์—ฐ๊ฒฐ๋ณ„ ์ƒํƒœ ๋ฐ ์ฒ˜๋ฆฌ๋Ÿ‰์— ๋”ฐ๋ผ Memory ์‚ฌ์šฉ๋Ÿ‰์ด ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ Memory 70%๋ฅผ Secondary Metric์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

4,000 Connections์—์„œ Memory ์‚ฌ์šฉ๋ฅ ์ด 69.2%, ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•œ 5,000 Connections์—์„œ 78.0%์˜€๊ธฐ ๋•Œ๋ฌธ์— 70%๋ฅผ ์ดˆ๊ธฐ ์šด์˜๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

ํ˜„์žฌ ์˜ˆ์ƒ ๋™์‹œ ์ ‘์†์ž๋Š” ํ‰๊ท  2,333๋ช…, ํ”ผํฌ 12,598๋ช…์ด๋‹ค.

ํ‰๊ท : 2,333 / 4,000 = 0.58 Task

ํ”ผํฌ: 12,598 / 4,000 = 3.15 โ†’ 4 Tasks

์ฒ˜๋ฆฌ๋Ÿ‰๋งŒ ๊ณ ๋ คํ•˜๋ฉด ํ‰์ƒ์‹œ 1 Task๋กœ๋„ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๊ฐ€์šฉ์„ฑ์„ ์œ„ํ•ด Min Task๋Š” 2๊ฐœ๋กœ ์„ค์ •ํ•œ๋‹ค.

์˜ˆ์ƒ ํ”ผํฌ์—๋Š” 4๊ฐœ์˜ Task๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ, ํ˜„์žฌ ์„œ๋น„์Šค์˜ ์„ฑ์žฅ์— ๋Œ€ํ•œ ์—ฌ์œ ๋ฅผ ๋‘์–ด ์˜ˆ์ƒ Peak Task์˜ 2๋ฐฐ์ธ 8๊ฐœ๋ฅผ Max Task๋กœ ์„ค์ •ํ•œ๋‹ค.

Cooldown

Scale-Out Cooldown์€ 60์ดˆ๋ฅผ ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

ํŠธ๋ž˜ํ”ฝ ์ฆ๊ฐ€ ์‹œ ๋น ๋ฅด๊ฒŒ Capacity๋ฅผ ํ™•๋ณดํ•˜๋ฉด์„œ ์ด์ „ Scale-Out์˜ ์˜ํ–ฅ์ด Metric์— ๋ฐ˜์˜๋  ์‹œ๊ฐ„์„ ํ™•๋ณดํ•˜๊ธฐ ์œ„ํ•œ ์ดˆ๊ธฐ๊ฐ’์ด๋ฉฐ, ์‹ค์ œ Task ์ƒ์„ฑ ๋ฐ Connection ๋ถ„์‚ฐ ์‹œ๊ฐ„์„ ์ธก์ •ํ•œ ์ดํ›„ ์กฐ์ •ํ•œ๋‹ค.

Scale-In์€ Target Tracking์˜ ๊ธฐ๋ณธ ๋™์ž‘์„ ์‚ฌ์šฉํ•œ๋‹ค.

WebSocket์€ Task๊ฐ€ ์ œ๊ฑฐ๋  ๊ฒฝ์šฐ ๊ธฐ์กด Connection์ด ๋‹ค๋ฅธ Task๋กœ ์ž๋™ ์ด์ „๋˜์ง€ ์•Š๊ณ  ํด๋ผ์ด์–ธํŠธ์˜ ์žฌ์—ฐ๊ฒฐ์ด ํ•„์š”ํ•˜๋ฏ€๋กœ, ์—ฐ๊ฒฐ ์ข…๋ฃŒ๋กœ ์ธํ•œ ์‚ฌ์šฉ์ž ์˜ํ–ฅ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด Scale-In์„ Scale-Out๋ณด๋‹ค ๋ณด์ˆ˜์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•œ๋‹ค.

๋”ฐ๋ผ์„œ Scale-In Cooldown์€ 300์ดˆ๋ฅผ ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ