В чем разница подключения к фондовому рынку через REST API, WebSocket и гибридную модель
Что проверяют
Понимаете ли вы, какие данные на бирже нужны запросом, а какие потоком, и что поток рвётся, теряет сообщения и требует восстановления состояния. Следом часто просят описать синхронизацию стакана заявок.
Как отвечать
- REST: запрос и ответ по HTTP. Подходит для разовых и редких операций: история свечей, инструменты, баланс, выставление и отмена заявок. Минус: котировки придётся опрашивать, а частоту запросов биржи режут и отвечают
429; - WebSocket: долгоживущее соединение после HTTP Upgrade, сервер сам присылает сделки, котировки и изменения стакана. Задержка минимальна, но появляется состояние: подписки, ping/pong, переподключение с нарастающей паузой и повторная подписка;
- гибрид: снимок через REST плюс поток изменений через WebSocket. Классическая схема для стакана: подписаться на поток и буферизовать сообщения, запросить снимок с номером последнего обновления, отбросить из буфера всё старее, применить остальное и дальше следить за непрерывностью номеров. Разрыв последовательности означает новый снимок. Заявки при этом часто отправляют через REST, а исполнения получают из приватного потока.
Для Go добавьте практику: свой http.Client с таймаутом и context.Context на запрос, у клиента по умолчанию таймаута нет. Для WebSocket gorilla/websocket или coder/websocket, чтение в отдельной горутине, запись через одну горутину-писателя с каналом. Медленного потребителя отделяйте ограниченным каналом, а для котировок можно хранить только последнее значение.
Профессиональный доступ к биржам идёт через FIX, а у части брокеров API на gRPC со стримами.
Где спотыкаются
Говорят «WebSocket всегда лучше». Для заявок и справочных данных REST проще, а клиентский идентификатор заявки делает повторную отправку безопасной.
Не думают о пропусках после переподключения. Поток продолжается с текущего момента, и без нового снимка стакан тихо расходится с биржей.
Пишут в одно соединение из нескольких горутин. gorilla/websocket допускает только одного читателя и одного писателя одновременно, иначе паника. Или тяжело обрабатывают данные прямо в цикле чтения, не успевают ответить на ping, и биржа рвёт соединение.