Разработка десктопного торгового терминала
Браузерные торговые терминалы упираются в ограничения: CORS не даёт подключаться к произвольным WebSocket-серверам, отсутствуют системные уведомления и доступ к файловой системе, а высокий сетевой latency делает неприемлемым 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%. Разница в производительности критична для трейдера, который держит терминал открытым неделями. 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:
{ "updater": { "active": true, "endpoints": ["https://releases.yourapp.com/{{target}}/{{arch}}/{{current_version}}"], "dialog": true, "pubkey": "..." } } Для запуска обновления достаточно вызвать checkUpdate() на фронте. Если новая версия найдена — приложение покажет диалог и установит бинарник после подтверждения.
Пошаговая настройка автообновления
- Сгенерировать ключи подписи:
tauri signer generate. - Добавить публичный ключ в
tauri.conf.json. - Настроить эндпоинт с 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% оперативной памяти, что снижает затраты на инфраструктуру. Наша команда имеет 10+ лет опыта в блокчейн-разработке, реализовала более 50 десктопных и веб-торговых терминалов.
Сравнение подходов к обновлению
| Способ | Преимущества | Недостатки |
|---|---|---|
| Tauri updater | Встроенный, подпись бинарников, автоматоматическая установка | Требуется сервер релизов |
| Electron auto-updater | Аналогичен Tauri, популярный | Увеличивает размер бинарника |
| Ручная установка | Полный контроль, нет зависимости от сервера | Менее удобна для пользователя |
Мы рекомендуем Tauri updater для продакшена: он минимально влияет на размер приложения и поддерживает подписанные обновления "из коробки".
Типичные ошибки при разработке десктопного терминала
- Утечка памяти при подписке WebSocket: не отписывайтесь от каналов при закрытии окна. Используйте
Window::close_requestedдля очистки. - Задержки из-за синхронного вызова: все тяжёлые операции (расчёт индикаторов, запись логов) выносите в отдельные потоки.
- Некорректное восстановление соединения: реализуйте exponential backoff с лимитом попыток.
Если вы столкнулись с подобными проблемами — свяжитесь с нами для консультации. Стоимость разработки рассчитывается индивидуально.
Что входит в разработку терминала
- Анализ требований. Обсуждение функционала, выбор архитектуры (Tauri/Electron).
- Проектирование UI/UX. Кастомные виджеты (графики, стакан, лента сделок).
- Реализация бэкенда на Rust/Node.js. Подключение к биржам, управление ордерами.
- Интеграция нативных возможностей. Трей, горячие клавиши, уведомления, автозапуск.
- Тестирование производительности. Замеры latency, нагрузочное тестирование.
- Настройка автообновлений. Подпись бинарников, репозиторий релизов.
- Документация. Описание архитектуры, сборки и развёртывания.
Получите консультацию по выбору стека для вашего терминала. Закажите прототип и убедитесь в производительности Tauri на реальных данных.
Рекомендуем официальную документацию Tauri и Electron для углублённого изучения.







