Мне не удается найти подходящую стратегию управления окнами для моих текущих потребностей, используя Apache Beam с Java, развернутый в потоке данных Google.
TLDR
Мне нужно закрывать любое окно для ключа всякий раз, когда запускается новое, но до тех пор должно быть разрешено неопределенное время ожидания.
Пояснение
У меня естьпоток обновлений, поступающих из Pubsub.Каждое обновление обновляет запись, идентифицированную ключом, и имеет метку времени, когда это обновление было произведено.
Теперь я хочу сохранить эти обновления в базе данных Firestore, где мне нужна гарантия, что у меня всегда естьПоследняя версия.Поскольку несколько обновлений одной и той же записи могут происходить в непосредственной близости, я хотел бы объединить обновления и выбрать только самые последние.
Группа операций по 101 * * помогает здесь, но работа с окнами по-прежнему проблематична.
Проблема в том, что я хочу, чтобы ключ Latest.perKey был глобальным, а не для каждого окна.Таким образом, я могу использовать фиксированную / скользящую / сеансовую Windows, но мне нужно закрыть эти окна не по задержке, а по запуску нового окна.
Когда запускается новое окно, это означает, что данные новее, чемпоявилось предыдущее окно, и поэтому все предыдущее окно может быть отброшено, включая любые поздние данные.Однако до тех пор, пока не поступят данные для более нового окна и не будет открыто новое окно, данные могут поступить на неопределенное время с опозданием.
Есть ли способ сделать это с помощью стандартных окон?
FixedWindow или Sessions кажутся несколько уместными, но я не вижу способа отменить предыдущие окна при запуске нового.
Я мог бы использовать чтение перед записью и полностью избавиться от окна., но я стараюсь не увеличивать количество операций чтения Firestore на огромное количество.