๐Ÿš€_๊ถ๊ทน์˜_์›น_ํ”„๋ ˆ์ž„์›Œํฌ_์†๋„_๋Œ€๊ฒฐ[20251231195712]

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

Source: Dev.to

์œ„์— ์ œ๊ณต๋œ Source ๋งํฌ ์™ธ์— ๋ฒˆ์—ญํ•  ํ…์ŠคํŠธ๋ฅผ ์•Œ๋ ค์ฃผ์‹œ๋ฉด, ํ•ด๋‹น ๋‚ด์šฉ์„ ํ•œ๊ตญ์–ด๋กœ ๋ฒˆ์—ญํ•ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.
(์ฝ”๋“œ ๋ธ”๋ก์ด๋‚˜ URL์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๊ณ , ๋งˆํฌ๋‹ค์šด ํ˜•์‹๊ณผ ๊ธฐ์ˆ  ์šฉ์–ด๋Š” ๊ทธ๋Œ€๋กœ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค.)

๐Ÿ“š ์†Œ๊ฐœ

10๋…„ ๊ฒฝ๋ ฅ์˜ ํ’€โ€‘์Šคํƒ ์—”์ง€๋‹ˆ์–ด๋กœ์„œ, ๋‚˜๋Š” ์ดˆ๊ธฐ jQuery ์‹œ๋Œ€๋ถ€ํ„ฐ ์˜ค๋Š˜๋‚  ๊ณ ์„ฑ๋Šฅ Rust ํ”„๋ ˆ์ž„์›Œํฌ์— ์ด๋ฅด๊ธฐ๊นŒ์ง€ ์›น ํ”„๋ ˆ์ž„์›Œํฌ์˜ ํฅ๋ง์„ฑ์‡ ๋ฅผ ์ง€์ผœ๋ดค๋‹ค. 2024๋…„ ํ˜„์žฌ, ์„ฑ๋Šฅ์— ๋Œ€ํ•œ ๊ธฐ๋Œ€์น˜๋Š” ๊ทธ ์–ด๋А ๋•Œ๋ณด๋‹ค ๋†’๋‹ค: ์‚ฌ์šฉ์ž๋“ค์€ ์ „์ž์ƒ๊ฑฐ๋ž˜ ์‚ฌ์ดํŠธ, ์†Œ์…œ ํ”Œ๋žซํผ, ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐ€๋ฆฌ์ดˆ ์ˆ˜์ค€์˜ ์‘๋‹ต ์‹œ๊ฐ„์„ ์š”๊ตฌํ•œ๋‹ค.

๋‚˜๋Š” ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ์›น ํ”„๋ ˆ์ž„์›Œํฌ๋“ค์„ ๋Œ€์ƒ์œผ๋กœ ํ•œ ๋‹ฌ ๋™์•ˆ ํฌ๊ด„์ ์ธ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ–ˆ๋‹ค. ํ…Œ์ŠคํŠธ ๋Œ€์ƒ์—๋Š” Tokio, Rocket, Gin, Go์™€ Rust ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, Node.js ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  Hyperlane ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ํฌํ•จ๋œ๋‹ค.

ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ

ComponentSpecification
ServerIntel Xeonโ€ฏE5โ€‘2686โ€ฏv4 @โ€ฏ2.30โ€ฏGHz
Memory32โ€ฏGB DDR4
NetworkGigabit Ethernet
OSUbuntuโ€ฏ20.04โ€ฏLTS

๐Ÿ“Š ์ „์ฒด ์„ฑ๋Šฅ ๋น„๊ต ๋ฐ์ดํ„ฐ

๐Ÿ”“ Keepโ€‘Alive ํ™œ์„ฑํ™” โ€“ wrk ์ŠคํŠธ๋ ˆ์Šค ํ…Œ์ŠคํŠธ

360 ๋™์‹œ ์—ฐ๊ฒฐ, 60โ€ฏ์ดˆ ์ง€์†

