Будь-яка затримка у відображенні біржових котирувань може коштувати клієнту великої суми. У багатокористувацькому редакторі розсинхронізація станів призводить до втрачених правок. Ably забезпечує затримку менше 50 мс і гарантовану доставку з SLA 99.999% для enterprise-планів. Ми виконали 50+ інтеграцій Ably для fintech, edtech та collaboration-продуктів, включаючи проекти з мільйонами одночасних користувачів. У цій статті розбираємо, як налаштувати pub/sub, token auth і уникнути типових помилок, спираючись на реальний досвід.
Чому Ably?
Ably — managed real-time платформа з глобальною інфраструктурою (180+ PoP), підтримкою pub/sub, presence та історії повідомлень. На відміну від Pusher, Ably надає вбудований WebSocket streams та збереження історії до 30 днів. WebSocket — протокол повнодуплексного зв'язку поверх TCP. Ми вибираємо Ably для проектів, де критичні 99.999% uptime та масштабування до мільйона одночасних з'єднань. Порівняно з Socket.IO, Ably пропонує в 10 разів меншу затримку при глобальній доставці та в 5 разів вищий uptime, ніж Pusher.
| Можливість | Ably | Pusher | Socket.IO (self-hosted) |
|---|---|---|---|
| Затримка (P95) | <50 мс | <100 мс | залежить від сервера |
| Збереження історії | до 30 днів | 24 години | немає вбудованої |
| Глобальна інфраструктура | 180+ PoP | ~10 PoP | немає |
| Token auth з capability | вбудовано | через проксі | потрібна реалізація |
| SLA | 99.999% | 99.95% | немає |
Як забезпечити безпеку real-time каналів?
Безпека будується на трьох рівнях: транспорт (TLS 1.3), аутентифікація (token auth) та авторизація (capability). Ably підтримує IP-білі списки. Ми завжди використовуємо токенну аутентифікацію на клієнті — API-ключ ніколи не передається. Для кожного clientId задаються права: subscribe, publish, presence. Приклад налаштування нижче.
Приклад генерації токена з capability
const tokenParams = {
clientId: req.user.id,
capability: {
[`prices:*`]: ['subscribe'],
[`notifications:${req.user.id}`]: ['subscribe'],
[`user-actions:${req.user.id}`]: ['publish', 'subscribe']
},
ttl: 60 * 60 * 1000
};
const tokenRequest = await ably.auth.createTokenRequest(tokenParams);
Як ми це робимо
Ми використовуємо серверний REST-клієнт Ably для публікації даних та клієнтський Realtime-клієнт з token auth на фронтенді. Нижче — типовий код для публікації та підписки.
Сервер — публікація даних
import Ably from 'ably';
const ably = new Ably.Rest({
key: process.env.ABLY_API_KEY
});
// Публикация обновления цены (например, биржевой котировки)
async function publishPriceUpdate(symbol: string, price: number) {
const channel = ably.channels.get(`prices:${symbol}`);
await channel.publish('price-update', {
symbol,
price,
timestamp: Date.now(),
change: calculateChange(symbol, price)
});
}
// Bulk publish для нескольких символов
async function publishBatch(updates: PriceUpdate[]) {
await Promise.all(
updates.map(u => publishPriceUpdate(u.symbol, u.price))
);
}
Токени авторизації (Ably Token Auth)
Ніколи не передавайте API ключ на клієнт — використовуйте token auth:
// Сервер генерирует токен для клиента
app.get('/ably/token', authenticate, async (req, res) => {
const tokenParams = {
clientId: req.user.id,
capability: {
// Что может делать этот клиент
[`prices:*`]: ['subscribe'],
[`notifications:${req.user.id}`]: ['subscribe'],
[`user-actions:${req.user.id}`]: ['publish', 'subscribe']
},
ttl: 60 * 60 * 1000 // 1 час
};
const tokenRequest = await ably.auth.createTokenRequest(tokenParams);
res.json(tokenRequest);
});
Клієнт (React)
import Ably from 'ably';
import { useEffect, useState } from 'react';
function usePriceUpdates(symbols: string[]) {
const [prices, setPrices] = useState<Record<string, number>>({});
useEffect(() => {
const client = new Ably.Realtime({
authUrl: '/ably/token',
authHeaders: { Authorization: `Bearer ${getToken()}` }
});
const channels = symbols.map(symbol => {
const channel = client.channels.get(`prices:${symbol}`);
channel.subscribe('price-update', (message) => {
setPrices(prev => ({
...prev,
[message.data.symbol]: message.data.price
}));
});
return channel;
});
return () => {
channels.forEach(ch => ch.unsubscribe());
client.close();
};
}, [symbols.join(',')]);
return prices;
}
Історія повідомлень
Ably зберігає історію — новий підписник може отримати пропущені повідомлення:
// Получить последние 100 сообщений из канала
const channel = client.channels.get('notifications');
const history = await channel.history({ limit: 100, direction: 'backwards' });
for (const item of history.items) {
console.log(item.data, item.timestamp);
}
Які типові помилки виникають при інтеграції Ably?
- Публікація без історії. Якщо вимкнути persisted, пропущені дані не відновляться. Завжди вмикайте збереження історії для каналів.
- Відсутність retry-логіки. При тимчасових помилках клієнт повинен автоматично перепідключатися — Ably SDK робить це за замовчуванням.
- Занадто широкі capability. Обмежуйте права каналів: клієнт не повинен публікувати в чужі канали.
| Сценарій | Рекомендований канал |
|---|---|
| Біржові котирування | prices:{symbol} з persisted=true |
| Чат | chat:{roomId} з історією 24h |
| Спільне редагування | doc:{docId} з presence та cap |
| Сповіщення | notifications:{userId} з push |
Як Ably гарантує доставку повідомлень при збоях?
Ably використовує протокол надійної доставки з підтвердженням отримання та автоматичним повторенням при невдачі. Повідомлення зберігаються в черзі до тих пір, поки клієнт не підтвердить отримання. Завдяки глобальній мережі PoP, при відмові одного вузла трафік автоматично перенаправляється на найближчий робочий. Це забезпечує доставку без втрат навіть при короткочасних мережевих проблемах.
Що входить в інтеграцію під ключ
- Архітектура каналів та подій — проектуємо структуру під ваш бізнес-сценарій.
- Token auth — генерація токенів з мінімальними правами.
- Клієнтська підписка — React/Vue/Angular хуки для підписки на канали.
- Моніторинг та логування — ставимо дашборди Ably для відстеження метрик.
- Документація — опис схеми каналів, подій та приклади коду.
- Навчання команди — 2-годинна сесія по роботі з Ably.
- Технічна підтримка — 1 місяць після деплою.
Вартість володіння такою інтеграцією окупається за рахунок скорочення часу розробки на 2 тижні та зниження витрат на інфраструктуру на 30%.
Процес роботи
- Аналітика — розбираємо сценарії real-time: котирування, чат, спільне редагування.
- Проектування — визначаємо канали, події, права доступу.
- Реалізація — налаштовуємо серверну публікацію та клієнтську підписку.
- Тест — навантажувальне тестування з емуляцією тисяч одночасних з'єднань.
- Деплой — розгортання на production з моніторингом.
Терміни
- Базова інтеграція pub/sub з token auth — 1–2 дні.
- Повноцінне впровадження з історією, presence та моніторингом — 5–7 днів.
Вартість розраховується індивідуально. Зв'яжіться з нами для безкоштовної консультації — оцінимо ваш проект за один день. Замовте інтеграцію Ably під ключ.







