Шлюзы

Подключение к Trading Engine: FIX, Rest, WebSocket, Binary Protocol.
Схема работы шлюзов подключения к Trading Engine

FIX

Fix Gateway делится на две части. Одна часть (Connector) контролирует TCP соединения и отвечает за fix-recovery (пересылка старых сообщений клиенту), другая (Handler) обрабатывает сообщения .

Connector и Handler могут общаться по IPC, если они на одной машине, или по UDP, если запущены на разных. Протокол общения написанный поверх UDP дает те же гарантии, что TCP, но работает быстрее. Этот же протокол используется для связи всех сервисов биржи, которые находятся на разных машинах.

Одна связка Connector + Handler по нашим тестам обрабатывает примерно 300 000 Fix-сообщений (NewOrderSingle) в секунду. Во время теста fix сообщение декодируется, конвертируется во внутренний протокол биржи и отправляется в ядро биржи.

В зависимости от нагрузок, можно добавлять больше экземпляров Connector или больше экземпляров Handler.

Rest

Rest Gateway построен на принципах неблокирующей многопоточности (Multi-Coring and Non-Blocking instead of Multi-Threading). Для работы с http мы используем Netty.

Большая часть Java-серверов (Tomcat, например) создает поток на каждое подключение. Это создает проблемы:

  • Создание потока — долгая операция

  • Поток часто простаивает. Этот поток ждет загрузки запроса пользователя, парсит его, делает запрос к другим сервисам, ждет ответы, собирает ответ для пользователя, отправляет ответ пользователю, ждет, пока ответ пользователю отправится.

  • Переключение потока — долгая операция

Rest Gateway работает по-другому. При запуске создается по одному потоку на каждом ядра процессора. Потоки обрабатывают запросы пользователей. Один поток может держать одновременно несколько http-соединений.

Сравнение подходов: «MultiThreading» и «MultiCoring + Non-Blocking»:

Блокирующий код, один поток на одно соединение. Потоки простаивают
Неблокирующий код, по одному потоку на ядро. Потоки не простаивают

Web Socket

События биржи транслируются в WebSocket библиотекой Centrifugo.

После подключения к WebSocket клиент может подписаться на каналы.

Существует два типа каналов: публичные и приватные. В публичную отправляются общие события — изменение стаканов ордеров, новые сделки. В приватную — обновление ордеров, мои сделки.

Binary Protocol

Для уменьшения времени отклика и повышения пропускной способности нужно добавить бинарный протокол в Trading Engine.