区域丢失后从 Dataflow 恢复 PubSub Acked 消息

dbu*_*osp 2 google-cloud-platform google-cloud-pubsub google-cloud-dataflow

我一直在阅读有关 DataFlow 在读取流数据时如何确认消息的内容。基于这里这里的答案的答案,似乎 DataFlow 按捆绑“确认”消息,只要完成捆绑,就会“确认”其中的消息。

混乱n是当GroupByKey管道中涉及到a时会发生什么。捆绑包中的数据将持久保存到多区域存储桶中,并且消息将得到确认。然后想象整个地区都崩溃了。中间数据仍然会在桶中(因为我们是多区域的)。

话虽如此,

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

请指教,

Jef*_*kas 5

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

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

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

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