FrameworkQPSLatencyTransfer RateRanking
Tokio340,130.921.22โ€ฏms30.17โ€ฏMB/s๐Ÿฅ‡
Hyperlane334,888.273.10โ€ฏms33.21โ€ฏMB/s๐Ÿฅˆ
Rocket298,945.311.42โ€ฏms68.14โ€ฏMB/s๐Ÿฅ‰
Rust std lib291,218.961.64โ€ฏms25.83โ€ฏMB/s4๏ธโƒฃ
Gin242,570.161.67โ€ฏms33.54โ€ฏMB/s5๏ธโƒฃ
Go std lib234,178.931.58โ€ฏms32.38โ€ฏMB/s6๏ธโƒฃ
Node std lib139,412.132.58โ€ฏms19.81โ€ฏMB/s7๏ธโƒฃ

๐Ÿ”“ Keepโ€‘Alive ํ™œ์„ฑํ™” โ€“ ab ์ŠคํŠธ๋ ˆ์Šค ํ…Œ์ŠคํŠธ

1000 ๋™์‹œ ์—ฐ๊ฒฐ, 1โ€ฏM ์š”์ฒญ

FrameworkQPSLatencyTransfer RateRanking
Hyperlane316,211.633.162โ€ฏms32,115.24โ€ฏKB/s๐Ÿฅ‡
Tokio308,596.263.240โ€ฏms28,026.81โ€ฏKB/s๐Ÿฅˆ
Rocket267,931.523.732โ€ฏms70,907.66โ€ฏKB/s๐Ÿฅ‰
Rust std lib260,514.563.839โ€ฏms23,660.01โ€ฏKB/s4๏ธโƒฃ
Go std lib226,550.344.414โ€ฏms34,071.05โ€ฏKB/s5๏ธโƒฃ
Gin224,296.164.458โ€ฏms31,760.69โ€ฏKB/s6๏ธโƒฃ
Node std lib85,357.1811.715โ€ฏms4,961.70โ€ฏKB/s7๏ธโƒฃ

๐Ÿ”’ Keepโ€‘Alive ๋น„ํ™œ์„ฑํ™” โ€“ wrk ์ŠคํŠธ๋ ˆ์Šค ํ…Œ์ŠคํŠธ

FrameworkQPSLatencyTransfer RateRanking
Hyperlane51,031.273.51โ€ฏms4.96โ€ฏMB/s๐Ÿฅ‡
Tokio49,555.873.64โ€ฏms4.16โ€ฏMB/s๐Ÿฅˆ
Rocket49,345.763.70โ€ฏms12.14โ€ฏMB/s๐Ÿฅ‰
Gin40,149.754.69โ€ฏms5.36โ€ฏMB/s4๏ธโƒฃ
Go std lib38,364.064.96โ€ฏms5.12โ€ฏMB/s5๏ธโƒฃ
Rust std lib30,142.5513.39โ€ฏms2.53โ€ฏMB/s6๏ธโƒฃ
Node std lib28,286.964.76โ€ฏms3.88โ€ฏMB/s7๏ธโƒฃ

๐Ÿ”’ Keepโ€‘Alive ๋น„ํ™œ์„ฑํ™” โ€“ ab ์ŠคํŠธ๋ ˆ์Šค ํ…Œ์ŠคํŠธ

FrameworkQPSLatencyTransfer RateRanking
Tokio51,825.1319.296โ€ฏms4,453.72โ€ฏKB/s๐Ÿฅ‡
Hyperlane51,554.4719.397โ€ฏms5,387.04โ€ฏKB/s๐Ÿฅˆ
Rocket49,621.0220.153โ€ฏms11,969.13โ€ฏKB/s๐Ÿฅ‰
Go std lib47,915.2020.870โ€ฏms6,972.04โ€ฏKB/s4๏ธโƒฃ
Gin47,081.0521.240โ€ฏms6,436.86โ€ฏKB/s5๏ธโƒฃ
Node std lib44,763.1122.340โ€ฏms4,983.39โ€ฏKB/s6๏ธโƒฃ
Rust std lib31,511.0031.735โ€ฏms2,707.98โ€ฏKB/s7๏ธโƒฃ

๐ŸŽฏ ๊นŠ์ด ์žˆ๋Š” ์„ฑ๋Šฅ ๋ถ„์„

