Πώς να κλωνοποιήσεις τον τίτλο της ιστοσελίδας σου χωρίς πονοκέφαλο
Rust + Actix-web: API που Πετάνε και σε Κλίμακα Παραγωγής
Ας είμαστε ειλικρινείς—οι περισσότεροι από εμάς πιάνουμε Node.js ή Python για ένα γρήγορο REST API. Ξέρουμε τις ανταλλαγές: ταχύτητα ανάπτυξης αντί απόδοσης, γρήγορο prototyping αντί για αξιοπιστία στην παραγωγή. Τι θα γινόταν όμως αν μπορούσαμε να τα έχουμε και τα δύο;
Αυτή είναι η υπόσχεση της Rust, και το Actix-web είναι το framework που την κάνει προσβάσιμη σε web developers.
Γιατί Rust για APIs; (Η Άβολη Αλήθεια)
Πριν γράψουμε μια γραμμή κώδικα, ας αντιμετωπίσουμε το ελέφαντα στο δωμάτιο: η Rust έχει learning curve. Δεν είναι ευγενική. Ο borrow checker θα σε ταπεινώσει. Θα περάσεις ώρες debuggando lifetimes αντί να παραδίδεις features.
Αλλά εδώ είναι τι με έπεισε: η Rust δεν σε αναγκάζει να διαλέξεις μεταξύ ασφάλειας και ταχύτητας. Το API σου θα είναι memory-safe by default—χωρίς null pointer exceptions, χωρίς data races, χωρίς garbage collection pauses που σκοτώνουν τα p99 latencies σου. Όταν σερβίρεις χιλιάδες requests ανά δευτερόλεπτο, αυτή η συνέπεια έχει σημασία.
Για startups και developers που κλιμακώνουν συστήματα, αυτό σημαίνει προβλέψιμη απόδοση χωρίς το operational overhead της διαχείρισης ενός ξεχωριστού safety layer.
Πρώτα Βήματα με το Actix-web
Το Actix-web είναι εμπνευσμένο από (αλλά δεν σχετίζεται με) το Elixir/Phoenix framework. Αγκαλιάζει τον actor model και παρέχει ένα ergonomic API που νιώθει οικείο αν έχεις χρησιμοποιήσει Express, Fastify ή παρόμοια frameworks.
Φτιάχνοντας το Project σου
cargo new rust-api-demo
cd rust-api-demo
cargo add actix-web actix-rt
Το Πρώτο σου 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
}
Εκείνο το health endpoint; Κάνει compile σε milliseconds και ξεκινάει σε microseconds. Τρέξε cargo run και χτύπα το localhost:8080/health—θα δεις το JSON response σου αμέσως.
Φτιάχνοντας Ένα Πραγματικό API: Todos με CRUD Operations
Ας φτιάξουμε κάτι πιο πρακτικό—ένα Todo API με πλήρεις CRUD operations.
Ορίζοντας το Data Model
use serde::{Deserialize, Serialize};
use std::sync::Mutex;
use std::cell::Cell;
#[derive(Clone, Serialize, Deserialize)]
struct Todo {
id: u64,