Реалізація WebSocket-скрапінгу в реальному часі для криптобірж і EVM-мереж

Потік даних з біржі обривається в найневдаліший момент — і рішення ухвалюються за застарілими котируваннями. Ми налаштовуємо WebSocket-скрапінг під ключ: безперервний збір ринкових даних з бірж і мереж, стійкий до пікових навантажень. Розриви з’єднань і пропуски більше не спотворюють вашу аналітику.
Часті запитання

Чому WebSocket scraping ламається на пікових навантаженнях

На спокійному ринку потік угод іде рівно, і WebSocket scraping здається тривіальним: підписалися на канали, пишемо в базу. Відмова приходить на сплеску — біржа під навантаженням закриває з'єднання, а ліміти підключень не дають тримати окремий канал на кожну торгову пару.

Обрив з'єднання біржі — це режим роботи, а не аварія. Поки клієнт перепідключається, в канал ідуть сотні подій: утворюється пропуск угод, а стакан збирається з застарілого знімка та свіжих змін — розсинхрон стакану, за якого розрахункова ціна розходиться з реальною. Найнебезпечніше те, що розходження не впадає в око: цифри виглядають правдоподібно.

Окрема біда — задвоєні записи. Після розриву частина повідомлень приходить повторно, і без дедуплікації за ідентифікатором події обсяг у базі зростає, а агрегати за обсягом торгів завищуються.

Помилка накопичується мовчки і випливає вже в аналітиці, звітності або в ризик-моделі, де їй не місце.

Розбираємо, як це закривається: відновлення знімка стакану з перевіркою контрольної суми, буферизація подій на час розриву, дедуплікація за ключем і рознесення підписок так, щоб упертися в ліміти підключень було нічим.

Що дає безперервний потік даних з бірж і мереж

Безперервний потік котирувань замість опитування за розкладом знімає головну проблему — рух ціни між запитами.

Коли підписка висить постійно, кожна зміна стакану і кожна угода приходять у момент появи, і частка втрачених подій вимірюється десятими долями відсотка, а не відсотками.

На Binance та інших великих майданчиках потік віддається через шлюз з лімітом на кількість одночасних підписок — саме це обмеження задає архітектуру збирача, а не обсяг ринку.

Розрив з'єднання — штатний режим, а не аварія: спрацьовує ліміт, змінюється ключ доступу, відпадає ділянка мережі. Інженерна різниця в тому, чи піднімається потік сам і з якого місця.

Ми зберігаємо ідентифікатор останньої підтвердженої події і після перепідключення довантажуємо пропущений відрізок з історії — час відновлення з'єднання скорочується до одиниць секунд, оператор не потрібен, дублі відсікаються за ключем угоди.

Повнота історії угод перевіряється звіркою з незалежним джерелом: снапшот книги та архівний лог слугують еталоном, а розходження закривається вікном довантаження. Історія залишається відтворюваною — за нею рахуються метрики заднім числом, включно з хвилинами, коли збирач мовчав.

Затримка доставки при цьому має бути передбачуваною: важливий не середній, а хвіст — при зростанні кількості інструментів він не повинен розповзатися.

Навантаження на збирач зростає від кількості підписок, а не від активності ринку: розбиття інструментів на незалежні групи, запис подій пачками та черга зі зворотним тиском тримають споживання рівним.

Тому потік розширюється новими парами і мережами без переробки ядра — додається ще один сегмент, а не другий збирач.

Порівняння режимів збору ринкових даних

Для ринкових даних не існує одного «правильного» режиму збору: схему обирають за тим, що критичніше — швидкість реакції на подію чи повнота історії за період.

Постійна підписка дає реакцію в момент появи події, але не переживає обрив з'єднання; періодичне опитування стійке до розривів, зате відстає і впирається в ліміти запитів біржі. Нижче — чотири варіанти, між якими реально обирають на старті проєкту.

Варіант Коли підходить Обмеження
Постійна підписка на потік (WebSocket) Живий стакан, стрічка угод, реакція на подію одразу після публікації Обрив з'єднання дає історичні пропуски: без контрольних точок і коректної перепідписки частина подій губиться безповоротно
Періодичне опитування Рідкісні метрики, довідники інструментів, звірка стану за розкладом Затримка між запитами, ліміти частоти, при зростанні кількості інструментів зростає і кількість звернень
Гібридна схема збору Торгові та аналітичні системи, де потрібні і швидкість, і повнота історії Потребує ідемпотентної склейки: дедуплікація, зберігання контрольних точок, розбір розходжень між джерелами
Власний вузол мережі Потрібні дані, яких публічні провайдери не віддають: мемпул, повні логи контрактів у EVM-мережах Синхронізація та зберігання стану, оновлення і чергування, зате немає чужих лімітів і зовнішніх точок відмови

На практиці робоча зв'язка — постійна підписка на потік плюс довантаження пропусків за контрольними точками; власний вузол мережі підключають там, де публічні джерела не віддають потрібну глибину даних.

