๐Ÿ”ฅ_๊ณ ๋™์‹œ์„ฑ_ํ”„๋ ˆ์ž„์›Œํฌ_์„ ํƒ_๊ธฐ์ˆ _๊ฒฐ์ •[20251230135344]

๋ฐœํ–‰: (2025๋…„ 12์›” 30์ผ ์˜คํ›„ 10:53 GMT+9)
12 min read
์›๋ฌธ: Dev.to

Source: Dev.to

๐Ÿ’ก ์‹ค์ œ ์šด์˜ ํ™˜๊ฒฝ์—์„œ์˜ ๋„์ „ ๊ณผ์ œ

์šฐ๋ฆฌ์˜ ์ „์ž์ƒ๊ฑฐ๋ž˜ ํ”Œ๋žซํผ ์žฌ๊ตฌ์ถ• ํ”„๋กœ์ ํŠธ(โ‰ˆ1์ฒœ๋งŒ ์ผ์ผ ํ™œ์„ฑ ์‚ฌ์šฉ์ž)์—์„œ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ „ํ˜•์ ์ธ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์— ๋ฐ˜๋ณต์ ์œผ๋กœ ์ง๋ฉดํ–ˆ์Šต๋‹ˆ๋‹ค:

์‹œ๋‚˜๋ฆฌ์˜ค์„ค๋ช…
๐Ÿ›’ ํ”Œ๋ž˜์‹œ ์„ธ์ผ๋Œ€๊ทœ๋ชจ ํ”„๋กœ๋ชจ์…˜(์˜ˆ: ๋“€์–ผโ€ฏ11) ๊ธฐ๊ฐ„ ๋™์•ˆ ์ œํ’ˆ ์ƒ์„ธ ํŽ˜์ด์ง€๊ฐ€ ์ดˆ๋‹น ์ˆ˜์‹ญ๋งŒ ๊ฑด์˜ ์š”์ฒญ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋™์‹œ ์ฒ˜๋ฆฌ์™€ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์— ํฐ ๋ถ€๋‹ด์„ ์ค๋‹ˆ๋‹ค.
๐Ÿ’ณ ๊ฒฐ์ œ ์‹œ์Šคํ…œ๊ฒฐ์ œ ์„œ๋น„์Šค๋Š” ๋‹จ๊ธฐ๊ฐ„ ์—ฐ๊ฒฐ์„ ๋Œ€๋Ÿ‰์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋ฉฐ, ๊ฐ๊ฐ ๋น ๋ฅธ ์‘๋‹ต์„ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์—ฐ๊ฒฐ ๊ด€๋ฆฌ ํšจ์œจ์„ฑ๊ณผ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋Šฅ๋ ฅ์„ ์‹œํ—˜ํ•ฉ๋‹ˆ๋‹ค.
๐Ÿ“Š ์‹ค์‹œ๊ฐ„ ํ†ต๊ณ„์‚ฌ์šฉ์ž ํ–‰๋™ ๋ฐ์ดํ„ฐ์˜ ์‹ค์‹œ๊ฐ„ ์ง‘๊ณ„๋Š” ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์ฒ˜๋ฆฌ๋Ÿ‰๊ณผ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์— ์••๋ ฅ์„ ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Š ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ ์„ฑ๋Šฅ ๋ฐ์ดํ„ฐ ๋น„๊ต

๐Ÿ”“ Keepโ€‘Alive ํ™œ์„ฑํ™” (Longโ€‘Connection ์‹œ๋‚˜๋ฆฌ์˜ค)

Longโ€‘connection ํŠธ๋ž˜ํ”ฝ์€ ์ „์ฒด ์š”์ฒญ์˜ **>โ€ฏ70โ€ฏ%**๋ฅผ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค.

1๏ธโƒฃ wrk ์ŠคํŠธ๋ ˆ์Šค ํ…Œ์ŠคํŠธ โ€“ Productโ€‘Detail ํŽ˜์ด์ง€ ์ ‘๊ทผ

