Итак, я никогда не делал это сам, но рассуждая о вашей проблеме, я бы так к ней подходил ...
Мое решение немного запутанное, но мне не удалось найти другие способы достиженияэто без привлечения других внешних служб.Итак, здесь ничего не идет.
Вы могли бы иметь свой конвейер, считывающий как из pubsub, так и из GCS, а затем объединить их для дедупликации данных.Сложность в том, что один будет ограниченной коллекцией pCollection (GCS), а другой - неограниченной (pubsub).Вы можете добавить временные метки в ограниченную коллекцию и затем отобразить данные.На этом этапе вы можете отбросить данные GCS старше ~ 15 минут (продолжительность окна в вашей предыдущей реализации).Эти два шага (т.е. правильное добавление временных меток и удаление данных, которые, вероятно, достаточно стары, чтобы не создавать дубликаты), безусловно, являются самыми хитрыми частями.
Как только это будет решено, добавьте две pCollections и затем используйте GroupByKey для идентификатора, который является общим для обоих наборов данных.Это даст PCollection<KV<Long, Iterable<YOUR_DATUM_TYPE>>
.Затем вы можете использовать дополнительный DoFn, который удаляет все, кроме первого элемента в результирующем Iterable, а также удаляет бокс KV <>.После этого вы можете просто продолжить обработку данных, как обычно.
Наконец, эта дополнительная работа должна быть необходима только для первого окна pubsub при перезапуске конвейера.После этого вам следует переназначить pCollection GCS для пустой коллекции pCollection, чтобы группа по ключу не выполняла слишком много дополнительной работы.
Дайте мне знать, что вы думаете, и может ли это сработать.Кроме того, если вы решили придерживаться этой стратегии, пожалуйста, оставьте свой пробег :).