Как обеспечить Flux данными временных рядов в реальном времени, начиная с определенного времени в прошлом? - PullRequest
1 голос
/ 28 февраля 2020

Моя цель - разработать хранилище, которое предоставляет поток данных временных рядов в реальном времени, начиная с определенного времени в прошлом. Хранилище должно предоставлять API следующим образом:

public interface TimeSeriesRepository {
//returns a Flux with incoming live data without considering past data
public Flux<TimeSeriesData> getLiveData();

//returns a Flux with incoming live data starting at startTime
public Flux<TimeSeriesData> getLiveData(Instant startTime);
}

Допущения и ограничения:

  • приложение использует Java 11, Spring Boot 2 / Spring 5
  • данные хранятся в реляционной базе данных, такой как Postre SQL, и имеют метки времени.
  • данные регулярно обновляются новыми данными от внешнего субъекта
  • брокер RabbitMQ является доступны и могут быть использованы (при необходимости)
  • не должны включать компоненты, для которых требуется кластер Zookeeper или аналогичные, например, журналы событий, такие как Apache Kafka или Apache Pulsar или потоковые процессоры, такие как Apache Storm или Apache Flink, потому что это не крупномасштабное облачное приложение, но оно должно работать на обычном P C (например, с 8 ГБ ОЗУ)

Моя первая идея состояла в том, чтобы использовать Debezium для пересылать входящие данные в RabbitMQ и использовать Reactor RabbitMQ для создания Flux. На самом деле это был мой первоначальный план, прежде чем я понял, что второй метод в хранилище, который учитывает исторические данные, также необходим. Однако это решение не предоставило бы исторических данных.

Таким образом, я подумал об использовании журнала событий, такого как Kafka, чтобы я мог воспроизвести данные из прошлого, но обнаружил, что операционные издержки слишком высоки. Поэтому я отклонил эту идею и даже не удосужился выяснить детали того, как это могло бы сработать, или потенциальных недостатков.

Теперь я рассмотрел использование Spring Data R2DB C, но не мог понять, как должен выглядеть запрос, который удовлетворяет моей цели.

Как я могу реализовать Интерфейс, используя любой из упомянутых инструментов или, может быть, даже с простыми данными Java / Spring?

Я приму любой ответ, который кажется подходящим.

...