首页 > 解决方案 > 通过 Google Cloud Pub/Sub 将数据重播到 Apache Beam 管道中,而不会使其他订阅者超载

问题描述

我在做什么:我正在构建一个系统,其中一个 Cloud Pub/Sub 主题将由数十个 Apache Beam 管道以流模式读取。每次我部署新管道时,它都应该首先处理几年的历史数据(存储在 BigQuery 中)。

问题:如果我在每次部署新管道时将历史数据重播到主题中(如此处所建议),它也将被传送到当前正在读取该主题的所有其他管道,这将是浪费且非常昂贵的。我不能使用 Cloud Pub/Sub Seek(如这里所建议的那样),因为它最多存储 7 天的历史记录(更多详细信息在这里)。

问题:以最小的开销(并且不会导致事件时间/水印问题)将历史数据重播到新的 Apache Beam 流式管道中的推荐模式是什么?

当前想法:我目前可以想到三种解决问题的方法,但是,它们似乎都不是很优雅,而且我还没有看到文档、常见模式(第 1部分或第 2 部分)或其他地方提到的任何一种方法。他们是:

  1. 理想情况下,我可以使用Flatten将实时与一次性合并ReadFromPubSubBigQuerySource但是,我发现了三个潜在问题:a) 我无法解释已发布到 Pub/Sub 但尚未发布的数据进入 BigQuery,b)我不确定BigQuerySource如果管道重新启动,是否可能会无意中重新运行,并且 c)我不确定是否BigQuerySource在流模式下工作(根据此处的表)。

  2. 我为每个管道创建一个单独的重播主题,然后使用FlattenReadFromPubSub将主主题的 s 和特定于管道的重播主题合并。部署管道后,我将历史数据重播到特定于管道的重播主题。

  3. 我为每个管道创建专用主题并部署一个单独的管道,该管道读取主要主题并将消息广播到特定于管道的主题。每当需要重播时,我都可以将数据重播到特定于管道的主题中。

标签: google-cloud-dataflowapache-beamgoogle-cloud-pubsubapache-beam-io

解决方案


出于您的三个想法:

  • 第一个将不起作用,因为当前 Python SDK 不支持从有界源进行无界读取(这意味着您无法将 a 添加ReadFromBigQuery到流式管道)。

  • 第三个听起来过于复杂,而且可能成本很高。

正如您正确指出的那样,我相信您目前最好的选择是如您所说,将您的表格重播为一个额外的 PubSub 主题,您可以用您的主要主题进行展平。

我会检查是否有更好的解决方案,但现在,选项 #2 应该可以解决问题。


另外,我建议您参考 Lyft 的一个有趣的演讲,内容是为他们的架构(在 Flink 中)做这件事。


推荐阅读