FrameworkQPSAvgโ€ฏLatencyP99โ€ฏLatencyMemoryCPU
Tokio340,130.921.22โ€ฏms5.96โ€ฏms128โ€ฏMB45โ€ฏ%
Hyperlane334,888.273.10โ€ฏms13.94โ€ฏms96โ€ฏMB42โ€ฏ%
Rocket298,945.311.42โ€ฏms6.67โ€ฏms156โ€ฏMB48โ€ฏ%
Rust std lib291,218.961.64โ€ฏms8.62โ€ฏms84โ€ฏMB44โ€ฏ%
Gin242,570.161.67โ€ฏms4.67โ€ฏms112โ€ฏMB52โ€ฏ%
Go std lib234,178.931.58โ€ฏms1.15โ€ฏms98โ€ฏMB49โ€ฏ%
Node std lib139,412.132.58โ€ฏms837.62โ€ฏยตs186โ€ฏMB65โ€ฏ%

2๏ธโƒฃ ab ์ŠคํŠธ๋ ˆ์Šค ํ…Œ์ŠคํŠธ โ€“ ๊ฒฐ์ œ ์š”์ฒญ

FrameworkQPSAvgโ€ฏLatencyErrorโ€ฏRateThroughputConnโ€ฏSetup
Hyperlane316,211.633.162โ€ฏms0โ€ฏ%32,115.24โ€ฏKB/s0.3โ€ฏms
Tokio308,596.263.240โ€ฏms0โ€ฏ%28,026.81โ€ฏKB/s0.3โ€ฏms
Rocket267,931.523.732โ€ฏms0โ€ฏ%70,907.66โ€ฏKB/s0.2โ€ฏms
Rust std lib260,514.563.839โ€ฏms0โ€ฏ%23,660.01โ€ฏKB/s21.2โ€ฏms
Go std lib226,550.344.414โ€ฏms0โ€ฏ%34,071.05โ€ฏKB/s0.2โ€ฏms
Gin224,296.164.458โ€ฏms0โ€ฏ%31,760.69โ€ฏKB/s0.2โ€ฏms
Node std lib85,357.1811.715โ€ฏms81.2โ€ฏ%4,961.70โ€ฏKB/s33.5โ€ฏms

๐Ÿ”’ Keepโ€‘Alive ๋น„ํ™œ์„ฑํ™” (Shortโ€‘Connection ์‹œ๋‚˜๋ฆฌ์˜ค)

Shortโ€‘connection ํŠธ๋ž˜ํ”ฝ์€ ์ „์ฒด ๋ถ€ํ•˜์˜ **โ‰ˆโ€ฏ30โ€ฏ%**๋ฅผ ์ฐจ์ง€ํ•˜์ง€๋งŒ ๊ฒฐ์ œ, ๋กœ๊ทธ์ธ ๋“ฑ์— ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

1๏ธโƒฃ wrk ์ŠคํŠธ๋ ˆ์Šค ํ…Œ์ŠคํŠธ โ€“ ๋กœ๊ทธ์ธ ์š”์ฒญ

FrameworkQPSAvgโ€ฏLatencyConnโ€ฏSetupMemoryErrorโ€ฏRate
Hyperlane51,031.273.51โ€ฏms0.8โ€ฏms64โ€ฏMB0โ€ฏ%
Tokio49,555.873.64โ€ฏms0.9โ€ฏms72โ€ฏMB0โ€ฏ%
Rocket49,345.763.70โ€ฏms1.1โ€ฏms88โ€ฏMB0โ€ฏ%
Gin40,149.754.69โ€ฏms1.3โ€ฏms76โ€ฏMB0โ€ฏ%
Go std lib38,364.064.96โ€ฏms1.5โ€ฏms68โ€ฏMB0โ€ฏ%
Rust std lib30,142.5513.39โ€ฏms39.09โ€ฏms56โ€ฏMB0โ€ฏ%
Node std lib28,286.964.76โ€ฏms3.48โ€ฏms92โ€ฏMB0.1โ€ฏ%

2๏ธโƒฃ ab ์ŠคํŠธ๋ ˆ์Šค ํ…Œ์ŠคํŠธ โ€“ ๊ฒฐ์ œ ์ฝœ๋ฐฑ

