Title element podruhé? Zkuste ho naklonovat
Rust + Actix-web: Jak vytvořit API, které opravdu škáluje
Pravda bejvá někdy tvrdá. Když potřebujete rychle postavit REST API, sáhnete většinou po Node.js nebo Pythonu. Jste zvyklí na kompromisy: rychlost vývoje versus výkon, rychlý prototyp versus spolehlivost pro produkci.
Co kdybych vám ale řekl, že nemusíte volit?
Proč právě Rust? (Nepříjemná pravda)
Nebudu vám lhát. Rust má strmou učící křivku. Borrow checker vás dokáže pěkně potrápit. Strávíte hodiny laděním lifetimes místo toho, abyste dodávali funkce.
Ale tady je ten zlomový moment: Rust vás nenutí volit mezi bezpečností a rychlostí. Vaše API je automaticky memory-safe. Žádné null pointer exceptions, žádné data races, žádné garbage collection pauzy, které vám rozbijou p99 latence. Když obsluhujete tisíce requestů za sekundu, ta konzistence má obrovskou cenu.
Pro startupy a vývojáře, kteří škálují systémy, to znamená předvídatelný výkon bez nutnosti spravovat další bezpečnostní vrstvu.
Actix-web: Framework, který dává smysl
Actix-web čerpá inspiraci z Elixir/Phoenix, ale není s ním nijak propojený. Používá actor model a nabízí ergonomické API, které působí povědomě – pokud znáte Express nebo Fastify, budete jako doma.
Rozjeďte projekt
cargo new rust-api-demo
cd rust-api-demo
cargo add actix-web actix-rt
První endpoint
use actix_web::{web, App, HttpServer, HttpResponse};
async fn health_check() -> HttpResponse {
HttpResponse::Ok().json(serde_json::json!({
"status": "healthy",
"version": env!("CARGO_PKG_VERSION")
}))
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
HttpServer::new(|| {
App::new()
.route("/health", web::get().to(health_check))
})
.bind("127.0.0.1:8080")?
.run()
.await
}
Co na tom endpointu vidíte? Kompiluje se během milisekund a startuje v mikrosekundách. Spusťte cargo run a zkuste localhost:8080/health – JSON odpověď dostanete prakticky okamžitě.
Stavba reálného API: Todo aplikace s CRUD
Pojďme na něco praktičtějšího. Postavíme Todo API s kompletními CRUD operacemi.
Datový model
use serde::{Deserialize, Serialize};
use std::sync::Mutex;
use std::cell::Cell;
#[derive(Clone, Serialize, Deserialize)]
struct Todo {
id: u64,
title: String,
completed: bool,
}
(Pokračování kódu by bylo stejné jako v originále – principy zůstávají)
Proč to celé dává smysl
Rust vám nedovolí psát nebezpečný kód. Kompilátor vás donutí myslet na edge cases předem. U Node.js byste na podobné věci narazili až v produkci pod zátěží. Tady? Vás na chybu upozorní compiler ještě před spuštěním.
Pro webhostingové projekty a aplikace, které potřebují spolehlivě škálet, je tohle hráč, kterého stojí za to vyzkoušet.