Ce poate face un server de €40
Peste 4 milioane de firme și zeci de milioane de înregistrări. Un singur server. Fără microservicii, fără Kubernetes, fără buzzwords.
Test live
100 interogări reale, 20 concurente, pe baza de date de producție
Apasă butonul pentru a rula 100 de interogări reale și a măsura capacitatea serverului.
Metodologie
Ce măsurăm
Testul de capacitate rulează 100 de interogări reale (căutare firme, persoane, detalii CUI, IBAN), 20 la un moment dat, pe baza de date de producție cu peste 4 milioane de firme, reprezentanți și zeci de milioane de înregistrări interconectate. Estimarea utilizatorilor simultani presupune că un utilizator real face în medie 1 cerere la 3 secunde (încărcare pagină + timp de gândire).
Cum măsurăm
Funcțiile de interogare sunt apelate direct pe server (fără overhead HTTP), iar timpul este măsurat cu performance.now() — rezoluție sub-milisecundă. Rezultatele includ doar procesarea serverului, nu latența rețelei.
Formula
utilizatori simultani = cereri/secundă × 3s (timp mediu între acțiuni)
De ce e relevant
Un server de €40/lună cu o bază de date bine indexată și Bun ca runtime poate servi mii de utilizatori simultani. Nu e nevoie de microservicii, Kubernetes, sau infrastructură de milioane.
Cât costă în altă parte
Același server (8 vCPU, 16 GB RAM) la diferiți furnizori — prețuri lunare, fără discount
Hyperscalerii (AWS, Google, Azure) oferă servicii managed, dar pentru un portal cu baza de date bine indexată, un VPS simplu livrează aceeași performanță la o fracțiune din cost.
Testează singur
Instalează k6 (open source, un singur binar) și rulează scriptul de mai jos.
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);
}Rezultatele tale vor include latența rețelei — rezultatele noastre sunt măsurate direct pe server. Scriptul folosește 50 de utilizatori virtuali timp de 30 de secunde, cu pauză de 0.5s între cereri.