Was ein 40-€-Server leisten kann
Über 4 Millionen Unternehmen und Dutzende Millionen Datensätze. Ein einziger Server. Keine Microservices, kein Kubernetes, keine Buzzwords.
Live-Test
100 echte Abfragen, 20 gleichzeitig, gegen die Produktionsdatenbank
Drücken Sie den Button, um 100 echte Abfragen auszuführen und die Serverkapazität zu messen.
Methodik
Was wir messen
Der Kapazitätstest führt 100 echte Abfragen (Unternehmenssuche, Personensuche, CUI-Details, IBAN) durch, 20 gleichzeitig, gegen die Produktionsdatenbank mit über 4 Millionen Unternehmen, Vertretern und Dutzenden Millionen verknüpfter Datensätze. Die Schätzung der gleichzeitigen Nutzer geht davon aus, dass ein echter Nutzer durchschnittlich 1 Anfrage alle 3 Sekunden stellt (Seitenladezeit + Denkzeit).
Wie wir messen
Abfragefunktionen werden direkt auf dem Server aufgerufen (ohne HTTP-Overhead), und die Zeit wird mit performance.now() gemessen – mit Submillisekunden-Auflösung. Die Ergebnisse enthalten nur die Server-Verarbeitungszeit, nicht die Netzwerklatenz.
Formel
gleichzeitige Nutzer = Anfragen/Sek. × 3 Sek. (Durchschn. Zeit zwischen Aktionen)
Warum es relevant ist
Ein 40 €/Monat-Server mit einer gut indizierten Datenbank und Bun als Laufzeitumgebung kann Tausende gleichzeitiger Nutzer bedienen. Keine Microservices, kein Kubernetes, keine Millionen-Euro-Infrastruktur notwendig.
Was es anderswo kostet
Der gleiche Server (8 vCPU, 16 GB RAM) bei verschiedenen Anbietern – monatliche Preise ohne Rabatte
Hyperscaler (AWS, Google, Azure) bieten verwaltete Dienste an, aber für ein Portal mit einer gut indizierten Datenbank liefert ein einfacher VPS die gleiche Leistung zu einem Bruchteil der Kosten.
Selbst testen
Installieren Sie k6 (Open Source, einzelnes Binary) und führen Sie das Skript unten aus.
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);
}Ihre Ergebnisse enthalten Netzwerklatenz – unsere werden direkt auf dem Server gemessen. Das Skript verwendet 50 virtuelle Nutzer für 30 Sekunden mit einer Pause von 0,5 Sek. zwischen Anfragen.