Приветствую!
На данный момент у меня реализована программа для расчета некоторых значений по формулам. Данные берутся из трех разных источников: "Источник 1", "Источник 2" и "Источник 3". В расчетный час, например в 15:00, мы по очереди обращаемся к источникам, запрашиваем у них данные и начинаем расчет, по окончании которого результат сохраняем в базу данных.
Была проблема в том, что у одного источника данные приходят с задержкой в 2 часа, но заказчик согласился с тем, что в 15:00 мы будем рассчитывать данные на 13:00, но все равно система работает не на 100% - всегда где-то да возникают задержки, нужна докачка данных, перерасчет и т.д.
Была сделана вторая версия программы, где я пытался реализовать идею "реактивности", что-то на подобии Excel'я, т.е. когда догружаются данные, то зависимые от них должны пересчитываться. Но что-то реализация получилась не очень...
Теперь думаю сделать третью реализацию на основе событий, т.е. например загрузили данные из первого источника, то в шину публикуем событие "Данные из первого источника загружены за период [от..., до...]", обработчик получает его, делает расчет и публикует новое событие "Такое-то значение было рассчитано ...", другой обработчик получает его, делает свои расчеты и публикует новое событие и т.д.
Как думаете третий вариант жизнеспособен?
В банковском ПО (да и в любом бухгалтерском, пожалуй) - часто делается таблица для текущего остатка в БД. Любая проводка, любой документ приводит к пополнению этой таблицы. Разумеется, в разрезе специфики проводки, типа документа, etc. То есть как некий осмысленный промежуточный результат, благодаря которому можно знать остатки на любой момент времени. Не уверен на 100%, что это именно то, что вам нужно, но подумайте в этом направлении, как подобные вопросы уже решались другими.
Да, хорошее направление! Я слышал, что в банковском ПО нет баланса клиента, а там якобы существуют события, типа: зачисление, снятие и т.д. И когда вам необходимо вычислить баланс, то эти события заново "проигрываются" до текущего момента...
Последний вариант я еще не реализовал, но по сути он тоже реактивный.
Во втором варианте мне не понравилась собственная реализация, а в третьем вроде как все просто: события, шина и обработчики...
Хотя думаю, что насобираю с десяток граблей при реализации...