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

Posted

技术标签:

【中文标题】通过 Google Cloud Pub/Sub 将数据重播到 Apache Beam 管道中,而不会使其他订阅者超载【英文标题】:Replaying data into Apache Beam pipeline over Google Cloud Pub/Sub without overloading other subscribers 【发布时间】:2019-07-30 16:14:58 【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

【参考方案1】:

根据您的三个想法:

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

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

我相信您目前最好的选择是如您所说,将您的表格重播到一个额外的 PubSub 主题中,正如您正确指出的那样。

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


另外,我建议您联系interesting talk from Lyft on doing this for their architecture(在 Flink 中)。

【讨论】:

感谢您的意见 - 非常有趣的谈话,似乎他决定采用与 #2 非常相似的方法。如果我尝试创建一个以流模式读取 BigQuery 的自定义源,您知道我是否会遇到困难?

以上是关于通过 Google Cloud Pub/Sub 将数据重播到 Apache Beam 管道中,而不会使其他订阅者超载的主要内容,如果未能解决你的问题,请参考以下文章

如何修改后台 Cloud Function 的 Google Cloud Pub/Sub 订阅确认截止日期

如何通过 Google Cloud Monitoring JAVA 客户端库获取 Pub/Sub 订阅中未确认消息的数量

如何将 Google Cloud Platform Pub/Sub 消息推送到 C# 桌面应用程序

Google Cloud Pub/Sub 中的积压工作

Google Cloud Pub/Sub 如何避免时钟偏差

如何在将消息发布到 Google Cloud Pub/Sub 时找出未找到的资源?