Перепробовал уже несколько методов синхронизации по времени и по точно известным точкам но всё не достигает желаемого результата. Может я что-то упустил, ищу идеи и любую литературную помощь.
Проблема:
У нас имеется N потоков данных, для примера скажем 32 но это число в любой момент может поменяться (добавится ещё один, не сможет работать другой, временно отключится третий, знания обо всё этом вне нашей зоны досягаемости). Каждый поток данных высылает минимум одно сообщение в 15 секунд, но может и чаще без однозначной порядочности. Если сообщение выслано до того как пройдёт 15 секунд все остальные потоки в теории должны выслать его примерно в туже секунду, на практике окно в течении дня ходит от 0.1 до 5 секунд в зависимости от загруженности сети и других факторов которые втягивать в анализ не практично. Некоторые потоки просто как-то могут прозевать и не выслать то сообщение вовсе что может повлечь его повторный запрос (не только нашего клиента но и любого использующего эти потоки) и ещё больше растянуть окно. На каждом сообщении есть дата создания и данные.
Данные в теории должны быть одинаковыми но из-за разрывов во времени и ошибок самих расчётов перед посылкой с того конца они разнятся. В этом и есть смысл того что мне надо собрать данные с 32-х потоков в одну структуру в то время когда они идеалистически должны быть одинаковыми. Получая каждое сообщение я рассчитываю эталон с которым буду сравнивать. Он рассчитывается по принципу того что я беру самое частое значение какое есть в списке последних сообщений с 32-х потоков для отдельного куска данных. Т.е. когда у меня есть около половины данных лучшее значение меняется на новое и у меня проблема что старые данные теперь выглядят как ошибки и неизвестно сколько из максимума 15-ти секунд мне ждать что-бы они пришли. Поэтому на ошибки мне надо проверять когда есть новый отрезок из 32 сообщений. Я не знаю когда отрезок начинается и кончается ещё и потому что иногда отдельные потоки из-за своих тараканов в голове высылают второе сообщение в то время как остальные потоки так не делают, то есть я не могу просто немного синхронизировать по времени а потом ждать пока придёт сообщение из потока от которого я уже получил, и считать это новым промежутком.
Ищу любые идеи так как в данное время я смотрю по времени и если повторное сообщение пришло больше 15+ секунд после предыдущего с данного потока то считаю его началом следующего отрезка, делаю что надо и жду, если меньше 15-ти секунд, жду ещё 4 (ну там немого деталей упущу, то 4 то 5, ходит туда обратно, пытается подстроится), и тогда делаю что надо с охапкой того что собрал. Как может быть очевидно, работает это процентов 65-80% времени, но есть сбои. В литературе не нашёл похожих проблем, может не там искал.