【问题标题】:Recover PubSub Acked messages from Dataflow after a region loss区域丢失后从 Dataflow 恢复 PubSub 确认的消息
【发布时间】:2020-03-10 19:41:06
【问题描述】:

我一直在阅读有关在流式传输中读取数据时 DataFlow 如何确认消息的信息。 根据herehere 的答案,DataFlow 似乎通过捆绑“确认”消息,只要它完成捆绑,它就会“确认”其中的消息。

当管道中有GroupByKeyinvolved 时会发生什么混乱。捆绑包中的数据将被持久化到多区域存储桶中,并且消息将被确认。然后想象整个区域都在下降。中间数据还是会在桶里(因为我们是多区域的)。

话虽如此,

  1. 为了不丢失任何数据,应遵循哪些步骤?
  2. 有关如何处理这种主动/主动方法以便在区域完全关闭时不丢失数据的任何建议?

请指教,

【问题讨论】:

  • 你看的是流媒体引擎还是没有流媒体引擎?
  • @JayadeepJayaraman 流媒体引擎。

标签: google-cloud-platform google-cloud-dataflow google-cloud-pubsub


【解决方案1】:

使用 Dataflow 和 PubSubIO 的当前实现,实现至少一次交付取决于可用的检查点状态。取消时必须始终排空管道;否则,检查点状态可能会丢失。如果整个区域不可用,而您需要在另一个区域启动作业,我相信这相当于取消了管道而不排水。

我们有几个简单的流式 Dataflow 管道,它们从 PubSub 读取并写入 PubSub,而无需调用 GroupByKey,因此不涉及检查点状态,并且消息仅在传递到输出主题后才被确认。

我们还有其他管道从 Pubsub 读取并写入 GCS 或 BigQuery。 FileIO 和 BigQueryIO 都包含多个 GroupByKey 操作,因此我们很容易受到数据丢失的影响,即检查点消息被丢弃。我们曾多次遇到这些管道进入需要取消的不可恢复状态。在这些情况下,我们必须回填我们数据架构早期阶段的部分数据。

此时,Beam 不提供延迟通过 GroupByKey 确认 Pubsub 消息的解决方案,因此您需要接受该风险并构建可以从丢失的检查点状态中恢复的操作工作流,或者通过接收消息来解决该问题到 Beam 之外的不同数据存储。

【讨论】:

  • 据我了解,DataFlow 不支持 Job 重启。这意味着,我有两个选择:(1)如果检查点数据是可恢复的,我必须创建一个操作流程来回填数据以重新处理它,或者(2)如果检查点数据不可恢复,那么我丢失了之前由 PubSubIO 确认的数据。对吗?
  • 实际上,为了防止数据丢失,您可以使用 Pub/Sub 保留机制。您可以将其配置为最多保留 7 天的确认消息。 cloud.google.com/pubsub/docs/replay-overview
  • Dataflow 支持“更新”未清除检查点状态的作业,但新工作人员使用更新的管道代码启动。因此,如果您的管道由于您自己的代码而变得不健康,则可以在不丢失状态的情况下进行修复和部署更新。
猜你喜欢
  • 2018-01-01
  • 1970-01-01
  • 2017-10-23
  • 2020-08-08
  • 2019-07-02
  • 2020-07-27
  • 2021-06-18
  • 2021-10-17
  • 1970-01-01
相关资源
最近更新 更多