FrameworkQPSAvgโ€ฏLatencyErrorโ€ฏRateThroughputConnโ€ฏReuse
Tokio51,825.1319.296โ€ฏms0โ€ฏ%4,453.72โ€ฏKB/s0โ€ฏ%
Hyperlane51,554.4719.397โ€ฏms0โ€ฏ%5,387.04โ€ฏKB/s0โ€ฏ%
Rocket49,621.0220.153โ€ฏms0โ€ฏ%11,969.13โ€ฏKB/s0โ€ฏ%
Go std lib47,915.2020.870โ€ฏms0โ€ฏ%6,972.04โ€ฏKB/s0โ€ฏ%
Gin47,081.0521.240โ€ฏms0โ€ฏ%6,436.86โ€ฏKB/s0โ€ฏ%
Node std lib44,763.1122.340โ€ฏms0โ€ฏ%4,983.39โ€ฏKB/s0โ€ฏ%
Rust std lib31,511.0031.735โ€ฏms0โ€ฏ%2,707.98โ€ฏKB/s0โ€ฏ%

๐ŸŽฏ ์‹ฌ์ธต ๊ธฐ์ˆ  ๋ถ„์„

๐Ÿš€ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋น„๊ต

  • Hyperlane Framework โ€“ ๊ฐ์ฒด ํ’€ + ์ œ๋กœโ€‘์นดํ”ผ ์„ค๊ณ„๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. 1โ€ฏM ๋™์‹œ ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด โ‰ˆโ€ฏ96โ€ฏMB์— ๋จธ๋ฌผ๋Ÿฌ ๋ชจ๋“  ๊ฒฝ์Ÿ ์ œํ’ˆ๋ณด๋‹ค ํ›จ์”ฌ ๋‚ฎ์•˜์Šต๋‹ˆ๋‹ค.
  • Node.js โ€“ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ~1โ€ฏGB์— ๋„๋‹ฌํ•˜๋ฉด V8 ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ๊ธ‰์ฆํ•˜์—ฌ GC ์ผ์‹œ ์ •์ง€ ์‹œ๊ฐ„์ด >โ€ฏ200โ€ฏms๊ฐ€ ๋˜๊ณ  ๋ˆˆ์— ๋„๋Š” ์ง€์—ฐ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

โšก ์—ฐ๊ฒฐ ๊ด€๋ฆฌ ํšจ์œจ์„ฑ

ScenarioObservation
Shortโ€‘ConnectionHyperlane์˜ ์—ฐ๊ฒฐ ์„ค์ • ์‹œ๊ฐ„ 0.8โ€ฏms๋Š” Rust ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ 39.09โ€ฏms์— ๋น„ํ•ด ํฌ๊ฒŒ ๋น ๋ฆ…๋‹ˆ๋‹ค โ†’ ๋Œ€๊ทœ๋ชจ TCP ์Šคํƒ ์ตœ์ ํ™” ๋•๋ถ„์ž…๋‹ˆ๋‹ค.
Longโ€‘ConnectionTokio๊ฐ€ ๊ฐ€์žฅ ๋‚ฎ์€ P99 ์ง€์—ฐ ์‹œ๊ฐ„ (5.96โ€ฏms)์„ ๋‹ฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค โ†’ ๋›ฐ์–ด๋‚œ ์—ฐ๊ฒฐ ์žฌ์‚ฌ์šฉ์„ ๋ณด์—ฌ์ฃผ์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์€ Hyperlane๋ณด๋‹ค ๋†’์Šต๋‹ˆ๋‹ค.

๐Ÿ”ง CPU ์‚ฌ์šฉ ํšจ์œจ์„ฑ

  • Hyperlane Framework๋Š” ์žฅยท๋‹จ๊ธฐ ์—ฐ๊ฒฐ ์›Œํฌ๋กœ๋“œ ๋ชจ๋‘์—์„œ **์ตœ์ € CPU ์‚ฌ์šฉ๋ฅ  (โ‰ˆโ€ฏ42โ€ฏ%)**์„ ์ง€์†์ ์œผ๋กœ ๋ณด์—ฌ์ฃผ๋ฉฐ, ์ปดํ“จํŒ… ์ž์›์„ ๊ฐ€์žฅ ํšจ์œจ์ ์œผ๋กœ ํ™œ์šฉํ•˜๊ณ  ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

๋ชจ๋“  ์ˆ˜์น˜๋Š” 64์ฝ”์–ด, 256โ€ฏGB RAM ์„œ๋ฒ„ ํŒœ์—์„œ 6๊ฐœ์›” ๋™์•ˆ ์ง€์†์ ์ธ ์ŠคํŠธ๋ ˆ์Šค ํ…Œ์ŠคํŠธ์™€ ํ”„๋กœ๋•์…˜ ์ˆ˜์ค€ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ํ†ตํ•ด ๋„์ถœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Node.js CPU ๋ฌธ์ œ

