На ваш вопрос есть два ответа.Один специфичен для вашего случая использования, а другой - в основном для пакетирования / создания окон в потоковой передаче.
Специфично для вашего конвейера
Я предполагаю, чтоключом для хранилища данных является идентификатор пользователя?В этом случае, если у вас есть события от одного и того же пользователя в более чем одном окне, ваши операции GroupByKey
или Combine
будут иметь один отдельный элемент для каждой пары user + window.
Так что вопрос: Что вы пытаетесь вставить в хранилище данных?
- Результирующий агрегат отдельного пользователя за все время ?В этом случае вам нужно будет использовать глобальное окно.
- Полученный в результате агрегат пользователя за каждые 30 секунд?Затем вам нужно использовать окно как часть ключа, который вы используете для вставки в хранилище данных.Это помогает / имеет смысл?
Рад помочь вам спроектировать ваш конвейер так, как вы хотите.Поговорите со мной в комментариях или через SO-чат.
Большой вопрос о связывании данных
Стратегии связывания будут варьироваться в зависимости от участника.В потоке данных вы должны учитывать следующие два фактора:
- Каждому работнику назначается ключевой диапазон.Элементы для одного и того же ключа будут обрабатываться одним и тем же рабочим.
- Окна принадлежат отдельным элементам;но пакет может содержать элементы из нескольких окон .Например, если метрика свежести данных делает большой скачок *, может быть запущено несколько окон - и элементы одного и того же ключа в разных окнах будет обрабатываться в том же пакете .
* - когда может внезапно начаться скачок свежести данных?Поток с одним элементом с очень старой временной меткой, который обрабатывается очень медленно, может долго удерживать водяной знак.После обработки этого элемента водяной знак может сильно перепрыгнуть к следующему самому старому элементу ( Ознакомьтесь с этой лекцией по водяным знакам;) ).