Non abbiamo gestito noi stessi questa panchina: si tratta di dati di terze parti, pubblici, di provenienza e datati. Questo articolo descrive in dettaglio cosa dicono, la metodologia alla base e cosa cambia effettivamente per una scelta di backend, non un confronto tra Aurabase e un concorrente.
Il nucleo di Aurabase viene eseguito in Rust, su axum e tokio — verificato in Cargo.toml del monorepo, dieci servizi che condividono la stessa dipendenza. Ma finora non abbiamo pubblicato alcun dato sulle nostre prestazioni. Se stai cercando una latenza Aurabase precisa, non esiste ancora: la metodologia verrà prima del numero, non viceversa.
L'essenziale
- Su Sharkbench (community bench, Ryzen 7 7800X3D, Docker/Linux, 24/08/2025): Actix, Hyper, Axum e Rocket funzionano tutti tra 18.047 e 21.965 req/s a 1,4-1,7 ms. Fastify, Koa ed Express limitano tra 5.766 e 9.340 req/s sul lato Node.js, a 3,4-5,5 ms.
- Il runtime pesa tanto quanto il linguaggio: lo stesso codice Express passa da 5.766 req/s su Node.js a 18.917 req/s su Bun — un fattore ×3,3 senza cambiare una riga.
- Il gap di memoria è il più evidente: 8,5 MB per Axum contro 82,5 MB per Express/Node.js, coerente con l'assenza del garbage collector di Rust.
- Aurabase non ha pubblicato alcun proprio benchmark fino ad oggi. Il core Rust/axum/tokio viene controllato nel codice, non nelle prestazioni.
- Un dato isolato non dimostra nulla: hardware, versione del framework, dimensione del payload e livello di concorrenza variano la classifica più della sola lingua.
Cosa mostra una recente panchina di terzi
Sharkbench è un progetto di comunità indipendente che misura tre cose: la capacità di un framework di gestire richieste HTTP simultanee, operazioni di I/O e serializzazione JSON. Il test viene eseguito sotto Docker/Linux su un Ryzen 7 7800X3D, con un ultimo aggiornamento pubblico il 24 agosto 2025 (sharkbench.dev/web, accesso il 24 agosto 2026).
Fonte: Sharkbench, 24 agosto 2025 - Docker/Linux, Ryzen 7 7800X3D.
Axum, il framework utilizzato da Aurabase per il suo core Rust, verificato in Cargo.toml, elabora 21.030 richieste al secondo su questo banco. Express, il framework Node.js più utilizzato in produzione, ne elabora 5.766 sullo stesso hardware: un fattore 3,6. Questo non è un caso isolato. I quattro framework Rust testati rientrano tutti in un intervallo ristretto compreso tra 18.000 e 22.000 req/s, mentre i tre framework Node.js testati raggiungono un limite compreso tra 5.766 e 9.340.
In pratica, “req/s” misura il throughput in condizioni di carico simultaneo sostenuto, non la velocità di una richiesta isolata su un sito a basso traffico. Per un endpoint chiamato una volta ogni pochi secondi, la differenza non viene mai vista. Diventa decisivo su un endpoint caldo – un flusso in tempo reale, un’API pubblica con traffico intenso, un lavoro che mette insieme migliaia di chiamate – dove il numero di richieste elaborate per core della CPU, a parità di hardware, determina direttamente il conto dell’infrastruttura.
La latenza segue lo stesso schema
La latenza media segue la stessa gerarchia su questo banco: da 1,4 a 1,7 ms per i framework Rust testati, rispetto a 3,4 - 5,5 ms per i framework Node.js testati.
Fonte: Sharkbench, 24 agosto 2025 — latenza media, non p99.
Questa cifra è una media, non un p99. Le pause inutili in un runtime gestito influiscono principalmente sulla coda di invio: le richieste più lente, non la mediana. Questo è l'argomento di un articolo dedicato in questa serie: perché l'assenza del garbage collector modifica la latenza p99.
Perché Rust non ha una pausa GC da pagare
Rust gestisce la memoria in base alla proprietà, controllata in fase di compilazione: nessun garbage collector in esecuzione in background che interrompe l'esecuzione. Il Rust Book ufficiale lo riassume come segue: "Nessuna delle funzionalità di proprietà rallenterà il tuo programma mentre è in esecuzione" (The Rust Programming Language, doc.rust-lang.org, accesso il 24 agosto 2026). La memoria viene liberata non appena la variabile che la possiede esce dall'ambito: un momento noto in fase di compilazione, non una pausa imprevedibile in fase di esecuzione.
Node.js, al contrario, viene eseguito su un singolo thread JavaScript e delega le operazioni di I/O al kernel tramite un loop di eventi multifase (timer, callback differiti, poll, controllo...) - ma qualsiasi calcolo sincrono su quel thread, incluso un passaggio di garbage collection dal motore V8, blocca l'esecuzione durante l'esecuzione (documentazione ufficiale di Node.js, nodejs.org, accesso il 24 agosto 2026). Si tratta di una differenza nel modello di memoria, non di un dettaglio di implementazione.
La vera sorpresa: il runtime pesa tanto quanto la lingua
Il risultato più controintuitivo della stessa analisi non riguarda Rust: riguarda lo stesso Node.js. Express - lo stesso codice, la stessa API - passa da 5.766 req/s su Node.js a 18.917 req/s su Bun, un fattore pari a ×3,3, senza modificare una riga di codice dell'applicazione (Sharkbench, 24 agosto 2025).
Fonte: Sharkbench, 24 agosto 2025: stesso codice Express, tre runtime JavaScript.
Su Deno, questo stesso codice Express ha un limite di 6.088 req/s, vicino a Node.js, lontano da Bun. Il linguaggio JavaScript è identico in tutti e tre i casi; È il runtime – il suo motore JS, l’implementazione del loop di eventi, la sua garbage collection – che cambia il gioco. Confrontare "Rust" con "Node.js" senza specificare runtime, versione e framework è come confrontare configurazioni, non lingue.
Su questo stesso banco, il framework Go Gin raggiunge il picco a 3.546 req/s mentre FastHTTP — sempre in Go — sale a 5.567 req/s con una latenza di soli 0,7 ms (Sharkbench, 24 agosto 2025). Due risultati molto diversi per una sola lingua: una figura isolata non riassume mai un intero ecosistema.
Perché un unico numero di riferimento non è mai sufficiente
TechEmpower Framework Benchmarks illustra la stessa idea su scala più ampia. Il suo repository open source è stato aggiornato il 24 marzo 2026 e il suo round più recente (round 23) è stato oggetto di un post datato 16 marzo 2026 (TechEmpower, accesso il 24 agosto 2026). Questo progetto esegue molti tipi di test su centinaia di implementazioni, proprio perché un singolo test non rappresenta mai un framework, tanto meno un linguaggio.
Convex, attore nel mercato dei database, ha formulato la posizione più chiara sull'argomento: rifiutandosi di partecipare alla “guerra dei grafici a barre” di marketing tra database concorrenti, ritenuta fuorviante. "È un teatro in scala, non in scala", scrive il team (Convex, accesso il 24 agosto 2026). Condividiamo questa lettura: un semplice dato, senza una metodologia pubblicata, non prova nulla, né per un concorrente, né per noi.
Ciò che cambia in termini concreti: hardware (CPU, RAM), versione esatta del framework e del runtime, dimensione del payload JSON, livello di concorrenza e durata del test variano tutti la classifica, a volte più della scelta della lingua stessa. Un banco che non pubblica questi parametri non si riproduce, quindi non verifica se stesso: consulta la nostra metodologia completa e riproducibile per il benchmarking di un backend.
E Aurabase in tutto questo?
Il backend principale di Aurabase è scritto in Rust, su axum e tokio — controllato in Cargo.toml del monorepo: dieci servizi (aura-gateway, aura-auth, aura-db…) condividono la stessa dipendenza dello spazio di lavoro axum (0.8) e lo stesso runtime tokio, nell'edizione 2021. Il gateway che instrada il traffico del piano dati e del piano di gestione si basa su hyper oltre ad axum: i dettagli completi sono nel nostro articolo su l'architettura del piano dati/piano di gestione del gateway. La struttura dell'area di lavoro Cargo che supporta questi dieci servizi è documentata nel il nostro articolo sull'area di lavoro Cargo.
Ciò che non disponiamo ancora è un dato pubblicato sul throughput o sulla latenza di Aurabase con metodologia e hardware documentati. Questo è intenzionale: preferiamo pubblicare la metodologia prima della figura piuttosto che il contrario – questo sarà l’argomento di un futuro articolo di questa serie.
Per il confronto completo dell'architettura — core Rust unificato presso Aurabase rispetto allo stack eterogeneo Elixir/Go/TypeScript/Node documentato presso un concorrente diretto — consulta il nostro confronto dettagliato Aurabase vs Supabase. Se stai già eseguendo la migrazione di un progetto, la guida alla migrazione da Supabase ad Aurabase copre lo schema, le policy RLS e l'SDK.
Appendice: tabella dati completa
Tutte le righe citate in questo articolo, come pubblicate da Sharkbench il 24 agosto 2025 (Docker/Linux, Ryzen 7 7800X3D).
| Quadro | Durata | Richiesta/i | Latenza | Memoria |
|---|---|---|---|---|
| Actix | Ruggine | 21 965 | 1,4 ms | 16,6MB |
| Iper | Ruggine | 21 781 | 1,5 ms | 8,6MB |
| Axum | Ruggine | 21 030 | 1,6 ms | 8,5MB |
| Razzo | Ruggine | 18 047 | 1,7 ms | 6,4MB |
| Fastificare | Node.js | 9 340 | 3,4 ms | 57,0MB |
| Koa | Node.js | 8 828 | 3,6 ms | 53,3MB |
| Espresso | Node.js | 5 766 | 5,5 ms | 82,5MB |
| Espresso | Panino | 18 917 | 1,3 ms | 53,3MB |
| Espresso | Deno | 6 088 | 5,0 ms | 130,7MB |
| Gin | Vai | 3 546 | 1,0 ms | 16,7MB |
| HTTP veloce | Vai | 5 567 | 0,7 ms | 13,4MB |
Citare questi dati: Sharkbench, "Web Framework Benchmarks", sharkbench.dev/web, ultimo aggiornamento 24 agosto 2025.
Domande frequenti
Cosa ricordare
Nel benchmark qui citato, i framework Rust funzionano tutti in un intervallo ristretto - da 18.000 a 22.000 req/s, 1,4-1,7 ms - molto più avanti dei framework Node.js su Node.js stesso (5.766-9.340 req/s, 3,4-5,5 ms). Ma il runtime cambia la situazione tanto quanto la lingua: Express su Bun quasi raggiunge Axum su Rust.
Se valuti un backend solo in base alle prestazioni grezze, richiedi la metodologia prima del numero: hardware, versione, dimensione del carico utile, livello di concorrenza. Aurabase non ha ancora diffuso i propri dati; quando ciò avverrà, la metodologia verrà prima di tutto.