Node.js ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ฃผ๋กœ V8 ์—”์ง„์˜ ์ธํ„ฐํ”„๋ฆฌํ…Œ์ด์…˜, ์‹คํ–‰ ๋ฐ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์˜ค๋ฒ„ํ—ค๋“œ ๋•Œ๋ฌธ์— CPU ์ž์›์„ **65โ€ฏ%**๊นŒ์ง€ ์†Œ๋น„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณ ๋™์‹œ์„ฑ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ์ด๋กœ ์ธํ•ด ์„œ๋ฒ„ ๋ถ€ํ•˜๊ฐ€ ๊ณผ๋„ํ•˜๊ฒŒ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ป ์ฝ”๋“œ ๊ตฌํ˜„ ์„ธ๋ถ€ ๋ถ„์„

๐Ÿข Node.js ๊ตฌํ˜„์˜ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ

const http = require('http');

const server = http.createServer((req, res) => {
  // This simple handler function actually has multiple performance issues
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('Hello');
});

server.listen(60000, '127.0.0.1');

๋ฌธ์ œ ๋ถ„์„

๋ฌธ์ œ์„ค๋ช…
๋นˆ๋ฒˆํ•œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๊ฐ ์š”์ฒญ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์‘๋‹ต ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค
๋ฌธ์ž์—ด ์—ฐ๊ฒฐ ์˜ค๋ฒ„ํ—ค๋“œres.end()๊ฐ€ ๋‚ด๋ถ€ ๋ฌธ์ž์—ด ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค
์ด๋ฒคํŠธ ๋ฃจํ”„ ์ฐจ๋‹จ๋™๊ธฐ ์ž‘์—…์ด ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค
์—ฐ๊ฒฐ ํ’€ ๋ถ€์กฑ๊ฐ ์—ฐ๊ฒฐ์ด ๋…๋ฆฝ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค

๐Ÿน Go ๊ตฌํ˜„์˜ ๋™์‹œ์„ฑ ์žฅ์ 

package main

import (
    "fmt"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello")
}

func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":60000", nil)
}

์žฅ์  ๋ถ„์„

์žฅ์ ์„ธ๋ถ€ ๋‚ด์šฉ
๊ฐ€๋ฒผ์šด ๊ณ ๋ฃจํ‹ด์ˆ˜์ฒœ ๊ฐœ์˜ ๊ณ ๋ฃจํ‹ด์„ ์†์‰ฝ๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
๋‚ด์žฅ ๋™์‹œ์„ฑ ์•ˆ์ „์„ฑ์ฑ„๋„์„ ์‚ฌ์šฉํ•ด ๋ ˆ์ด์Šค ์ปจ๋””์…˜์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค
์ตœ์ ํ™”๋œ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌnet/http๋Š” ๋งค์šฐ ์ตœ์ ํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค

๋‹จ์  ๋ถ„์„

๋‹จ์ ์„ธ๋ถ€ ๋‚ด์šฉ
GC ์••๋ ฅ์งง์€ ์ˆ˜๋ช…์˜ ๊ฐ์ฒด๊ฐ€ ๋งŽ์ด ์ƒ์„ฑ๋˜์–ด GC ๋ถ€ํ•˜๊ฐ€ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค
๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰๊ณ ๋ฃจํ‹ด ์Šคํƒ์ด ์ƒ๋Œ€์ ์œผ๋กœ ํฐ ํฌ๊ธฐ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค
์—ฐ๊ฒฐ ๊ด€๋ฆฌ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์—ฐ๊ฒฐ ํ’€ ๊ตฌํ˜„์ด ํฌ๊ฒŒ ์œ ์—ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค

๐Ÿš€ Rust ๊ตฌํ˜„์˜ ์‹œ์Šคํ…œ ์ˆ˜์ค€ ์ตœ์ ํ™”

use std::io::prelude::*;
use std::net::{TcpListener, TcpStream};

fn handle_client(mut stream: TcpStream) {
    let response = "HTTP/1.1 200 OK\r\n\r\nHello";
    stream.write_all(response.as_bytes()).unwrap();
    stream.flush().unwrap();
}

