Как реализовать арбитраж на фиде A и фиде B в финансовом протоколе FAST?
Мне нужно реализовать арбитраж каналов для протокола FAST. Проблема довольно распространенная, и существуют даже аппаратные решения. Поскольку проблема широко известна, я думаю, что должны быть как минимум общие предложения о том, как это реализовать (сколько запросов я должен использовать, сколько кольцевых буферов, сколько читателей, когда отбрасывать пакеты и т. д.) и, возможно, кто-то может указать мне на некоторую реализацию. Для тех, кто не знаком с FAST, я добавлю описание:
Данные во всех каналах UDP распространяются в двух идентичных каналах (A и B) на двух разных IP-адресах многоадресной рассылки. Настоятельно рекомендуется, чтобы клиент получал и обрабатывал оба канала из-за возможной потери пакетов UDP. Обработка двух одинаковых каналов позволяет статистически снизить вероятность потери пакетов. Не указано, в каком конкретном фиде (A или B) сообщение появляется впервые. Для арбитража этих каналов следует использовать порядковый номер сообщения, найденный в преамбуле или в теге 34-MsgSeqNum. Использование Преамбулы позволяет определить порядковый номер сообщения без декодирования сообщения FAST. Обработка сообщений из каналов A и B должна выполняться по следующему алгоритму:
- Слушайте каналы A и B
- Обрабатывать сообщения в соответствии с их порядковыми номерами.
Игнорировать сообщение, если оно уже было обработано с таким же порядковым номером.
// алгоритм восстановления TCP
Поэтому я думаю, что решение должно быть таким:
Для каждого из двух каналов создается выделенный поток и выделенный буфер. Добавить данные в буфер по мере поступления данных. (это должен быть кольцевой буфер или очередь или что?)
Создайте "ридер", который "раскручивает" и проверяет оба потока на наличие последнего доступного "порядкового номера". Как только "порядковый номер" становится доступным, следующий пакет должен быть обработан, и оба потока должны отбросить его после этого.
Любые предложения о том, как реализовать сам алгоритм и, возможно, предложения о том, какие структуры использовать, приветствуются. В частности, возможно, кто-то может предложить реализацию без очереди блокировки / кольцевого буфера.
1 ответ
Протокол FAST обычно используется для потоковой передачи рыночных данных, поэтому данные поступают в пакетах UDP, обычно многоадресных. Эти пакеты упорядочены, поэтому, если вам необходимо выполнить арбитраж между двумя избыточными каналами, все, что вам нужно сделать, - это обработать следующий ожидаемый пакет с того канала, который вы получите первым. Пакет dupe, приходящий поздно, вы просто отбрасываете. Арбитраж не только уменьшает ваши шансы на потерю пакета (вы должны потерять его в обоих каналах), но и уменьшает вашу задержку, поскольку у вас всегда есть второй вариант в случае, если один из каналов становится медленным.
Вы должны быть более обеспокоены декодированием битов FAST. Это может занять много времени. Проверьте CoralFIX для примера того, как генерировать исходный код для FAST-декодирования из шаблона обмена XML.
Отказ от ответственности: я один из разработчиков CoralFIX.