Dataflow GroupByKey 对于小 window 的流式管道非常慢(最好是 2 秒)

Dataflow GroupByKey is very slow for streaming pipeline with small window (preferably 2 seconds)

我有一个简单的数据流管道配置为 2 秒固定 windows。它从 pub/sub 中读取,将消息反序列化为对象,记录对象,按给定键对对象进行分组,然后对分组的对象进行一些处理。请记住,这是一个从 1 个 VM 开始的数据流作业(不像它甚至需要进行随机播放,因为它只有 1 个 VM)。而且它只看到几个(比如 2-3 个)messages/sec.

| "read_messages" >> io.ReadFromPubSub(subscription=input_topic_subscription_path)
         | "window" >> WindowInto(FixedWindows(2))
         | "deser_obj" >> ParDo(DeSerializeToObject())
         | "key_by_id" >> WithKeys(lambda obj: obj.id)
         | "group_by_player_id" >> GroupByKey()
         | "process_group" >> ParDo(ProcessGroup())

我看到的问题是 GroupByKey 持续花费大约 36 秒。 process_group 阶段的日志总是比 deser_obj 阶段的日志晚 25-40 秒。因此,管道的 data freshness 大约需要 36 秒。这似乎没有意义:拥有一个以 2 秒微批次处理的流式管道,但每个微批次需要 36 秒才能完成。

我什至完全遵循了这个 GCP 教程,结果是一样的(即每个 window 需要 36 秒,GroupByKey 是瓶颈):https://cloud.google.com/pubsub/docs/pubsub-dataflow#python

Dataflow 不是设计为以小时间间隔(如 2 秒微批次)进行流式传输吗?根据我看到的数字,如果您的流媒体需求的 SLA > 40 秒,我只推荐数据流流媒体。

数据流(尚未)调整为处理 10 秒以下的延迟是正确的,尽管 36 秒似乎有点慢。仅供参考,ReadFromPubSub 确实引入了随机播放以确保恰好一次,即没有重复),并且 GroupByKey 也进行了完整的分布式随机播放,尽管只有一个虚拟机。