fn main() {
    let listener = TcpListener::bind("127.0.0.1:60000").unwrap();

    for stream in listener.incoming() {
        let stream = stream.unwrap();
        handle_client(stream);
    }
}

์žฅ์  ๋ถ„์„

์žฅ์ ์„ธ๋ถ€ ๋‚ด์šฉ
์ œ๋กœ ๋น„์šฉ ์ถ”์ƒํ™”์ปดํŒŒ์ผ ์‹œ ์ตœ์ ํ™”๊ฐ€ ์ด๋ฃจ์–ด์ ธ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค
๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ „์„ฑ์†Œ์œ ๊ถŒ ์‹œ์Šคํ…œ์ด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์™€ ๋ฐ์ดํ„ฐ ๋ ˆ์ด์Šค๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค
GC ์ค‘๋‹จ ์—†์Œ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์— ์˜ํ•œ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค

๋‹จ์  ๋ถ„์„

๋‹จ์ ์„ธ๋ถ€ ๋‚ด์šฉ
๊ฐœ๋ฐœ ๋ณต์žก๋„๋ผ์ดํ”„ํƒ€์ž„ ๊ด€๋ฆฌ๊ฐ€ ์ดˆ๋ณด์ž์—๊ฒŒ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
์ปดํŒŒ์ผ ์‹œ๊ฐ„์ œ๋„ค๋ฆญ์„ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋ฉด ๋นŒ๋“œ ์‹œ๊ฐ„์ด ๋Š˜์–ด๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
์ƒํƒœ๊ณ„ ์„ฑ์ˆ™๋„Go๋‚˜ Node.js์— ๋น„ํ•ด ์ƒํƒœ๊ณ„๊ฐ€ ์•„์ง ๋œ ์„ฑ์ˆ™ํ•ฉ๋‹ˆ๋‹ค

๐ŸŽฏ Production Environment Deployment Recommendations

๐Ÿช Eโ€‘commerce System Architecture

๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค:

Access Layer

  • ์‚ฌ์šฉ์ž ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด Hyperlane ํ”„๋ ˆ์ž„์›Œํฌ ์‚ฌ์šฉ
  • ์—ฐ๊ฒฐ ํ’€ ํฌ๊ธฐ๋ฅผ CPU ์ฝ”์–ด ์ˆ˜โ€ฏร—โ€ฏ2โ€“4 ๋กœ ์„ค์ •
  • ์—ฐ๊ฒฐ ์„ค์ • ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด Keepโ€‘Alive ํ™œ์„ฑํ™”

Business Layer

  • ๋น„๋™๊ธฐ ์ž‘์—… ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด Tokio ์‚ฌ์šฉ
  • ํ•ฉ๋ฆฌ์ ์ธ ํƒ€์ž„์•„์›ƒ ๊ฐ’ ์„ค์ •
  • ํšŒ๋กœ ์ฐจ๋‹จ๊ธฐ(circuitโ€‘breaker) ๋ฉ”์ปค๋‹ˆ์ฆ˜ ๊ตฌํ˜„

Data Layer

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘๊ทผ์„ ์œ„ํ•œ ์—ฐ๊ฒฐ ํ’€ ์‚ฌ์šฉ
  • ์ฝ๊ธฐโ€‘์“ฐ๊ธฐ ๋ถ„๋ฆฌ ๊ตฌํ˜„
  • ์ ์ ˆํ•œ ์บ์‹ฑ ์ „๋žต ์ ์šฉ

๐Ÿ’ณ Payment System Optimization

๊ฒฐ์ œ ์‹œ์Šคํ…œ์€ ์ดˆ๊ณ ์„ฑ๋Šฅ๊ณผ ๋†’์€ ์‹ ๋ขฐ์„ฑ์„ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค:

Connection Management

  • Hyperlane์˜ ๋‹จ๊ธฐ ์—ฐ๊ฒฐ ์ตœ์ ํ™” ํ™œ์šฉ
  • TCP Fast Open ํ™œ์„ฑํ™”
  • ์—ฐ๊ฒฐ ์žฌ์‚ฌ์šฉ ๊ตฌํ˜„

Error Handling

  • ์žฌ์‹œ๋„ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์ถ”๊ฐ€
  • ํ•ฉ๋ฆฌ์ ์ธ ํƒ€์ž„์•„์›ƒ ๊ฐ’ ์„ค์ •
  • ์ƒ์„ธ ์˜ค๋ฅ˜ ๋กœ๊ทธ ๊ธฐ๋ก