Набір режимів визначаємо за задачею і фіксуємо в схемі даних до старту розробки — це дешевше, ніж переробляти сховище, коли в історії виявляються діри.

WebSocket scraping: етапи впровадження та передачі

Живі дані бірж і EVM-мереж існують тільки в момент публікації: ціна, стакан, нові блоки та логи контрактів не відновлюються заднім числом самі по собі. Постійні з'єднання замість періодичного опитування дають мінімальний лаг, але вимагають дисципліни у відновленні.

Впровадження тому будується навколо двох ризиків — втратити подію на розриві та не помітити цю втрату. Порядок робіт нижче.

  1. Розбір джерел. Фіксуємо, які канали потрібні: угоди, стакан, нові блоки, логи адрес. Для кожного уточнюємо ліміти на кількість одночасних підписок і глибину історії — де потік самодостатній, а де потрібен добір даних.
  2. Схема потоків даних. Ведемо шлях повідомлення: джерело → підписка → нормалізація → черга → сховище → споживач. Позначаємо точки буферизації, щоб сплеск активності на ринку не перетворювався на втрату подій.
  3. Налаштування підписок. Задаємо фільтри, частоту публікації та правило повторної підписки за кожним каналом. Споживач отримує потрібні події, а не весь потік — обробка розвантажується без втрати значущих даних.
  4. Опрацювання розривів. Описуємо поведінку при обриві: повтори з наростаючою паузою, перевірка живучості з'єднання, відновлення з останнього обробленого блоку або курсора. Пропущене добираємо з історії, вже прийняте — не дублюємо.
  5. Перевірка повноти даних. Звіряємо потік з незалежним джерелом та історією, рахуємо розходження за кількістю подій і максимальний лаг обробки. Дедуплікація йде за ідентифікатором події, а не за часом надходження.
  6. Передача рішення. Віддаємо конфігурації підписок, схему потоків, формати повідомлень і регламент дій при збої. Команда замовника бачить, де дивитися метрики і як підняти потік після аварії.

Що залишається у замовника після впровадження потоку

Потік на WebSocket-підписках — це не тільки працюючий збирач, а комплект, з яким команда замовника залишається один на один.

Тому в закриваючий пакет входять конфігурації, схеми та регламенти: за ними потік можна підняти з нуля, розширити і передати іншому інженеру без усних пояснень.

  • Конфігурація підписок — перелік каналів та інструментів за кожною біржею і мережею, глибина запитуваної історії, інтервали перепідписки та параметри перепідключення. Версіонується, зміна підписки не вимагає правки коду.
  • Схема потоків і сховищ — маршрут від точки входу до сирого архіву та аналітичного шару: де виконується нормалізація, які поля обов'язкові, як фіксуються розходження між джерелами.
  • Правила доступу — ролі для читання та адміністрування, порядок видачі й ротації ключів, розділення бойового і тестового контурів, відкликання доступу при зміні співробітника.
  • Регламент відновлення — дії при обриві зв'язку або збої вузла: автоматичне перепідключення, догін пропущеного діапазону, ручний перезапуск і перевірка цілісності даних за період.
  • Документація по збирачу — що саме збирається, які метрики знімаються, за якими ознаками видно деградацію потоку і куди дивитися при розборі інциденту.
  • Порядок додавання нового джерела — чек-ліст: чим джерело відрізняється за форматом і лімітами, що перевіряється до включення в роботу, скільки займає підключення.

Окремо передаємо журнал змін конфігурацій і звіт за навантаженням — видно, коли змінювалися підписки і до якого результату це призвело.

Кейс: потік з біржі без пропусків і розривів з'єднання

Клієнт — трейдингова команда, яка збирала угоди та зміни стаканів з кількох майданчиків для сигналів і історичної аналітики.

Потік з Binance забирався періодичними опитуваннями: на спокійному ринку це виглядало робочим, але на сплесках волатильності частина подій не потрапляла у вибірку, а збирач падав через мережеву помилку і чекав ручного перезапуску.

Ми зафіксували метрики до робіт, перевели збір на постійне з'єднання WebSocket і порівняли показники після.

Показник До Після
Частка пропущених подій до 1,8% на сплесках нижче 0,01%
Простій збирача до 40 хвилин на добу секунди на перепідключення
Ручні перезапуски 6–8 на добу 0
Повнота відновленої історії 92% 100%

Усередині замість опитування за розкладом — довгоживуче з'єднання з підпискою на потрібні канали та записом кожної події в чергу на диск до підтвердження обробки.

Мовчання з'єднання розпізнається за відсутністю сигналів зв'язку, розрив закривається перепідключенням з наростаючою паузою і довантаженням пропущеного діапазону з історії біржі: останній підтверджений ідентифікатор події зберігається, тому вікно довантаження відоме точно. Запис ідемпотентний — повторне довантаження не створює дублів.

Підсумок: історія без дір годиться і для аналітики, і для перевірки стратегій на минулих даних, а черговий більше не стежить за живучістю збирача.

Звірка добових зрізів з біржовими дає розходження в межах округлення, тоді як раніше діри виявлялися вже після того, як модель навчилася на неповних даних.

