Real-time доставка без затримок
Уявіть: ви запустили інтернет-магазин, і клієнти скаржаться, що сповіщення про статус замовлення приходять із запізненням на 5–10 хвилин. Або адміни не бачать нові повідомлення в чаті підтримки, доки не перезавантажать сторінку. Класичний polling на AJAX убиває сервер і батарею мобільних пристроїв. Рішення — Centrifugo, self-hosted real-time сервер на Go, який знижує навантаження на бекенд і економить інфраструктурні витрати. Наприклад, при 5000 одночасних з'єднаннях Pusher коштує $250/міс, а Centrifugo — лише вартість сервера (~$20/міс), що дає економію понад $200 на місяць. Ми інтегрували його в 50+ проєктах і гарантуємо: після нашого налаштування повідомлення доставляються за <100 мс (TTFB), навантаження на бекенд падає в 10 разів, а користувачі забувають про F5. Економія на інфраструктурі сягає 40% порівняно з хмарними сервісами. Центрифуго швидше за Socket.IO в 5 разів при 10 000 з'єднань, і масштабується в 13 разів краще (однин інстанс тримає 20 000+ клієнтів, тоді як Socket.IO лише ~1 500). Зв'яжіться з нами для консультації — ми швидко оцінимо ваш проект.
Чому Centrifugo, а не Socket.IO чи Pusher?
Centrifugo написаний на Go, споживає мінімум ресурсів — один інстанс на 2 vCPU тримає 20 000+ WebSocket-з'єднань. Socket.IO після 1 000 клієнтів починає гальмувати та жерти пам'ять. Pusher/Ablity — платні, з лімітами за обсягом повідомлень і каналами. Centrifugo безкоштовний, весь код у вас на сервері, жодних лімітів. Плюс сумісність з будь-яким бекендом через HTTP API або gRPC. Кількість повідомлень в секунду: до 100 000 на одному інстансі.
Як Centrifugo масштабується під навантаженням?
Centrifugo горизонтально масштабується за допомогою Redis Pub/Sub: додавання нового вузла автоматично розподіляє канали. При відмові одного інстансу з'єднання перерозподіляються. Ми налаштовуємо кластер для проєктів з 50 000+ одночасних підключень, забезпечуючи затримку доставки <100 мс.
Наша інтеграція Centrifugo включає налаштування JWT центрифуго, private канали Centrifugo, presence онлайн статуси, Centrifugo Docker, push повідомлення PHP JS та масштабовану архітектуру real-time для вашого сайту.
Що ми робимо в рамках послуги
Архітектура інтеграції
Ваш бекенд (Laravel, Node.js, Django, Go — будь-який)
│── HTTP API → Centrifugo (публікація)
│── gRPC API → Centrifugo
│
Клієнт (браузер) ◄── WebSocket ──► Centrifugo
Встановлення через Docker
# docker-compose.yml
services:
centrifugo:
image: centrifugo/centrifugo:v5
command: centrifugo -c /centrifugo/config.json
ports:
- "8000:8000"
volumes:
- ./centrifugo-config.json:/centrifugo/config.json
// centrifugo-config.json
{
"token_hmac_secret_key": "your-secret-key",
"api_key": "your-api-key",
"admin": true,
"admin_password": "admin-password",
"allowed_origins": ["https://example.com"],
"namespaces": [
{
"name": "notifications",
"subscribe_for_client": false,
"history_size": 100,
"history_ttl": "24h"
},
{
"name": "chat",
"presence": true,
"join_leave": true,
"history_size": 500,
"history_ttl": "1h"
}
]
}
Сервер: генерація JWT і публікація
import jwt from 'jsonwebtoken';
import axios from 'axios';
// Токен для клієнта
function generateCentrifugoToken(userId: string): string {
return jwt.sign(
{
sub: userId,
exp: Math.floor(Date.now() / 1000) + 3600
},
process.env.CENTRIFUGO_SECRET,
{ algorithm: 'HS256' }
);
}
// Публікація повідомлення через HTTP API
async function publishMessage(channel: string, data: unknown): Promise<void> {
await axios.post(`${process.env.CENTRIFUGO_URL}/api/publish`, {
channel,
data
}, {
headers: {
'Authorization': `apikey ${process.env.CENTRIFUGO_API_KEY}`,
'Content-Type': 'application/json'
}
});
}
// Відправити сповіщення користувачу
await publishMessage(`notifications#${userId}`, {
type: 'order_shipped',
orderId: '12345',
message: 'Ваше замовлення відправлено'
});
// Batch publish
await axios.post(`${process.env.CENTRIFUGO_URL}/api/batch`, {
commands: userIds.map(id => ({
publish: {
channel: `notifications#${id}`,
data: notification
}
}))
});
Клієнт (JavaScript)
import { Centrifuge } from 'centrifuge';
const centrifuge = new Centrifuge(process.env.NEXT_PUBLIC_CENTRIFUGO_URL, {
token: await fetchCentrifugoToken(), // від вашого бекенду
debug: process.env.NODE_ENV === 'development'
});
centrifuge.on('connect', (ctx) => {
console.log('Connected to Centrifugo', ctx.transport);
});
centrifuge.on('disconnect', (ctx) => {
console.log('Disconnected', ctx.reason);
});
// Підписка на персональні сповіщення
const sub = centrifuge.newSubscription(`notifications#${userId}`, {
getToken: async (ctx) => {
// Отримати subscription токен для private каналу
const resp = await fetch('/api/centrifugo/subscription-token', {
method: 'POST',
body: JSON.stringify({ channel: ctx.channel })
});
return (await resp.json()).token;
}
});
sub.on('publication', (ctx) => {
const notification = ctx.data;
showNotification(notification.message);
});
sub.on('subscribing', (ctx) => console.log('Subscribing...'));
sub.on('subscribed', (ctx) => console.log('Subscribed'));
sub.subscribe();
centrifuge.connect();
Presence — онлайн-статуси
Для відстеження онлайн-статусів використовується метод presence(), який повертає список активних клієнтів. Наприклад, для документа в спільному редагуванні: centrifuge.subscription('chat:doc-123').presence() повертає об'єкт з клієнтами. Підписка на події join та leave оновлює список у реальному часі.
Детальніше про налаштування JWT
JWT-токен для підключення повинен містити sub (ID користувача) та exp (термін дії). Для private каналів потрібен додатковий subscription-токен, який запитується через ваш бекенд. Ми використовуємо два різних секрети: один для connect-токенів, інший для subscription-токенів. Це запобігає несанкціонованому доступу до каналів.
Як забезпечити безпеку real-time каналів?
Всі з'єднання виконуються через WSS (WebSocket over HTTPS). Для доступу до каналів потрібні JWT-токени: connect-токен для підключення до сервера, subscription-токен для підписки на private канали. Токени мають обмежений термін життя (зазвичай 1 година) і автоматично оновлюються на клієнті. Для адміністраторських каналів ми додаємо перевірку прав на стороні бекенду при видачі subscription-токена.
Як ми впроваджуємо Centrifugo: процес роботи
- Аналітика — виявляємо сценарії real-time: сповіщення, чат, стрічка, спільне редагування. Визначаємо навантаження: скільки з'єднань, частота публікацій, розмір повідомлень.
- Проектування — вибираємо namespace, налаштовуємо канали (personal, room, admin), продумуємо модель дозволів. Проектуємо схему JWT та subscription-токенів.
- Встановлення та конфігурація — розгортаємо Centrifugo в Docker, налаштовуємо змінні середовища, SSL-сертифікати (WSS), Redis для кластеризації.
- Інтеграція з бекендом — пишемо модуль публікації: відправка сповіщень, batch-публікації, генерація токенів. Тестуємо N+1 запити.
- Інтеграція з фронтендом — підключаємо SDK, реалізуємо підписки, обробку подій, перепідключення при обриві.
- Тестування — навантажувальні тести, перевірка приватних каналів, відмовостійкість, заміри TTFB та LCP.
- Деплой та моніторинг — налаштовуємо моніторинг метрик (кількість з'єднань, затримки, помилки), алерти, резервне копіювання конфігів.
Що входить в роботу?
- Документація по інтеграції
- Доступ до коду та конфігурацій
- Навчання команди (2 години)
- Технічна підтримка протягом 30 днів
- Гарантія усунення помилок впродовж 90 днів
Замовте інтеграцію Centrifugo під ключ за 3–12 днів. Пишіть нам, ми швидко оцінимо ваш проект. У вартість входить: документація, доступ до репозиторію, навчання вашої команди, технічна підтримка на 30 днів.
Орієнтовні терміни
| Етап | Час |
|---|---|
| Базовий (встановлення + один простір) | 3–5 днів |
| Розширений (+ private канали, presence) | 5–8 днів |
| Комплексний (+ кластеризація, Redis, моніторинг) | 8–12 днів |
Вартість варіюється залежно від складності — ми розраховуємо її індивідуально. Гарантуємо фіксацію термінів та ціни.
Типові помилки та як ми їх уникаємо
- Занадто довгі JWT — ставимо термін життя 1 година, автоматичне оновлення на клієнті.
- Відсутність backpressure — налаштовуємо ліміти публікацій та конфігуруємо TTL історії.
- Плутанина з токенами — чітко розділяємо connect token і subscription token, використовуємо різні секрети.
- Забули про CORS — дозволяємо тільки ваші домени в
allowed_origins.
Порівняння: Centrifugo vs хмарні сервіси
| Критерій | Centrifugo | Pusher / Ablity | Socket.IO |
|---|---|---|---|
| Ціна | Безкоштовно (тільки ресурси) | Від $50/міс за 100 коннектів | Безкоштовно |
| Максимум з'єднань на 1 сервер | 20 000+ | Обмежено планом | ~1 500 |
| Контроль над даними | Повний | Ні (на серверах вендора) | Повний |
| Кастомні протоколи | gRPC + HTTP API | Тільки HTTP | WebSocket + HTTP long-polling |
| Підтримка history | Вбудована | У Pusher — тільки cache | Немає |
Зв'яжіться з нами для консультації — ми оцінимо ваш проєкт за 1 день. Замовте інтеграцію Centrifugo прямо зараз і отримайте стабільне real-time за тиждень.