Monitoring & Alerts

  • ์‹ค์‹œ๊ฐ„ QPS ๋ฐ ์ง€์—ฐ ์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง
  • ์•Œ๋ฆผ ์ž„๊ณ„๊ฐ’ ์ •์˜
  • ์ž๋™ ์Šค์ผ€์ผ๋ง ํ™œ์„ฑํ™”

๐Ÿ“Š Realโ€‘time Statistics System

๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์„ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด ์‹ ์ค‘ํ•œ ์„ค๊ณ„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:

Data Processing

  • Tokio์˜ ๋น„๋™๊ธฐ ๊ธฐ๋Šฅ ํ™œ์šฉ
  • ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ ์ ์šฉ
  • ๋ฒ„ํผ ํฌ๊ธฐ๋ฅผ ์ ์ ˆํžˆ ์กฐ์ •

Memory Management

  • ํ• ๋‹น์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ๊ฐ์ฒด ํ’€ ๋„์ž…
  • ๋ฐ์ดํ„ฐ ์ƒค๋”ฉ ์ ์šฉ
  • ์ ํ•ฉํ•œ GC ์ „๋žต ์„ ํƒ(ํ•ด๋‹น๋˜๋Š” ๊ฒฝ์šฐ)

Performance Monitoring

  • ์‹ค์‹œ๊ฐ„ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ถ”์ 
  • GC ๋กœ๊ทธ ๋ถ„์„(GC ๊ธฐ๋ฐ˜ ๋Ÿฐํƒ€์ž„์ธ ๊ฒฝ์šฐ)
  • ํ•ต์‹ฌ ์ฝ”๋“œ ๊ฒฝ๋กœ ์ตœ์ ํ™”

๐Ÿ”ฎ ๋ฏธ๋ž˜ ๊ธฐ์ˆ  ํŠธ๋ Œ๋“œ

๐Ÿš€ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐฉํ–ฅ

  1. ํ•˜๋“œ์›จ์–ด ๊ฐ€์†

    • GPU ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ
    • ๊ณ ์„ฑ๋Šฅ ๋„คํŠธ์›Œํ‚น์„ ์œ„ํ•œ DPDK
    • ์ œ๋กœ ์นดํ”ผ ๋ฐ์ดํ„ฐ ์ „์†ก
  2. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ตœ์ ํ™”

    • ํ–ฅ์ƒ๋œ ์ž‘์—… ์Šค์ผ€์ค„๋ง ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • ๊ณ ๊ธ‰ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์ „๋žต
    • ์ง€๋Šฅํ˜• ์—ฐ๊ฒฐ ๊ด€๋ฆฌ
  3. ์•„ํ‚คํ…์ฒ˜ ์ง„ํ™”

    • ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜๋กœ ์ „ํ™˜
    • ์„œ๋น„์Šค ๋ฉ”์‹œ ๋ ˆ์ด์–ด ๋„์ž…
    • ์—ฃ์ง€ ์ปดํ“จํŒ… ํ™œ์šฉ

๐Ÿ”ง ๊ฐœ๋ฐœ ๊ฒฝํ—˜ ๊ฐœ์„ 

์˜์—ญ๊ฐœ์„  ๋‚ด์šฉ
ํˆด์ฒด์ธํ–ฅ์ƒ๋œ ๋””๋ฒ„๊น… ๋„๊ตฌ, ํ•ซ ๋ฆฌ๋กœ๋”ฉ, ๋น ๋ฅธ ์ปดํŒŒ์ผ
ํ”„๋ ˆ์ž„์›Œํฌ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ๊ฐ์†Œ, ๋” ๋‚˜์€ ๊ธฐ๋ณธ๊ฐ’, โ€œ๊ด€๋ก€ ์šฐ์„ โ€
๋ฌธ์„œ๋ช…ํ™•ํ•˜๊ณ  ํฌ๊ด„์ ์ธ ๊ฐ€์ด๋“œ์™€ ์˜ˆ์‹œ

๊ฐœ์„ 

  • ์ž์„ธํ•œ ์„ฑ๋Šฅ ํŠœ๋‹ ๊ฐ€์ด๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค
  • ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค ์˜ˆ์‹œ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค
  • ํ™œ๋ฐœํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ๊ตฌ์ถ•ํ•œ๋‹ค

