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

๋ฐœํ–‰: (2026๋…„ 1์›” 2์ผ ์˜คํ›„ 10:45 GMT+9)
11 min read
์›๋ฌธ: Dev.to

Source: Dev.to

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

์šฐ๋ฆฌ์˜ ์ „์ž์ƒ๊ฑฐ๋ž˜ ํ”Œ๋žซํผ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์—ฌ๋Ÿฌ ์ „ํ˜•์ ์ธ ์„ฑ๋Šฅ ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ์Šต๋‹ˆ๋‹ค:

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

Source: โ€ฆ

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

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

Longโ€‘connection ํŠธ๋ž˜ํ”ฝ์ด >โ€ฏ70โ€ฏ% ๋ฅผ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ์ œํ’ˆ ์ƒ์„ธ ํŽ˜์ด์ง€ ์ ‘๊ทผ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•œ wrk ์ŠคํŠธ๋ ˆ์Šค ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

FrameworkQPSํ‰๊ท  ์ง€์—ฐ์‹œ๊ฐ„P99 ์ง€์—ฐ์‹œ๊ฐ„๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰CPU ์‚ฌ์šฉ๋Ÿ‰
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โ€ฏ%

ab ์ŠคํŠธ๋ ˆ์Šค ํ…Œ์ŠคํŠธ โ€“ ๊ฒฐ์ œ ์š”์ฒญ (shortโ€‘connection)

FrameworkQPSํ‰๊ท  ์ง€์—ฐ์‹œ๊ฐ„์˜ค๋ฅ˜ ๋น„์œจ์ฒ˜๋ฆฌ๋Ÿ‰์—ฐ๊ฒฐ ์„ค์ • ์‹œ๊ฐ„
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โ€ฏ% ์— ๋ถˆ๊ณผํ•˜์ง€๋งŒ ๊ฒฐ์ œ, ๋กœ๊ทธ์ธ ๋“ฑ์—์„œ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

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

FrameworkQPSํ‰๊ท  ์ง€์—ฐ์‹œ๊ฐ„์—ฐ๊ฒฐ ์„ค์ • ์‹œ๊ฐ„๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์˜ค๋ฅ˜ ๋น„์œจ
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โ€ฏ%

ab ์ŠคํŠธ๋ ˆ์Šค ํ…Œ์ŠคํŠธ โ€“ ๊ฒฐ์ œ ์ฝœ๋ฐฑ

FrameworkQPSํ‰๊ท  ์ง€์—ฐ์‹œ๊ฐ„์˜ค๋ฅ˜ ๋น„์œจ์ฒ˜๋ฆฌ๋Ÿ‰์—ฐ๊ฒฐ ์žฌ์‚ฌ์šฉ ๋น„์œจ
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 โ€“ V8 ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ๋ˆˆ์— ๋„๋Š” ์ผ์‹œ ์ •์ง€๋ฅผ ์ผ์œผํ‚ต๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ 1โ€ฏGB์— ๋„๋‹ฌํ•˜๋ฉด GC ์ผ์‹œ ์ •์ง€ ์‹œ๊ฐ„์ด 200โ€ฏms๋ฅผ ์ดˆ๊ณผํ•ด ๋ˆˆ์— ๋ณด์ด๋Š” ์ง€์—ฐ ์ŠคํŒŒ์ดํฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

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

  • ๋‹จ๊ธฐโ€‘์—ฐ๊ฒฐ ์‹œ๋‚˜๋ฆฌ์˜ค โ€“ Hyperlane์˜ ์—ฐ๊ฒฐโ€‘์„ค์ • ์‹œ๊ฐ„์€ 0.8โ€ฏms๋กœ, Rust์˜ 39โ€ฏms๋ณด๋‹ค ํฌ๊ฒŒ ์•ž์„ญ๋‹ˆ๋‹ค. ์ด๋Š” Hyperlane์˜ ๊ด‘๋ฒ”์œ„ํ•œ TCPโ€‘์ตœ์ ํ™”๋ฅผ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์žฅ๊ธฐโ€‘์—ฐ๊ฒฐ ์‹œ๋‚˜๋ฆฌ์˜ค โ€“ Tokio๊ฐ€ ๊ฐ€์žฅ ๋‚ฎ์€ P99 ์ง€์—ฐ ์‹œ๊ฐ„ (5.96โ€ฏms)์„ ๊ธฐ๋กํ–ˆ์œผ๋ฉฐ, ์ด๋Š” ์—ฐ๊ฒฐโ€‘์žฌ์‚ฌ์šฉ ์ฒ˜๋ฆฌ์— ๋›ฐ์–ด๋‚จ์„ ๋‚˜ํƒ€๋‚ด์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋น„๋Š” ์•ฝ๊ฐ„ ๋” ๋†’์Šต๋‹ˆ๋‹ค.

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

  • Hyperlane Framework โ€“ ํ…Œ์ŠคํŠธ ์ „๋ฐ˜์— ๊ฑธ์ณ ์ตœ์ € CPU ํ™œ์šฉ๋„ (โ‰ˆโ€ฏ42โ€ฏ%)๋ฅผ ์ง€์†์ ์œผ๋กœ ๋ณด์—ฌ, CPU ์‚ฌ์ดํด๋‹น ๊ฐ€์žฅ ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

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

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)
}

