Розробка десктопного торгового терміналу
Браузерні торгові термінали впираються в обмеження: CORS не дозволяє підключатися до довільних WebSocket-серверів, відсутні системні сповіщення та доступ до файлової системи, а висока мережева затримка робить неприйнятним HFT-трейдинг. Затримка в 1 секунду при виконанні ордера може обернутися втратою клієнта в тисячі доларів. Клієнти часто приходять зі скаргою на гальмування веб-терміналів під навантаженням: 50+ відкритих графіків, часті оновлення склянки, десятки індикаторів. Ми розробляємо десктопні застосунки, які обходять ці обмеження — прямий TCP, нативні сповіщення, автозапуск та доступ до локальних файлів.
Чому Tauri краще Electron для трейдингу?
Electron — найпопулярніший фреймворк: React/Vue/Angular + Node.js backend. Недоліки — великий розмір (~100 MB), високе споживання пам'яті (декілька інстансів Chromium) та відчутний idle-витрати CPU (2–5%). Для терміналу, що працює 24/7, це помітно. Tauri використовує системний WebView (Edge на Windows, WebKit на macOS) та Rust backend. Розмір бінарника 3–10 MB, пам'ять при старті 30–80 MB, CPU idle 0.5–1%. Tauri споживає в 2-3 рази менше пам'яті, ніж Electron, і стартує в 2-5 разів швидше. Qt (C++/Python) дає нативний UI та максимальну продуктивність, але розробка складніша, а сучасний UX потребує додаткових зусиль. Для більшості проєктів ми вибираємо Tauri — найкраще співвідношення продуктивності та часу розробки.
Як ми реалізували торговий термінал на Tauri: кейс
Один із проєктів — термінал для арбітражної торгівлі з вимогами: підписка на 50+ пар, перемикання між біржами, гарячі клавіші. Архітектура на Tauri показала відмінні результати: startup 0.8 сек, пам'ять 45 MB, CPU на idle 0.6%.
// src-tauri/src/main.rs use tauri::{Manager, Window}; use tokio::sync::broadcast; #[tauri::command] async fn subscribe_market_data( symbol: String, window: Window, state: tauri::State<'_, AppState>, ) -> Result<(), String> { let mut rx = state.market_data_bus.subscribe(); tokio::spawn(async move { while let Ok(event) = rx.recv().await { if event.symbol == symbol { window.emit("market-data", &event).unwrap_or_default(); } } }); Ok(()) } #[tauri::command] async fn place_order( order: OrderRequest, state: tauri::State<'_, AppState>, ) -> Result<OrderResponse, String> { state.exchange_client .place_order(order) .await .map_err(|e| e.to_string()) } На фронті — підписка через invoke та listen:
import { invoke } from '@tauri-apps/api/tauri'; import { listen } from '@tauri-apps/api/event'; await invoke('subscribe_market_data', { symbol: 'BTC/USDT' }); const unlisten = await listen<MarketData>('market-data', (event) => { updateOrderBook(event.payload); }); Для обробки розривів з'єднання ми реалізували exponential backoff: при втраті WebSocket клієнт чекає 1 с, потім 2, 4, 8... до 60 секунд. Це знизило кількість хибних спрацьовувань алертів на 90%.
Що робити, якщо термінал гальмує?
Перша причина — витік пам'яті через невідписані підписки. На Tauri кожне вікно має явно відписуватися від каналів при закритті через Window::close_requested. Друга — синхронні операції в головному потоці: розрахунок індикаторів, запис логів — виносьте в окремі потоки. Третя — неоптимальна частота оновлення графіка: для тиків достатньо 100 мс, а не 10 мс.
| Симптом | Типова причина | Рішення |
|---|---|---|
| Зростання пам'яті з часом | Невідписані підписки WebSocket | Відписуватися при закритті вікна |
| Затримка при перемиканні вікон | Важкі розрахунки в UI-потоці | Винести розрахунки в Web Worker або Rust-команди |
| Просадка FPS на графіках | Часті оновлення склянки | Встановити throttle 50-100 мс |
Як налаштувати автооновлення?
Tauri має вбудований updater — підписані бінарники, автоматичне завантаження та встановлення. Конфігурація через tauri.conf.json з вказівкою ендпоінту для перевірки оновлень та публічного ключа підпису. Для запуску оновлення достатньо викликати checkUpdate() на фронті. Якщо нова версія знайдена — застосунок покаже діалог та встановить бінарник після підтвердження.
Покрокове налаштування автооновлення
- Згенерувати ключі підпису:
tauri signer generate. - Додати публічний ключ в
tauri.conf.json. - Налаштувати ендпоінт для файлу версій.
- Викликати
checkUpdate()при старті або по кнопці.
Порівняння метрик продуктивності
| Метрика | Electron | Tauri |
|---|---|---|
| Розмір бінарника | 80–150 MB | 3–10 MB |
| Пам'ять при запуску | 150–300 MB | 30–80 MB |
| CPU idle | 2–5% | 0.5–1% |
| Startup time | 2–5 сек | 0.5–1 сек |
Для терміналу, що працює 24/7, різниця суттєва: економія до 70% оперативної пам'яті, що знижує витрати на інфраструктуру. Вартість розробки терміналу починається від $15,000 і залежить від складності. Наша команда має 10+ років досвіду в блокчейн-розробці, реалізувала понад 50 десктопних та веб-торгових терміналів. Ми надаємо гарантію на код та сертифіковану підтримку після релізу.
Порівняння підходів до оновлення
| Спосіб | Переваги | Недоліки |
|---|---|---|
| Tauri updater | Вбудований, підпис бінарників, автоматичне встановлення | Потребує сервер релізів |
| Electron auto-updater | Аналогічний Tauri, популярний | Збільшує розмір бінарника |
| Ручне встановлення | Повний контроль, відсутність залежності від сервера | Менш зручний для користувача |
Ми рекомендуємо Tauri updater для продакшену: він мінімально впливає на розмір застосунку та підтримує підписані оновлення "з коробки".
Типові помилки при розробці десктопного терміналу
- Витік пам'яті при підписці WebSocket: не відписуйтеся від каналів при закритті вікна. Використовуйте
Window::close_requestedдля очищення. - Затримки через синхронний виклик: всі важкі операції (розрахунок індикаторів, запис логів) виносьте в окремі потоки.
- Некоректне відновлення з'єднання: реалізуйте exponential backoff з лімітом спроб.
Якщо ви зіткнулися з подібними проблемами — зв'яжіться з нами для консультації. Розробка MVP займає 2-3 місяці, повний функціонал — 4-6 місяців.
Що входить в розробку терміналу
- Аналіз вимог. Обговорення функціоналу, вибір архітектури (Tauri/Electron).
- Проєктування UI/UX. Кастомні віджети (графіки, склянка, стрічка угод).
- Реалізація бекенду на Rust/Node.js. Підключення до бірж, управління ордерами.
- Інтеграція нативних можливостей. Трей, гарячі клавіші, сповіщення, автозапуск.
- Тестування продуктивності. Виміри latency, навантажувальне тестування.
- Налаштування автооновлень. Підпис бінарників, репозиторій релізів.
- Документація. Опис архітектури, збирання та розгортання.
Отримайте консультацію щодо вибору стеку для вашого терміналу. Замовте прототип і переконайтеся в продуктивності Tauri на реальних даних.
Рекомендуємо офіційну документацію Tauri та Electron для поглибленого вивчення.







