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