Що може сервер за €40
Понад 4 мільйони компаній і десятки мільйонів записів. Один сервер. Без мікросервісів, без Kubernetes, без модних слів.
Живий тест
100 реальних запитів, 20 одночасних, до виробничої бази даних
Натисніть кнопку, щоб запустити 100 реальних запитів і виміряти потужність сервера.
Методологія
Що ми вимірюємо
Тест потужності виконує 100 реальних запитів (пошук компаній, пошук осіб, деталі CUI, IBAN), по 20 одночасно, до виробничої бази даних з понад 4 мільйонами компаній, представників і десятками мільйонів взаємопов'язаних записів. Оцінка одночасних користувачів передбачає, що реальний користувач робить у середньому 1 запит кожні 3 секунди (завантаження сторінки + час на обдумування).
Як ми вимірюємо
Функції запитів викликаються безпосередньо на сервері (без HTTP-накладних витрат), а час вимірюється за допомогою performance.now() — роздільна здатність до мілісекунди. Результати включають лише час обробки сервером, без мережевої затримки.
Формула
одночасні користувачі = запити/секунду × 3с (середній час між діями)
Чому це важливо
Сервер за €40/місяць із добре проіндексованою базою даних і Bun як середовищем виконання може обслуговувати тисячі одночасних користувачів. Без мікросервісів, без Kubernetes, без інфраструктури за мільйон доларів.
Скільки це коштує в інших провайдерів
Той самий сервер (8 vCPU, 16 ГБ RAM) у різних провайдерів — щомісячні ціни без знижок
Гіперскейлери (AWS, Google, Azure) пропонують керовані сервіси, але для порталу з добре проіндексованою базою даних простий VPS забезпечує таку ж продуктивність за частку вартості.
Протестуйте самостійно
Встановіть k6 (з відкритим кодом, один бінарний файл) і запустіть сценарій нижче.
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);
}Ваші результати включатимуть мережеву затримку — наші вимірюються безпосередньо на сервері. Сценарій використовує 50 віртуальних користувачів протягом 30 секунд з паузою 0,5 с між запитами.