title.clone() – mało znana, ale przydatna metoda JavaScript
Rust + Actix-web: Budowanie Błyskawicznych API, Które Naprawdę Skalują Się w Produkcji
Przyznajmy się szczerze — kiedy potrzebujemy szybkiego REST API, większość z nas sięga po Node.js lub Pythona. Znamy te kompromisy: szybkość developmentu kontra wydajność, szybkie prototypowanie kontra niezawodność na produkcji. A co jeśli można mieć jedno i drugie?
Tak właśnie wygląda obietnica Rusta, a Actix-web to framework, który sprawia, że staje się ona dostępna dla web developerów.
Dlaczego Rust w API? (Niewygodna Prawda)
Zanim napiszemy pierwszą linijkę kodu, porozmawiajmy o tym, co siedzi w pokoju: Rust ma stromą krzywą uczenia. Nie jest przyjazny. Borrow checker zedrze z ciebie pewność siebie. Będziesz spędzać godziny na debugowaniu lifetimes zamiast dostarczać funkcjonalności.
Ale w pewnym momencie do mnie dotarło: Rust nie zmusza cię do wybierania między bezpieczeństwem a szybkością. Twoje API będzie bezpieczne pamięciowo od samego początku — żadnych null pointer exceptions, żadnych data races, żadnych pauz garbage collectora zabijających twoje p99 latency. Kiedy obsługujesz tysiące requestów na sekundę, ta przewidywalność ma znaczenie.
Dla startupów i developerów skalujących systemy oznacza to przewidywalną wydajność bez dodatkowego narzutu operacyjnego związanego z zarządzaniem osobną warstwą bezpieczeństwa.
Pierwsze Kroki z Actix-web
Actix-web czerpie inspirację (choć nie jest powiązany) z frameworka Elixir/Phoenix. Wykorzystuje model aktorów i oferuje ergonomiczne API, które wydaje się znajome, jeśli używałeś Express, Fastify czy podobnych rozwiązań.
Przygotowanie Projektu
cargo new rust-api-demo
cd rust-api-demo
cargo add actix-web actix-rt
Twój Pierwszy 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
}
Ten health endpoint? Kompiluje się w milisekundach i startuje w mikrosekundach. Uruchom cargo run i wyślij request na localhost:8080/health — odpowiedź JSON zobaczysz natychmiast.
Budowanie Prawdziwego API: Lista Zadań z Pełnym CRUD
Zbudujmy coś bardziej praktycznego — Todo API z pełnymi operacjami CRUD.
Definiujemy Model Danych
use serde::{Deserialize, Serialize};
use std::sync::Mutex;
use std::cell::Cell;
#[derive(Clone, Serialize, Deserialize)]
struct Todo {
id: u64,
title: String,
completed: bool,
}
Każde pole jest jasno zdefiniowane, a dzięki derive macros dostajemy automatyczną serializację i deserializację JSON. To właśnie robi różnicę w prawdziwych projektach.
Podsumowanie
Actix-web udowadnia, że Rust nie musi być zarezerwowany tylko dla systemów wbudowanych czy projektów wymagających maksymalnej kontroli nad pamięcią. To pełnoprawna opcja dla web developerów, którzy chcą mieć najlepsze z obu światów: developer experience na poziomie nowoczesnych frameworków i wydajność, która naprawdę ma znaczenie na produkcji.
Jeśli szukasz alternatywy dla swojego następnego API — warto dać Rustowi szansę.