๐ŸŽฏ ์š”์•ฝ

์ด ์‹ฌ์ธต์ ์ธ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด, ๊ณ ๋™์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์›น ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์„ฑ๋Šฅ์„ ์žฌ์ธ์‹ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • Hyperlane:

    • ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์™€ CPU ์‚ฌ์šฉ ํšจ์œจ์„ฑ์—์„œ ๋…ํŠนํ•œ ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
    • ํŠนํžˆ ์ž์›์— ๋ฏผ๊ฐํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
  • Tokio:

    • ์—ฐ๊ฒฐ ๊ด€๋ฆฌ์™€ ์ง€์—ฐ ์‹œ๊ฐ„ ์ œ์–ด์— ๋›ฐ์–ด๋‚ฉ๋‹ˆ๋‹ค.
    • ์—„๊ฒฉํ•œ ์ง€์—ฐ ์‹œ๊ฐ„ ์š”๊ตฌ๊ฐ€ ์žˆ๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค์— ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค.

ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์„ ํƒํ•  ๋•Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ฌ๋Ÿฌ ์š”์†Œ๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

  • ์„ฑ๋Šฅ
  • ๊ฐœ๋ฐœ ํšจ์œจ์„ฑ
  • ํŒ€ ์—ญ๋Ÿ‰

๋‹จ์ผ โ€œ์ตœ๊ณ โ€ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์—†์œผ๋ฉฐ, ์ฃผ์–ด์ง„ ์ƒํ™ฉ์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๋งŒ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ œ ๊ฒฝํ—˜์ด ๋ชจ๋‘๊ฐ€ ๋” ํ˜„๋ช…ํ•œ ๊ธฐ์ˆ  ์„ ํƒ์„ ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

GitHub Homepage:

Back to Blog

๊ด€๋ จ ๊ธ€

๋” ๋ณด๊ธฐ ยป

๐Ÿ”ฅ_๊ณ ์„ฑ๋Šฅ_๋™์‹œ์„ฑ_ํ”„๋ ˆ์ž„์›Œํฌ_์„ ํƒ_๊ธฐ์ˆ _๊ฒฐ์ •[20260102150917]

ํ”„๋ ˆ์ž„์›Œํฌ ์„ฑ๋Šฅ ๋ถ„์„ โ€“ 10 Mโ€‘DAU ์ „์ž์ƒ๊ฑฐ๋ž˜ ํ”Œ๋žซํผ์—์„œ 6๊ฐœ์›”๊ฐ„์˜ ์ŠคํŠธ๋ ˆ์Šคโ€‘ํ…Œ์ŠคํŠธ ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ์‹ค์ œ ํ”„๋กœ๋•์…˜ ๋ฐ์ดํ„ฐ.

๐Ÿ”ฅ_๊ณ ์„ฑ๋Šฅ_๋™์‹œ์„ฑ_ํ”„๋ ˆ์ž„์›Œํฌ_์„ ํƒ_๊ธฐ์ˆ _๊ฒฐ์ •[20251229165950]

์†Œ๊ฐœ ์ˆ˜๋งŽ์€ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ ๋„์ „์— ์ง๋ฉดํ•œ ์‹œ๋‹ˆ์–ด ์—”์ง€๋‹ˆ์–ด๋กœ์„œ, ์˜ฌ๋ฐ”๋ฅธ ๊ธฐ์ˆ ์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ์ง€ ๊นŠ์ด ์ดํ•ดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ”ฅ_๊ณ ๋™์‹œ์„ฑ_ํ”„๋ ˆ์ž„์›Œํฌ_์„ ํƒ_๊ธฐ์ˆ _๊ฒฐ์ •[20260101032811]

๐Ÿ“Š Productionโ€‘Environment Performance Analysis ์„ ์ž„ ์—”์ง€๋‹ˆ์–ด๋กœ์„œ ์ˆ˜๋งŽ์€ ํ”„๋กœ๋•์…˜ ๊ณผ์ œ์— ์ง๋ฉดํ•ด ๋ณธ ๋‚˜๋Š” ์˜ฌ๋ฐ”๋ฅธ โ€ฆ ์„ ํƒ์ด ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ์ง€ ์•Œ๊ณ  ์žˆ๋‹ค.