| 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: "код_ошибки"}` |