google-cloud-dataflow - 通过 Google Cloud Pub/Sub 将数据重播到 Apache Beam 管道中,而不会使其他订阅者超载
问题描述
我在做什么:我正在构建一个系统,其中一个 Cloud Pub/Sub 主题将由数十个 Apache Beam 管道以流模式读取。每次我部署新管道时,它都应该首先处理几年的历史数据(存储在 BigQuery 中)。
问题:如果我在每次部署新管道时将历史数据重播到主题中(如此处所建议的),它也将被传送到当前正在读取该主题的所有其他管道,这将是浪费且非常昂贵的。我不能使用 Cloud Pub/Sub Seek(如这里所建议的那样),因为它最多存储 7 天的历史记录(更多详细信息在这里)。
问题:以最小的开销(并且不会导致事件时间/水印问题)将历史数据重播到新的 Apache Beam 流式管道中的推荐模式是什么?
当前想法:我目前可以想到三种解决问题的方法,但是,它们似乎都不是很优雅,而且我还没有看到文档、常见模式(第 1部分或第 2 部分)或其他地方提到的任何一种方法。他们是:
理想情况下,我可以使用Flatten将实时与一次性合并
ReadFromPubSub
,BigQuerySource
但是,我发现了三个潜在问题:a) 我无法解释已发布到 Pub/Sub 但尚未发布的数据进入 BigQuery,b)我不确定BigQuerySource
如果管道重新启动,是否可能会无意中重新运行,并且 c)我不确定是否BigQuerySource
在流模式下工作(根据此处的表)。我为每个管道创建一个单独的重播主题,然后使用Flatten
ReadFromPubSub
将主主题的 s 和特定于管道的重播主题合并。部署管道后,我将历史数据重播到特定于管道的重播主题。我为每个管道创建专用主题并部署一个单独的管道,该管道读取主要主题并将消息广播到特定于管道的主题。每当需要重播时,我都可以将数据重播到特定于管道的主题中。
解决方案
出于您的三个想法:
第一个将不起作用,因为当前 Python SDK 不支持从有界源进行无界读取(这意味着您无法将 a 添加
ReadFromBigQuery
到流式管道)。第三个听起来过于复杂,而且可能成本很高。
正如您正确指出的那样,我相信您目前最好的选择是如您所说,将您的表格重播为一个额外的 PubSub 主题,您可以用您的主要主题进行展平。
我会检查是否有更好的解决方案,但现在,选项 #2 应该可以解决问题。
另外,我建议您参考 Lyft 的一个有趣的演讲,内容是为他们的架构(在 Flink 中)做这件事。
推荐阅读
- c# - 在我从母版页重定向到另一个页面之前,内容页面回发正在触发
- python - 请解释python如何执行以下代码:
- laravel-5 - Laravel 5.5 和 CKEditor 选项
- java - 使用后如何清除此数组列表?
- unicode - 计算机如何以正确的编码在屏幕上显示字符?
- angularjs - ng-click 的 AngularJS 问题和内部的 2 个表达式,只有一个触发
- asp.net-mvc - LINQ 从 2 个表中获取数据 1 加入 group by
- pandoc - 使用 autotools 如何让 pandoc 在 c 程序旁边的 src 目录中运行
- javascript - 使用量角器时如何在两个值之间插入空格?
- typescript - 如何在向套接字发送消息之前检查房间是否存在?