Russian Qt Forum

Программирование => Алгоритмы => Тема начата: Fregloin от Март 25, 2016, 12:59



Название: Проверка синхронности данных по каналам
Отправлено: Fregloin от Март 25, 2016, 12:59
Привет. Есть некоторые объекты , наследники от QObject, состояния которых приходит по сети в json (хотя не суть важно).
У объектов есть свойства, некоторые булевые, некоторые целочисленные, перечисления, float и строковые. Ну например
Код:
class StateObject : public QObject {
Q_PROPERTY (bool prop1 ...)
Q_PROPERTY (bool prop2 ...)
Q_PROPERTY (int prop3 ...)
Q_PROPERTY (float prop4 ...)
Q_PROPERTY (QString prop5 ...)
Q_PROPERTY (some_enum prop6 ...)
...
}
Состояние этого объекта обновляется несколько раз в секунду на основании данных с сети, парсится json, и обновляются свойства объекта, после чего его свойства уже читаются другими объектами.
Так вот, у меня 4 сетевых канала данных, по которым приходят состояния этого объекта. Иногда наблюдается рассинхронизация данных, например prop1 по одному каналу false, по остальным трем true.
Мне нужно проверять каждую секунду синхронность состояний StateObject. На каждое сетевое подключение свой экземпляр StateObject.
Таких объектов на самом деле много (тысячи). Но не все меняют свое состояние часто, одни периодически, одни асинхронно по событиям извне.
Так вот, сейчас синхронность проверяется тупым перебором свойств и сравниванием их значений. Я подумал, может есть более элегантное решение, например для каждого StateObject вычислять хеш его состояния на основании его свойств при каждом изменении, а дальше просто сравнивать их хеши. Нужно подобрать оптимальный вариант в плане производительности. Полагаю тупой перебор свойств у четырех экземпляров StateObject и сравнение QVariant не самое оптимальное решение.


Название: Re: Проверка синхронности данных по каналам
Отправлено: qate от Март 25, 2016, 13:53
Так вот, у меня 4 сетевых канала данных, по которым приходят состояния этого объекта. Иногда наблюдается рассинхронизация данных, например prop1 по одному каналу false, по остальным трем true.

а разве это проблема принимающего класса StateObject ?
ктото из сети ему дает неверные состояния ?

На каждое сетевое подключение свой экземпляр StateObject.

а почему бы не одно подключение (экземпляр StateObject) на 0.0.0.0 ?


Название: Re: Проверка синхронности данных по каналам
Отправлено: Fregloin от Март 25, 2016, 15:54
Есть два шкафа оборудования. Они дублируют друг друга. Типа горячий резерв.
К каждому шкафу подключено по два сервера.
Т.е. система два по два. Итого 4 канала. Т.к. в любой момент может выйти из строя один из шкафов или один из серверов, была выбрана такая вот схема.
К сожалению столкнулись с тем, что временами наблюдается рассинхронизация данных, которая возникает из за сетевых задержек, глюков оборудования и т.п.
В текущий момент пользователь видит данные только с одного канала, остальные как бы в горячем резерве. Если канал отваливается, происходит переключение на следующий.
Так вот, возникли ситуации, когда данные по некоторым объектам были в определенные периоды разными. Опустим здесь изъяны архитектуры, к сожалению я не могу на это повлиять,
каналы должны быть независимыми друг от друга. Поэтому конечная точка сведения данных моя программа. При возникновении рассинхрона, пользователю будет выдано об этом сообщение,
что бы он мог переключаться вручную, и смотреть какие данные по каким кланам в текущий момент.
Пока вроде с простым перебором свойств нагрузка на проц не очень большая, в пределах 1-2% на core i7 4770. Исполнительное оборудование по проще, core i5 второго поколения.
Просто я догадываюсь, что есть более изящные способы проверки. Как я упоминал выше, например расчёт хеша для каждого StateObject. Но как єто отразится на производительности.


Название: Re: Проверка синхронности данных по каналам
Отправлено: qate от Март 25, 2016, 16:42
да, сложно сказать не знаю эту вашу архитектуру, которую нельзя менять
а если поступающие значения не сразу выдавать дальше, а задержать их на пару секунд для синхрона ?
всеже постоянный пересчет выглядит как уж совсем костыль