как реализовать арбитраж канала A и канала B в финансовом протоколе FAST?

Мне нужно реализовать арбитраж фидов для протокола FAST. Проблема довольно распространенная, и есть даже аппаратные средства. решения Поскольку проблема широко известна, я думаю, что должны быть хотя бы общие предложения о том, как это реализовать (сколько запросов я должен использовать, сколько кольцевых буферов, сколько считывателей, когда отбрасывать пакеты и т. д.) и, возможно, кто-то может указать мне на какую-то реализацию. Для тех, кто не знаком с FAST, добавлю описание:


Данные во всех каналах UDP распространяются в двух идентичных каналах (A и B) на двух разных многоадресных IP-адресах. Настоятельно рекомендуется, чтобы клиент получал и обрабатывал оба канала из-за возможной потери пакетов UDP. Обработка двух одинаковых фидов позволяет статистически снизить вероятность потери пакетов. Не уточняется, в какой именно ленте (А или Б) сообщение появляется впервые. Для арбитража этих каналов следует использовать порядковый номер сообщения, указанный в преамбуле или в теге 34-MsgSeqNum. Использование преамбулы позволяет определить порядковый номер сообщения без декодирования сообщения FAST. Обработка сообщений из фидов А и Б должна производиться по следующему алгоритму:

  1. Слушайте каналы A и B
  2. Обрабатывайте сообщения в соответствии с их порядковыми номерами.
  3. Игнорировать сообщение, если сообщение с таким же порядковым номером уже было обработано ранее.

    // далее алгоритм восстановления tcp


Поэтому я думаю, что решение должно быть таким:

  1. Для каждого из двух каналов создайте выделенный поток и выделенный буфер. Добавляйте данные в буфер по мере поступления данных. (это должен быть кольцевой буфер или очередь или что?)

  2. Создайте «считыватель», который «вращает» и проверяет оба потока на наличие последнего доступного «порядкового номера». Как только «порядковый номер» становится доступным, необходимо обработать следующий пакет, после чего оба потока должны его отбросить.

Приветствуются любые предложения о том, как реализовать сам алгоритм и, возможно, предложения о том, какие структуры использовать. В частности, возможно, кто-то может предложить реализацию безблокировочной очереди/кольцевого буфера.


person Oleg Vazhnev    schedule 23.04.2013    source источник


Ответы (1)


Протокол FAST обычно используется для потоковой передачи рыночных данных, поэтому данные поступают в пакетах UDP, обычно многоадресных. Эти пакеты последовательны, поэтому, если вам нужно выполнить арбитраж между двумя избыточными потоками, все, что вам нужно сделать, это обработать следующий ожидаемый пакет из того канала, который вы получили первым. Дублирующий пакет, пришедший с опозданием, вы просто отбрасываете. Арбитраж не только снижает ваши шансы на потерю пакета (вы должны потерять его в обоих каналах), но и уменьшает задержку, поскольку у вас всегда есть второй вариант на случай, если один из каналов станет медленным.

Вам следует больше заботиться о декодировании битов FAST. Это может занять много времени. Посмотрите CoralFIX, чтобы узнать, как генерировать исходный код для декодирования FAST из XML-шаблона обмена.

Отказ от ответственности: я являюсь одним из разработчиков CoralFIX.

person rdalmeida    schedule 21.10.2014