๐Ÿš€ Keepโ€‘Alive ํ™œ์„ฑํ™”

  • Tokio๊ฐ€ wrk ํ…Œ์ŠคํŠธ์—์„œ 340,130.92โ€ฏQPS๋กœ 1์œ„๋ฅผ ์ฐจ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • Hyperlane๋Š” 334,888.27โ€ฏQPS(1.5โ€ฏ% ๋А๋ฆด ๋ฟ)๋กœ ๊ทผ์†Œํ•˜๊ฒŒ 2์œ„์ด๋ฉฐ, ์ „์†ก ์†๋„์—์„œ๋Š” Tokio๋ณด๋‹ค ์šฐ์ˆ˜ํ•ฉ๋‹ˆ๋‹ค(33.21โ€ฏMB/s ๋Œ€ 30.17โ€ฏMB/s).
  • ab ํ…Œ์ŠคํŠธ์—์„œ Hyperlane๊ฐ€ Tokio๋ฅผ ์•ž์„œ๋ฉฐ(316,211.63โ€ฏQPS ๋Œ€ 308,596.26โ€ฏQPS), ์ง€์† ๋ถ€ํ•˜ ํ•˜์—์„œ โ€œ์ง„์ •ํ•œ ์„ฑ๋Šฅ ์™•โ€์ด ๋ฉ๋‹ˆ๋‹ค.

These results suggest that Hyperlaneโ€™s internal dataโ€‘processing pipeline is exceptionally efficient, even when Tokioโ€™s async runtime is highly optimized.

๐Ÿ”’ Keepโ€‘Alive ๋น„ํ™œ์„ฑํ™”

  • ์งง์€ ์—ฐ๊ฒฐ์„ ์‚ฌ์šฉํ•  ๋•Œ, Hyperlane๊ฐ€ wrk ํ…Œ์ŠคํŠธ์—์„œ 51,031.27โ€ฏQPS๋กœ ๋‹ค์‹œ 1์œ„๋ฅผ ์ฐจ์ง€ํ•˜๋ฉฐ Tokio๋ฅผ ์•ž์„ญ๋‹ˆ๋‹ค.
  • ab ํ…Œ์ŠคํŠธ์—์„œ๋Š” ๊ฒฉ์ฐจ๊ฐ€ ํฌ๊ฒŒ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค: Tokio(51,825.13โ€ฏQPS) ๋Œ€ Hyperlane(51,554.47โ€ฏQPS). ์ฐจ์ด๋Š” ์ผ๋ฐ˜์ ์ธ ์ธก์ • ์˜ค์ฐจ ๋ฒ”์œ„ ๋‚ด์— ์žˆ์–ด ๋‘ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์—ฐ๊ฒฐ ๋ณ€๋™์„ ๊ฑฐ์˜ ๋™๋“ฑํ•˜๊ฒŒ ์ž˜ ์ฒ˜๋ฆฌํ•จ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

๐Ÿ’ป Code Implementation Comparison

๐Ÿข Node.js Standard Library

const http = require('http');

const server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('Hello');
});

server.listen(60000, '127.0.0.1');

๊ตฌํ˜„์€ ๊ฐ„๊ฒฐํ•˜์ง€๋งŒ ๋‹จ์ผ ์Šค๋ ˆ๋“œ ์ด๋ฒคํŠธ ๋ฃจํ”„ ๋ชจ๋ธ์˜ ํ•œ๊ณ„๋กœ ์ธํ•ด ๋Œ€๊ทœ๋ชจ ๋™์‹œ์„ฑ ์ƒํ™ฉ์—์„œ ์ฝœ๋ฐฑ ์ง€์˜ฅ๊ณผ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์œ„ํ—˜์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ์—์„œ๋Š” Node.js ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋†’์€ ๋ถ€ํ•˜์—์„œ 811,908๊ฐœ์˜ ์‹คํŒจ ์š”์ฒญ์„ ๊ธฐ๋กํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿน Go Standard Library

package main

import (
    "fmt"
    "net/http"
)

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

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

Go์˜ ๊ณ ๋ฃจํ‹ด ๊ธฐ๋ฐ˜ ๋™์‹œ์„ฑ์€ ๊ฒฌ๊ณ ํ•œ ๊ธฐ๋ณธ ์„ฑ๋Šฅ(โ‰ˆโ€ฏ234โ€ฏkโ€ฏQPS)์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์™€ GC ํŠœ๋‹์„ ์œ„ํ•œ ์—ฌ์ง€๋Š” ์•„์ง ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿš€ Rust Standard Library