์žฅ์  ๋ถ„์„

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

๋‹จ์  ๋ถ„์„

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

๐Ÿš€ 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 Recommendations

Based on production experience, a layered architecture is recommended.

Access Layer

  • Use Hyperlane framework to handle user requests
  • Configure connectionโ€‘pool size to 2โ€“4โ€ฏร—โ€ฏCPU cores
  • Enable Keepโ€‘Alive to reduce connectionโ€‘establishment overhead

Business Layer

  • Use Tokio framework for asynchronous tasks
  • Configure reasonable timeout values
  • Implement circuitโ€‘breaker mechanisms

Data Layer

  • Use connection pools to manage database connections
  • Implement readโ€‘write separation
  • Configure appropriate caching strategies

๐Ÿ’ณ Payment System Optimization Recommendations

Connection Management

  • Use Hyperlaneโ€™s shortโ€‘connection optimization
  • Enable TCP Fast Open
  • Implement connection reuse

Error Handling

  • Implement retry mechanisms
  • Set reasonable timeout values
  • Record detailed error logs

Monitoring & Alerts

  • Monitor QPS and latency in real time
  • Set sensible alert thresholds
  • Implement autoโ€‘scaling

๐Ÿ“Š Realโ€‘time Statistics System Recommendations

Data Processing

  • Leverage Tokioโ€™s asynchronous processing capabilities
  • Implement batch processing
  • Tune buffer sizes appropriately

Memory Management

  • Use object pools to reduce allocations
  • Apply data sharding
  • Configure suitable GC strategies

Performance Monitoring

  • Track memory usage in real time
  • Analyse GC logs
  • Optimize hot code paths

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

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

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

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

์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ตœ์ ํ™”

  • ์ž‘์—… ์Šค์ผ€์ค„๋ง ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ •์ œ
  • ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์ „๋žต ์ตœ์ ํ™”
  • ์ง€๋Šฅํ˜• ์—ฐ๊ฒฐ ๊ด€๋ฆฌ ๋ฐฐํฌ

์•„ํ‚คํ…์ฒ˜ ์ง„ํ™”

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

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

ํˆด์ฒด์ธ ๊ฐœ์„ 

  • ๋” ๋‚˜์€ ๋””๋ฒ„๊น… ๋„๊ตฌ ์ œ๊ณต
  • ํ•ซ ๋ฆฌ๋กœ๋”ฉ ๊ตฌํ˜„
  • ์ปดํŒŒ์ผ ์†๋„ ํ–ฅ์ƒ

ํ”„๋ ˆ์ž„์›Œํฌ ๋‹จ์ˆœํ™”

  • ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ ๊ฐ์†Œ
  • ํ•ฉ๋ฆฌ์ ์ธ ๊ธฐ๋ณธ ์„ค์ • ์ œ๊ณต
  • โ€œ์ปจ๋ฒค์…˜ ์šฐ์„ โ€ ์ ‘๊ทผ๋ฒ• ์ˆ˜์šฉ

๋ฌธ์„œํ™”

  • ๋ฌธ์„œ๋ฅผ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๊ณ  ํฌ๊ด„์ ์œผ๋กœ ์ œ๊ณต
  • ์‹ค์šฉ์ ์ธ ์˜ˆ์‹œ์™€ ๋ชจ๋ฒ” ์‚ฌ๋ก€ ๊ฐ€์ด๋“œ ํฌํ•จ

๐ŸŽฏ ์š”์•ฝ

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

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

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

GitHub Homepage: hyperlane-dev/hyperlane

Back to Blog

๊ด€๋ จ ๊ธ€

๋” ๋ณด๊ธฐ ยป

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

๐Ÿ“ˆ ์‹ค์ œ ์šด์˜ ํ™˜๊ฒฝ ๋„์ „ ๊ณผ์ œ ์šฐ๋ฆฌ eโ€‘commerce ํ”Œ๋žซํผ ํ”„๋กœ์ ํŠธ์—์„œ ์šฐ๋ฆฌ๋Š” ์—ฌ๋Ÿฌ ์ „ํ˜•์ ์ธ ์„ฑ๋Šฅ ๊ณผ์ œ์— ์ง๋ฉดํ–ˆ์Šต๋‹ˆ๋‹ค: ๐Ÿ›’ ํ”Œ๋ž˜์‹œโ€‘์„ธ์ผ ์‹œ๋‚˜๋ฆฌ์˜ค maj ๋™์•ˆ

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

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

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

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