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

Recover PubSub Acked messages from Dataflow after a region loss

我一直在阅读有关 DataFlow 在流式传输中读取数据时如何确认消息的信息。 根据答案 and ,似乎DataFlow 'ack' 消息是按捆绑的,只要完成捆绑,它就会'ack' 中的消息。

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

也就是说,

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

请指教,

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

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

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

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