use std::io::Write;
use std::net::TcpListener;

fn main() -> std::io::Result<()> {
    let listener = TcpListener::bind("127.0.0.1:60000")?;
    for stream in listener.incoming() {
        let mut stream = stream?;
        stream.write_all(b"HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nHello")?;
    }
    Ok(())
}

Rust ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „์€ ์ €์ˆ˜์ค€ ์ œ์–ด์™€ ์ œ๋กœ ์ฝ”์ŠคํŠธ ์ถ”์ƒํ™”๋ฅผ ๋ณด์—ฌ์ฃผ๋ฉฐ, Keepโ€‘Alive wrk ํ…Œ์ŠคํŠธ์—์„œ 291,218โ€ฏQPS๋ฅผ ๋‹ฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

โšก Hyperlane Framework (Rust) โ€“ Sample Handler

use hyperlane::{Server, Request, Response};

async fn hello(_req: Request) -> Response {
    Response::new("Hello".into())
}

#[tokio::main]
async fn main() {
    let server = Server::bind("0.0.0.0:60000")
        .await
        .unwrap()
        .route("/", hello);
    server.run().await.unwrap();
}

Hyperlane์€ Tokio ์œ„์— ๊ตฌ์ถ•๋˜์—ˆ์œผ๋ฉฐ, ๊ณ ๋„๋กœ ์ตœ์ ํ™”๋œ ์š”์ฒญ ๋ผ์šฐํ„ฐ์™€ ์ œ๋กœ ๋ณต์‚ฌ I/O๋ฅผ ์ถ”๊ฐ€ํ•ด ์ „์†ก๋ฅ ์ด ๋›ฐ์–ด๋‚œ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ์š”์•ฝ

  1. Keepโ€‘Alive๊ฐ€ ์ค‘์š” โ€“ ์—ฐ๊ฒฐ์„ ํšจ์œจ์ ์œผ๋กœ ์žฌ์‚ฌ์šฉํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ(Tokio, Hyperlane)๊ฐ€ ๊ณ ์ฒ˜๋ฆฌ๋Ÿ‰ wrk ํ…Œ์ŠคํŠธ์—์„œ ์šฐ์„ธํ•ฉ๋‹ˆ๋‹ค.
  2. ์ „์†ก๋ฅ ์€ ์ˆจ๊ฒจ์ง„ ์ง€ํ‘œ โ€“ Hyperlane์€ QPS๊ฐ€ ์•ฝ๊ฐ„ ๋‚ฎ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  MB/s๊ฐ€ ๋” ๋†’์•„ ๋ฐ์ดํ„ฐ ํŽ˜์ด๋กœ๋“œ ์ฒ˜๋ฆฌ ๋Šฅ๋ ฅ์ด ์šฐ์ˆ˜ํ•จ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
  3. ๋‹จ๊ธฐ ์—ฐ๊ฒฐ์€ ๊ฒฉ์ฐจ๋ฅผ ์ค„์ž„ โ€“ Keepโ€‘Alive๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ฉด ์„ฑ๋Šฅ ์ฐจ์ด๊ฐ€ ํฌ๊ฒŒ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.
  4. ์–ธ์–ด ์ˆ˜์ค€ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์€ ์—ฌ์ „ํžˆ ๋’ค์ฒ˜์ง โ€“ ์ˆœ์ˆ˜ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„œ๋ฒ„(Node, Go, Rust)๋Š” ๋ชฉ์ ์— ๋งž๊ฒŒ ์„ค๊ณ„๋œ ํ”„๋ ˆ์ž„์›Œํฌ์— ๋’ค์ฒ˜์ง‘๋‹ˆ๋‹ค.

์ง€์—ฐ ์‹œ๊ฐ„์ด ์ค‘์š”ํ•œ ์„œ๋น„์Šค๋ฅผ ๊ตฌ์ถ•ํ•œ๋‹ค๋ฉด, Hyperlane(๋˜๋Š” ์œ ์‚ฌํ•˜๊ฒŒ ์ตœ์ ํ™”๋œ 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(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);
    }
}