Чим відрізняється підписка на потік від періодичного опитування?

Періодичне опитування — клієнт сам раз на заданий інтервал запитує стан: список ордерів, свіжі угоди, баланс. Реалізується тривіально, не вимагає утримання з'єднання і тому часто залишається запасним каналом.

Ціна — затримка: подія потрапляє в систему не раніше наступного циклу, а все, що сталося між двома знімками, губиться.

Підписка на події через WebSocket перевертає схему: з'єднання відкривається один раз, і джерело саме надсилає повідомлення в момент зміни — появи заявки, виконання угоди, виходу нового блоку.

Швидкість реакції визначається часом передачі сигналу, а не половиною інтервалу опитування. Для арбітражу та реакції на ліквідації різниця принципова.

Навантаження на джерело влаштоване інакше. Опитування створює рівний потік запитів незалежно від активності ринку: у затишшя майже всі вони повертають порожню відповідь, але квоти й ліміти витрачаються.

Потік підписок масштабується разом з активністю — сплеск дає багато повідомлень, у штиль канал мовчить.

Повнота картини — другий вододіл. Опитування віддає знімок, і заявка, виставлена і знята всередині вікна, у даних не з'явиться взагалі.

Потік зберігає послідовність подій, але вимагає опрацювання розривів: при перепідключенні пропущене довантажується окремо, а локальний стакан відновлюється — інакше картина роз'їдеться з біржею.

Тому моделі не протиставляють, а поєднують: підписка тримає потік, рідкісне опитування звіряє стан і ловить розходження. Розбираємо, як це збирається під конкретну задачу.

Технічні сумніви перед стартом робіт

Сумніви на старті рідко стосуються архітектури — частіше вони про те, як новий збирач уживається з уже працюючим контуром і хто відповідає за інциденти. Нижче — питання, які задають до підписання плану робіт.

У нас уже розгорнуто збирач — починати з нуля?

Починаємо з аудиту: дивимося, які потоки даних уже йдуть, де губляться повідомлення і як обробляються розриви з'єднання. Зазвичай вигідніше добудувати нормалізацію і догін історії поруч із поточним контуром і перемикати джерела по одному. Старий збирач працює як резерв, поки не зійдуться дані на звірці.

Як не впертися в ліміти джерела?

Ліміти джерела — це обмеження на кількість активних підписок і частоту перепідписок. Планувальник тримає запас за потоками, розподіляє їх за з'єднаннями і при спрацюванні обмеження віддає пріоритет критичним інструментам і мережам, решту ставить у чергу.

Після розриву збирач відновлює стан від найближчого снапшота і доганяє пропущене, а не починає заново.

Хто відповідає за збої на боці біржі?

Ми збираємо телеметрію за кожним джерелом: затримку доставки, частоту розривів, розходження дельт зі снапшотом. Якщо збій підтверджено на боці джерела — це зовнішній інцидент, і ми фіксуємо його окремо від помилок нашого контуру. Відновлення автоматичне: реконнект, перепідписка, догін історії.

Як розширювати список мереж і майданчиків?

Кожне нове джерело підключається окремим адаптером: своя схема підписки, приведення до спільної моделі даних, включення за флагом. Уже працюючі джерела при цьому не чіпаємо — розширення списку не створює ризику для поточного збору.

Що входить у передачу знань?

Схеми потоків і підписок, конфігурації, регламент чергування та розбору інцидентів, розбір з вашою командою на реальних збоях. Після передачі ви можете додавати джерела і змінювати пріоритети без нас.

Обговоримо задачу і повернемося з оцінкою та планом

Щоб розмова була предметною, достатньо надіслати те, що вже є: перелік бірж і мереж, які потрібно покрити, і які дані потрібні з кожної — угоди, стакан, статуси транзакцій, події контрактів.

Додайте частоту оновлення, потрібну глибину історії та те, куди результат має потрапляти: у базу, у чергу чи напряму у ваш сервіс.

У відповідь приходить розбір за пунктами, за яким уже можна ухвалювати рішення.

  • Постановка задачі — які потоки і з яких майданчиків піднімаємо, що вважаємо джерелом істини, де втрата подій допустима, а де ні.
  • Схема рішення — як влаштовані підключення, перепідписка на інструменти і довантаження пропущеної ділянки після розриву зв'язку.
  • План етапів — з чого починаємо, який проміжний результат вважаємо робочим, на якому кроці виходимо на перевірку реальними даними.
  • Склад артефактів — сервіси, конфігурації, схема потоків і сховища, інструкції із запуску, набір метрик і логів.
  • Критерії приймання — безперервність потоку під навантаженням, поведінка при обриві, повнота історичних даних, розходження з біржовими даними.
  • Межі робіт — що закриваємо ми, що залишається на вашому боці і які зовнішні залежності впливають на строки.

Цей набір зручно використовувати і як чек-ліст при виборі підрядника: якщо у відповіді немає схеми, етапів і порядку перевірки — оцінювати нічого.

Напрямки блокчейн-розробки

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1394
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1369
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    816
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1142