Cosa può fare un server da €40
Oltre 4 milioni di aziende e decine di milioni di record. Un singolo server. Nessun microservizio, nessun Kubernetes, nessun buzzword.
Test live
100 query reali, 20 in parallelo, contro il database di produzione
Premi il pulsante per eseguire 100 query reali e misurare la capacità del server.
Metodologia
Cosa misuriamo
Il test di capacità esegue 100 query reali (ricerca aziende, ricerca persone, dettagli CUI, IBAN), 20 alla volta, contro il database di produzione con oltre 4 milioni di aziende, rappresentanti e decine di milioni di record interconnessi. La stima degli utenti concorrenti assume che un utente reale faccia in media 1 richiesta ogni 3 secondi (caricamento pagina + tempo di riflessione).
Come misuriamo
Le funzioni di query vengono chiamate direttamente sul server (senza overhead HTTP), e il tempo viene misurato con performance.now() — risoluzione sub-millisecondo. I risultati includono solo il tempo di elaborazione del server, non la latenza di rete.
Formula
utenti concorrenti = richieste/secondo × 3s (tempo medio tra azioni)
Perché è importante
Un server da €40/mese con un database ben indicizzato e Bun come runtime può servire migliaia di utenti concorrenti. Nessun microservizio, nessun Kubernetes, nessuna infrastruttura da milioni di euro necessaria.
Quanto costa altrove
Lo stesso server (8 vCPU, 16 GB RAM) presso diversi provider — prezzi mensili, senza sconti
Gli hyperscaler (AWS, Google, Azure) offrono servizi gestiti, ma per un portale con un database ben indicizzato, un semplice VPS offre le stesse prestazioni a una frazione del costo.
Testalo tu stesso
Installa k6 (open source, binario singolo) ed esegui lo script qui sotto.
import http from 'k6/http';
import { check, sleep } from 'k6';
// 50 utilizatori virtuali, 30 secunde
export const options = {
stages: [
{ duration: '10s', target: 50 },
{ duration: '15s', target: 50 },
{ duration: '5s', target: 0 },
],
};
const BASE = 'https://demoanaf.ro';
const SEARCHES = ['construct', 'transport', 'consult', 'auto', 'euro'];
const PEOPLE = ['pop', 'ion', 'maria', 'gheorghe'];
const CUIS = [33503335, 4221306, 14399840, 18189442];
function pick(arr) { return arr[Math.floor(Math.random() * arr.length)]; }
export default function () {
const roll = Math.random();
let res;
if (roll < 0.4)
res = http.get(BASE + '/api/search?q=' + pick(SEARCHES) + '&limit=10');
else if (roll < 0.65)
res = http.get(BASE + '/api/company/' + pick(CUIS));
else if (roll < 0.85)
res = http.get(BASE + '/api/search/people?q=' + pick(PEOPLE) + '&limit=10');
else
res = http.get(BASE + '/api/iban?q=timis');
check(res, {
'status 200': (r) => r.status === 200,
'response < 500ms': (r) => r.timings.duration < 500,
});
sleep(0.5);
}I tuoi risultati includeranno la latenza di rete — i nostri vengono misurati direttamente sul server. Lo script usa 50 utenti virtuali per 30 secondi, con una pausa di 0,5s tra le richieste.