Mit tud egy 40 €-s szerver
Több mint 4 millió cég és tízmillió rekord. Egyetlen szerver. Nincs mikroszolgáltatás, nincs Kubernetes, nincsenek divatszavak.
Élő teszt
100 valós lekérdezés, 20 egyidejűleg, az éles adatbázis ellen
Kattintson a gombra 100 valós lekérdezés futtatásához és a szerver kapacitásának méréséhez.
Módszertan
Mit mérünk
A kapacitásteszt 100 valós lekérdezést futtat (céglekérdezés, személykeresés, CUI-részletek, IBAN), 20-at egyszerre, az éles adatbázis ellen, amely több mint 4 millió céget, képviselőt és tízmillió összekapcsolt rekordot tartalmaz. Az egyidejű felhasználók becslése azt feltételezi, hogy egy valós felhasználó átlagosan 3 másodpercenként küld egy kérést (oldalbetöltés + gondolkodási idő).
Hogyan mérünk
A lekérdezési függvények közvetlenül a szerveren hívódnak meg (HTTP-overhead nélkül), és az időt performance.now() méri — ezredmilliszekundum felbontással. Az eredmények kizárólag a szerver feldolgozási idejét tartalmazzák, hálózati késleltetés nélkül.
Képlet
egyidejű felhasználók = lekérés/másodperc × 3 mp (átlagos műveletek közti idő)
Miért fontos
Egy jól indexelt adatbázissal és Bun runtime-mal ellátott 40 €/hónap szerver ezreket tud kiszolgálni egyidejűleg. Nincs szükség mikroszolgáltatásokra, Kubernetesre, milliós infrastruktúrára.
Mennyibe kerül máshol
Ugyanaz a szerver (8 vCPU, 16 GB RAM) különböző szolgáltatóknál — havi árak, kedvezmények nélkül
A nagy felhőszolgáltatók (AWS, Google, Azure) felügyelt szolgáltatásokat kínálnak, de jól indexelt adatbázissal rendelkező portál esetén egy egyszerű VPS ugyanolyan teljesítményt nyújt töredék áron.
Tesztelje saját maga
Telepítse a k6 (nyílt forráskódú, egyfájlos bináris) eszközt, és futtassa az alábbi szkriptet.
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);
}Az eredmények tartalmazzák a hálózati késleltetést — a mi méréseinket közvetlenül a szerveren végezzük. A szkript 50 virtuális felhasználót alkalmaz 30 másodpercig, 0,5 mp szünettel a kérések között.