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

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

Source: Dev.to

๐Ÿ“Š ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ ์„ฑ๋Šฅ ๋ถ„์„

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

๐Ÿ’ก ์‹ค์ œ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ ๊ณผ์ œ

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

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

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

์žฅ๊ธฐ ์—ฐ๊ฒฐ ํŠธ๋ž˜ํ”ฝ์€ ์ „์ฒด ๋ถ€ํ•˜์˜ **>โ€ฏ70โ€ฏ%**๋ฅผ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค.

wrk โ€“ ์ œํ’ˆ ์ƒ์„ธ ํŽ˜์ด์ง€ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ

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โ€ฏ%

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 ์‹œ๋‚˜๋ฆฌ์˜ค)

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

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โ€ฏ%

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

    • V8์˜ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ๋ˆˆ์— ๋„๋Š” ์ผ์‹œ ์ •์ง€๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.
    • ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ 1โ€ฏGB์— ๋„๋‹ฌํ•˜๋ฉด GC ์ผ์‹œ ์ •์ง€๊ฐ€ 200โ€ฏms๋ฅผ ์ดˆ๊ณผํ•˜์—ฌ ์‹ฌ๊ฐํ•œ ์ง€์—ฐ ์ŠคํŒŒ์ดํฌ๋ฅผ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค.

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

  • ์งง์€ ์—ฐ๊ฒฐ ์‹œ๋‚˜๋ฆฌ์˜ค

    • Hyperlane์˜ ์—ฐ๊ฒฐ ์„ค์ • ์‹œ๊ฐ„: 0.8โ€ฏms.
    • Rust std lib: 39.09โ€ฏms โ€“ ํฐ ์ฐจ์ด๋กœ, Hyperlane์˜ ๊ณต๊ฒฉ์ ์ธ TCP ์ตœ์ ํ™”๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
  • ๊ธด ์—ฐ๊ฒฐ ์‹œ๋‚˜๋ฆฌ์˜ค

    • Tokio๋Š” ๊ฐ€์žฅ ๋‚ฎ์€ P99 ์ง€์—ฐ ์‹œ๊ฐ„ (5.96โ€ฏms)์„ ๋‹ฌ์„ฑํ–ˆ์œผ๋ฉฐ, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์€ ๋” ๋†’์ง€๋งŒ ์—ฐ๊ฒฐ ์žฌ์‚ฌ์šฉ์ด ๋›ฐ์–ด๋‚จ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

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

  • Hyperlane Framework๋Š” ์ผ๊ด€๋˜๊ฒŒ ๊ฐ€์žฅ ๋‚ฎ์€ CPU ์‚ฌ์šฉ๋ฅ  (โ‰ˆโ€ฏ42โ€ฏ%)์„ ๋ณด์ด๋ฉฐ ์ตœ๊ณ  ์ˆ˜์ค€์˜ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ์ œ๊ณตํ•˜๋ฏ€๋กœ ์ถ”๊ฐ€ ์„œ๋น„์Šค๋‚˜ ํ™•์žฅ์„ ์œ„ํ•œ ์—ฌ์œ  ๊ณต๊ฐ„์ด ๋” ๋งŽ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ ์ฃผ์š” ๋‚ด์šฉ

์ธ์‚ฌ์ดํŠธ๊ถŒ์žฅ ์‚ฌํ•ญ
Memory footprint matters โ€“ Hyperlaneโ€™s pool/zeroโ€‘copy design yields the smallest RAM usage under massive concurrency.๊ณ  ํŠธ๋ž˜ํ”ฝ ์„œ๋น„์Šค์—์„œ๋Š” ๋ช…์‹œ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์žฌ์‚ฌ์šฉ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ฐ–์ถ˜ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์„ ํ˜ธํ•˜์„ธ์š”.
Connection handling is a firstโ€‘order factor โ€“ Fast TCP setup and efficient keepโ€‘alive reuse directly improve latency.์›Œํฌ๋กœ๋“œ ํŒจํ„ด์— ๋”ฐ๋ผ Hyperlane(๋‹จ๊ธฐ ์—ฐ๊ฒฐ) ๋˜๋Š” Tokio(์žฅ๊ธฐ ์—ฐ๊ฒฐ)๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
CPU efficiency translates to cost savings โ€“ Lower CPU % at the same QPS means you can run fewer instances or handle more traffic per node.CPU ํ”„๋กœํŒŒ์ผ์„ ์ดˆ๊ธฐ์— ํ‰๊ฐ€ํ•˜์„ธ์š”; Hyperlane์ด ๊ฐ€์žฅ ๊ท ํ˜• ์žกํžŒ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
Node.js may need extra tuning โ€“ GC pauses become a bottleneck at high memory usage.๋ ˆ์ดํ„ด์‹œ๊ฐ€ ์ค‘์š”ํ•œ ๊ฒฝ๋กœ์—์„œ๋Š” ๋Œ€์•ˆ ๋Ÿฐํƒ€์ž„์„ ๊ณ ๋ คํ•˜๊ฑฐ๋‚˜, aggressive GC ํŠœ๋‹ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์„ ์ ์šฉํ•˜์„ธ์š”.

