В настоящее время мы выполняем агрегацию данных в реальном времени в хранилище событий. Идея состоит в том, чтобы визуализировать данные транзакций для нескольких временных диапазонов (ежемесячно, еженедельно, ежедневно, ежечасно) и для нескольких номинальных ключей. У нас регулярно появляются запоздалые данные, поэтому мы должны это учитывать. Кроме того, необходимо отображать «текущие» результаты, то есть значение текущего окна еще до его завершения.
В настоящее время мы используем для этого Kafka и Apache Storm (в частности, Trident, т.е. микробатчи). Наша архитектура выглядит примерно так:
(извиняюсь за мои уродливые картинки). Мы используем MongoDB в качестве хранилища значений ключей, чтобы сохранить состояние, а затем сделать его доступным (только для чтения) микросервисом, который возвращает текущее значение, для которого он был запрошен. Существует множество проблем с этим дизайном
- Код действительно требует значительного обслуживания
- Действительно трудно точно выполнить однократную обработку таким способом
- Обновление состояния после того, как каждая агрегация, очевидно, влияет на производительность, но она достаточно быстра verbose) стали доступны с тех пор, как мы начали этот проект. Испытывать это казалось похоже на запись в базу данных, особенно mongoDB больше не является современным. Стандартный вариант использования, который я видел, - это внутреннее сохранение состояния в RocksDB или памяти, а затем запись в Kafka после завершения работы окна.
К сожалению, из-за этого довольно сложно отобразить промежуточные результаты, и поскольку состояние сохраняется внутренне, нам нужно, чтобы допустимая задержка событий была порядка нескольких месяцев или лет. Есть ли лучшее решение для этих требований, чем захват потока в реальном времени? Лично я чувствую, что это стандартное требование, но не смог найти стандартного решения для этого.