Rust์˜ ์†Œ์œ ๊ถŒ ์‹œ์Šคํ…œ๊ณผ ์ œ๋กœโ€‘์ฝ”์ŠคํŠธ ์ถ”์ƒํ™”๋Š” ์‹ค์ œ๋กœ ๋›ฐ์–ด๋‚œ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Rust ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” 291,218.96โ€ฏQPS๋ฅผ ๋‹ฌ์„ฑํ–ˆ์œผ๋ฉฐ, ์ด๋Š” ์ด๋ฏธ ๋งค์šฐ ์ธ์ƒ์ ์ด์ง€๋งŒ, ๊ณ ๋™์‹œ์„ฑ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ์—ฐ๊ฒฐ ๊ด€๋ฆฌ์— ์•„์ง ์ตœ์ ํ™” ์—ฌ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๐ŸŽฏ Performance Optimization Strategy Analysis

๐Ÿ”ง Connection Management Optimization

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

๐Ÿš€ Memory Management Optimization

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

โšก Asynchronous Processing Optimization

Tokio๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์—์„œ ์ข‹์€ ์„ฑ๋Šฅ์„ ๋ณด์ด์ง€๋งŒ, ์ž‘์—… ์Šค์ผ€์ค„๋ง ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๊ทนํ•œ ๋™์‹œ์„ฑ ์ƒํ™ฉ์—์„œ ๋ณ‘๋ชฉ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Hyperlane์€ ์‹œ์Šคํ…œ ๋ถ€ํ•˜์— ๋”ฐ๋ผ ์ž‘์—… ํ• ๋‹น์„ ๋™์ ์œผ๋กœ ์กฐ์ •ํ•˜๋Š” ๋ณด๋‹ค ์ง„๋ณด๋œ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•ด ๊ธ‰์ฆ ํŠธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ ๋Šฅ๋ ฅ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

๐ŸŽฏ ์‹ค์šฉ์ ์ธ ์ ์šฉ ๊ถŒ์žฅ ์‚ฌํ•ญ

๐Ÿช ์ „์ž์ƒ๊ฑฐ๋ž˜ ์›น์‚ฌ์ดํŠธ

  • ๊ถŒ์žฅ ์‚ฌํ•ญ: ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ์‹œ์Šคํ…œ(์ƒํ’ˆ ๊ฒ€์ƒ‰, ์ถ”์ฒœ, ์ฃผ๋ฌธ ์ฒ˜๋ฆฌ)์— Hyperlane์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ์ •์  ์ž์‚ฐ: Nginx์™€ ๊ฐ™์€ ์ „์šฉ ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ์ œ๊ณตํ•˜์‹ญ์‹œ์˜ค.

๐Ÿ’ฌ ์†Œ์…œ ํ”Œ๋žซํผ

  • ๊ถŒ์žฅ ์‚ฌํ•ญ: Hyperlane์œผ๋กœ ๋ฉ”์‹œ์ง€ ํ‘ธ์‹œ ์„œ๋น„์Šค๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ , ์‹ค์‹œ๊ฐ„ ์ „๋‹ฌ์„ ์œ„ํ•ด Redis์™€ ๊ฐ™์€ ์ธโ€‘๋ฉ”๋ชจ๋ฆฌ ์Šคํ† ์–ด๋ฅผ ๊ฒฐํ•ฉํ•˜์„ธ์š”.
  • ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง: GraphQL ๋˜๋Š” ์œ ์‚ฌ ๊ธฐ์ˆ ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

๐Ÿข ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜

  • ๊ถŒ์žฅ ์‚ฌํ•ญ: ํ•ต์‹ฌ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด Hyperlane์„ ๋ฐฐํฌํ•˜๊ณ , PostgreSQL๊ณผ ๊ฐ™์€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๋™ํ•˜์„ธ์š”.
  • CPU ์ง‘์•ฝ์  ์ž‘์—…: Hyperlane์˜ ๋น„๋™๊ธฐ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์‹ญ์‹œ์˜ค.

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