๋ชจ๋“  ์ˆ˜์น˜๋Š” ๋‚ด๋ถ€ wrk ๋ฐ ab ์ŠคํŠธ๋ ˆ์Šคโ€‘ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ์—์„œ ์–ป์€ ๊ฒƒ์œผ๋กœ, ํ”„๋กœ๋•์…˜๊ณผ ์œ ์‚ฌํ•œ ํ•˜๋“œ์›จ์–ด์™€ ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Node.js CPU ๋ฌธ์ œ

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

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

๐Ÿข 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 ์••๋ ฅ โ€“ ๋‹ค์ˆ˜์˜ ๋‹จ๋ช… ๊ฐ์ฒด๊ฐ€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๋ถ€๋‹ด์„ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค
  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ โ€“ 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์— ๋น„ํ•ด ์•„์ง ๋’ค์ฒ˜์ ธ ์žˆ์Šต๋‹ˆ๋‹ค

๐ŸŽฏ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ ๋ฐฐํฌ ๊ถŒ์žฅ ์‚ฌํ•ญ

๐Ÿช ์ „์ž์ƒ๊ฑฐ๋ž˜ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜ ๊ถŒ์žฅ ์‚ฌํ•ญ

์šด์˜ ๊ฒฝํ—˜์„ ๋ฐ”ํƒ•์œผ๋กœ ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค:

Access Layer

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

Business Layer

  • ๋น„๋™๊ธฐ ์ž‘์—…์„ ์œ„ํ•ด Tokio ํ”„๋ ˆ์ž„์›Œํฌ ์‚ฌ์šฉ
  • ํ•ฉ๋ฆฌ์ ์ธ ํƒ€์ž„์•„์›ƒ ๊ฐ’ ์„ค์ •
  • ์„œํ‚ทโ€‘๋ธŒ๋ ˆ์ด์ปค ๋ฉ”์ปค๋‹ˆ์ฆ˜ ๊ตฌํ˜„

Data Layer

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

๐Ÿ’ณ ๊ฒฐ์ œ ์‹œ์Šคํ…œ ์ตœ์ ํ™” ๊ถŒ์žฅ ์‚ฌํ•ญ

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

Connection Management

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

Error Handling

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

Monitoring & Alerts

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

๐Ÿ“Š ์‹ค์‹œ๊ฐ„ ํ†ต๊ณ„ ์‹œ์Šคํ…œ ๊ถŒ์žฅ ์‚ฌํ•ญ

์‹ค์‹œ๊ฐ„ ๋ถ„์„์€ ๋ฐฉ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ์–‘์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

Data Processing

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

Memory Management

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

Performance Monitoring

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

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

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

ํ–ฅํ›„ ์ž‘์—…์€ ๋‹ค์Œ์— ์ดˆ์ ์„ ๋งž์ถœ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค:

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

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

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

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

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

์„ฑ๋Šฅ์ด ์ค‘์š”ํ•˜์ง€๋งŒ, ๊ฐœ๋ฐœ์ž ์ƒ์‚ฐ์„ฑ๋„ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค:

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

    • ํ–ฅ์ƒ๋œ ๋””๋ฒ„๊น… ๋„๊ตฌ
    • ํ•ซ ๋ฆฌ๋กœ๋”ฉ ์ง€์›
    • ๋” ๋น ๋ฅธ ์ปดํŒŒ์ผ
  • ํ”„๋ ˆ์ž„์›Œํฌ ๋‹จ์ˆœํ™”

    • ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ๊ฐ์†Œ
    • ํ•ฉ๋ฆฌ์ ์ธ ๊ธฐ๋ณธ๊ฐ’ ์ œ๊ณต
    • โ€œ๊ตฌ์„ฑ๋ณด๋‹ค ๊ด€๋ก€โ€ ์ฑ„ํƒ
  • ๋ฌธ์„œ โ€“ ์ตœ์‹  ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ณ , ํฌ๊ด„์ ์ด๋ฉฐ, ํƒ์ƒ‰ํ•˜๊ธฐ ์‰ฝ๊ฒŒ ์œ ์ง€ํ•˜์‹ญ์‹œ์˜ค.

๊ฐœ์„ 

  • ์ƒ์„ธํ•œ ์„ฑ๋Šฅ ํŠœ๋‹ ๊ฐ€์ด๋“œ ์ œ๊ณต
  • ๋ชจ๋ฒ” ์‚ฌ๋ก€ ์˜ˆ์‹œ ๊ตฌํ˜„
  • ํ™œ๋ฐœํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ตฌ์ถ•

๐ŸŽฏ ์š”์•ฝ

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

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

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

GitHub Homepage: hyperlane-dev/hyperlane

Back to Blog

๊ด€๋ จ ๊ธ€

๋” ๋ณด๊ธฐ ยป

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

๐Ÿ’ก ์‹ค์ œ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ์˜ ๋„์ „ ๊ณผ์ œ ์šฐ๋ฆฌ eโ€‘commerce ํ”Œ๋žซํผ ์žฌ๊ตฌ์ถ• ํ”„๋กœ์ ํŠธ์—์„œ ์ผ์ผ ํ™œ์„ฑ ์‚ฌ์šฉ์ž ์•ฝ 1,000๋งŒ ๋ช…์„ ๋Œ€์ƒ์œผ๋กœ ์šฐ๋ฆฌ๋Š” ๋ฐ˜๋ณต์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ „ํ˜•์ ์ธ โ€ฆ

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

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

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

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