웹 서버에 대한 Node.js 대 Rust 성능
13228 단어 rustnodebenchmarkperformance
자바스크립트 안전지대를 벗어남
저는 지난 몇 년 동안 Javascript만 사용해 왔습니다.
일반적으로 백엔드 성능을 최적화하려고 할 때 캐싱, 코드 최적화, DB 성능, CDN, 스케일링…
그러나 일부 마이크로 서비스가 Rust와 같은 다른 언어로 제공될 수 있다면 얼마나 많은 이득을 얻을 수 있을지 궁금했습니다.
프로젝트를 찾고 Node.js와 Rust 백엔드를 만들고 둘을 비교해 봅시다.
웹 서버: URL 단축기
URL 단축기가 이 테스트에 매우 적합하다고 생각합니다. 응용 프로그램은 하나의 경로가 있는 웹 서버가 될 것이며 짧은 ID를 수신하고 데이터베이스에서 조회하여 리디렉션할 해당 긴 URL을 찾습니다.
애플리케이션의 아키텍처는 다음과 같습니다.
테스트 조건: Node.js와 Rust 웹 서버 모두 동일한 클라우드 인프라를 사용하고 있습니다. 둘 다 동일한 Ram/CPU를 가진 하나의 인스턴스일 뿐입니다.
녹 코드
나는 Rust의 초보자이지만 Rocket은 이 경험에 적합한 웹 서버인 것 같습니다. 또한 aws는 Rust SDK의 미리 보기를 게시한 것 같습니다.
#[macro_use] extern crate rocket;
use rocket::response::Redirect;
use rocket::http::Status;
use rocket::State;
struct AppState {
client: aws_sdk_dynamodb::Client
}
#[get("/<id>")]
async fn get_redirect_url(id: &str, state: &State<AppState>) -> Result<Redirect, Status> {
match state.client
.get_item()
.table_name("table_name")
.key("id", aws_sdk_dynamodb::model::AttributeValue::S(id.to_string()))
.send()
.await
{
Ok(resp) => {
match resp.item.unwrap_or_default().get("url") {
None => Err(Status::NotFound),
Some(url) => Ok(Redirect::to(url.as_s().unwrap().clone()))
}
}
Err(_e) => Err(Status::InternalServerError)
}
}
#[launch]
async fn rocket() -> _ {
let shared_config = aws_config::load_from_env().await;
let client = aws_sdk_dynamodb::Client::new(&shared_config);
rocket::build().manage(AppState { client: client }).mount("/", routes![get_redirect_url, health])
}
Node.js 코드
Node.js의 동일한 코드에서 fastify가 express보다 성능이 더 좋은 것 같으니 모든 기회를 우리 쪽에서 유지하고 사용합시다.
const fastify = require('fastify')()
const AWS = require('aws-sdk');
const dynamo = new AWS.DynamoDB.DocumentClient();
fastify.get('/:routeId', async (request, reply) => {
const {Item} = await dynamo.get({
TableName: "table_name",
Key: {
"id": request.params.routeId,
}
}).promise();
if (Item) {
reply.redirect(303, Item.url)
} else {
reply.code(404).type('text/html').send('Not Found')
}
})
const start = async () => {
try {
console.log("starting fastify");
await fastify.listen({
port: 8000,
})
} catch (err) {
fastify.log.error(err)
process.exit(1)
}
}
start()
성능 테스트
두 애플리케이션 모두 이제 aws 클라우드에서 실행 중이며 테스트할 준비가 되었습니다. k6은 훌륭한 부하 테스트 도구인 것 같습니다. 보너스 포인트 구성 파일은 Javascript에 있습니다.
이것은 사용자가 요청을 하고 리디렉션되는 평균 시간입니다(다른 네트워크 유형에서 유사한 조건에서 테스트됨).
Rust가 승자이지만 URL 단축 요청에 대한 45ms는 정말 훌륭합니다. 내 JS 안전 지대에서 벗어나기에는 충분하지 않습니다.
이제 진지한 일에 들어가 동시에 여러 사용자와 부하 테스트를 해봅시다.
부하 테스트 설정:
녹에 대한 엄청난 승리! 트래픽이 많을 때 node.js 애플리케이션은 많은 요청을 전달하지 않았고 요청 지속 시간이 길면 사용자 경험이 좋지 않을 수 있습니다.
애플리케이션 서버의 자동 크기 조정을 통해 node.js는 50ms 미만의 응답 시간을 유지할 수 있었지만 이는 더 높은 비용을 의미합니다.
Rust 웹 프레임워크는 Node.js가 단일 스레드인 반면 Rust 웹 프레임워크는 여러 스레드를 사용한다는 것은 불공평한 비교가 아닙니까?
고부하 node.js CPU가 100% 용량(30~50% 사이)이 아니었던 것은 사실이지만 여러 스레드를 사용하도록 코드를 전환하더라도 충분하지 않았을 것입니다. 또한 내가 일한 모든 곳에서 우리는 항상 프로덕션에서 단일 스레드 node.js 애플리케이션을 사용했습니다.
결론
Javascript에 대한 내 경험과 생태계의 모든 훌륭한 도구로 인해 Javascript가 웹 백엔드를 위해 내가 선택한 언어로 남아있을 것이지만, 소규모 및 대용량 마이크로 서비스에서 Rust를 사용하는 것을 확실히 고려할 것입니다!
Reference
이 문제에 관하여(웹 서버에 대한 Node.js 대 Rust 성능), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/gfauchart/nodejs-vs-rust-performance-for-webservers-3npg텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)