| | 1 | = Collector |
| | 2 | |
| | 3 | |
| | 4 | Полная система состоит из 3 компонентов, соединённых по сети: |
| | 5 | |
| | 6 | коллектор <-> бэкенд <-> клиент (браузер) |
| | 7 | |
| | 8 | == В идеале |
| | 9 | |
| | 10 | В идеале коллектор это демон, который |
| | 11 | - сам опрашивает биржи через их кривой API (JSON REST или Websocket) |
| | 12 | - обрабатывает все ошибки API |
| | 13 | - приводит данные от разных бирж к единому виду |
| | 14 | - активно (см. ниже) отдает эти унифицированные данные в бэкенд по выпрямленному стандартному протоколу Financial Information Exchange (FIX) 4.x |
| | 15 | |
| | 16 | == Сейчас в продакшене (pre-2019 код) |
| | 17 | |
| | 18 | - между бэкендом и сервером наш кривой протокол |
| | 19 | - коллектор постоянно падает и бывает что тянет за собой бэкенд |
| | 20 | - код коммуникаций кривой и хрупкий |
| | 21 | - коллектор частично пассивный (бэкенд запрашивает данные) частично активный (коллектор пушит данные в бэкенд) |
| | 22 | |
| | 23 | == Предлагаемое краткосрочное решение |
| | 24 | |
| | 25 | - между бэкендом и коллектором очередь сообщений, например Gearman (проще чем FIX, легко найти библиотеки клиентов под любой язык). Но можно MQTT или что иное. |
| | 26 | - формат сообщений не унифицированный, такой, в каком отдает API биржи |
| | 27 | - активность-пассивность тоже максимально простая: |
| | 28 | - если API REST polling - то работаем через request-response гирмана, бэкенд делает SUBMIT_JOB, а коллектор регистрируется как воркер |
| | 29 | - если API websocket streaming (или другой стриминг) - то используем background jobs (sic!) гирмана. Коллектор делает SUBMIT_JOB_BG, а бэкенд регистрируется воркером. |
| | 30 | |
| | 31 | Примеры API: |
| | 32 | |
| | 33 | - простой REST https://www.bitstamp.net/api/v2/order_book/BTCUSD/ |
| | 34 | - websocket API и FIX от них же: https://www.bitstamp.net/api/ |
| | 35 | - купуй украйинське: https://docs.google.com/document/d/1ocYA0yMy_RXd561sfG3qEPZ80kyll36HUxvCRe5GbhE/edit |
| | 36 | |
| | 37 | Простейший вариант пассивного коллектора: |
| | 38 | |
| | 39 | - коллектор регистрируется воркером для джоба с названием bitstampUSD |
| | 40 | - когда приходит джоб, выполняется HTTP GET https://www.bitstamp.net/api/v2/order_book/BTCUSD/ и гирман-воркер возвращает его тело |
| | 41 | |
| | 42 | |
| | 43 | Обработка ошибок (адвансед): |
| | 44 | |
| | 45 | - таймаут |
| | 46 | - non-200 HTTP error code |
| | 47 | - неправильный content-type |
| | 48 | - битый json |
| | 49 | - json не в том формате |
| | 50 | |
| | 51 | Сигнализация ответом на джоб в формате `{err: "код_ошибки"}` |