๐Ÿš€ ๊ทนํ•œ ์„ฑ๋Šฅ

ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ํ•˜๋“œ์›จ์–ด๊ฐ€ ๋ฐœ์ „ํ•จ์— ๋”ฐ๋ผ ๋ฐฑ๋งŒ ์ˆ˜์ค€ QPS์™€ ๋งˆ์ดํฌ๋กœ์ดˆ ์ˆ˜์ค€ ์ง€์—ฐ์„ ๋ชฉํ‘œ๋กœ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๐Ÿ”ง ๊ฐœ๋ฐœ ๊ฒฝํ—˜ ์ตœ์ ํ™”

์ˆœ์ˆ˜ ์†๋„๋ฅผ ๋„˜์–ด, ๋ณด๋‹ค ํ’๋ถ€ํ•œ ๋””๋ฒ„๊น…, ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ IDE ํ†ตํ•ฉ์ด ํ‘œ์ค€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๐ŸŒ ํด๋ผ์šฐ๋“œโ€‘๋„ค์ดํ‹ฐ๋ธŒ ์ง€์›

๋‚ด์žฅํ˜• ์ปจํ…Œ์ด๋„ˆํ™”, ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ, ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ, ์„œํ‚ท ๋ธŒ๋ ˆ์ดํ‚น ๋“ฑ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์นœํ™”์ ์ธ ๊ธฐ๋Šฅ์ด ์ ์  ๋” ์ผ๋ฐ˜ํ™”๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๐ŸŽฏ ์š”์•ฝ

ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ํ˜„๋Œ€ ์›น ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์„ฑ๋Šฅ ์ž ์žฌ๋ ฅ์ด ์žฌํ™•์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Hyperlane์˜ ๋“ฑ์žฅ์€ Rust๊ฐ€ ์›น ๊ฐœ๋ฐœ์—์„œ ์–ด๋–ค ์—ญ๋Ÿ‰์„ ๋ฐœํœ˜ํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋ฒค์น˜๋งˆํฌ์—์„œ๋Š” Tokio๊ฐ€ ์•ž์„œ์ง€๋งŒ, Hyperlane์€ ์ „๋ฐ˜์ ์ธ ์„ฑ๋Šฅ๊ณผ ์•ˆ์ •์„ฑ์—์„œ ๋” ์šฐ์ˆ˜ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์„ ํƒํ•  ๋•Œ๋Š” ์ˆœ์ˆ˜ํ•œ ์ง€ํ‘œ๋ฟ ์•„๋‹ˆ๋ผ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜, ์ƒํƒœ๊ณ„, ์ปค๋ฎค๋‹ˆํ‹ฐ ์ง€์› ๋“ฑ์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Hyperlane์€ ์ด๋Ÿฌํ•œ ๋ชจ๋“  ์ธก๋ฉด์—์„œ ์ข‹์€ ์ ์ˆ˜๋ฅผ ๋ฐ›์œผ๋ฉฐ ์‹œ๋„ํ•ด ๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์›น ๊ฐœ๋ฐœ์˜ ๋ฏธ๋ž˜๋Š” ์ ์  ๋” ์„ฑ๋Šฅ๊ณผ ํšจ์œจ์„ฑ์— ์ดˆ์ ์„ ๋งž์ถœ ๊ฒƒ์ด๋ฉฐ, Hyperlane์€ ๊ทธ ์ค‘์‹ฌ์—์„œ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•  ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.


GitHub Homepage: https://github.com/hyperlane-dev/hyperlane

Back to Blog

๊ด€๋ จ ๊ธ€

๋” ๋ณด๊ธฐ ยป

๐Ÿš€_๊ถ๊ทน์˜_Web_Framework_์†๋„_๋Œ€๊ฒฐ

10๋…„์˜ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์„ ๊ฐ€์ง„ ํ’€์Šคํƒ ์—”์ง€๋‹ˆ์–ด๋กœ์„œ ๋‚˜๋Š” ์ˆ˜๋งŽ์€ ์›น ํ”„๋ ˆ์ž„์›Œํฌ์˜ ํฅ๋ง์„ฑ์‡ ๋ฅผ ๋ชฉ๊ฒฉํ•ด ์™”์Šต๋‹ˆ๋‹คโ€”์ดˆ๊ธฐ jQuery ์‹œ๋Œ€๋ถ€ํ„ฐ ์˜ค๋Š˜๊นŒ์ง€.