使用 PubSubIO + 消息保证的 Google 数据流中的关闭和更新作业
shutdown and update job in Google Dataflow with PubSubIO + message guarantees
我一直在查看 google 数据流的源代码和文档,但没有看到任何关于 PubSubIO.Read
的消息传递语义的提及。
我想了解的问题是:PubSubIO 和 Google Dataflow 提供什么样的消息传递语义?根据我对源代码的阅读,消息在使用 ProcessingContext#output
方法发出之前会被确认。这意味着数据流流作业将丢失已确认但未传递的消息。
那么,Dataflow 如何保证(如果有的话)windows(尤其是会话)的正确性,以防万一作业失败和重新部署。
Dataflow 不会向 Pub/Sub 确认消息,直到它们在管道内的中间存储中持久化(或发送到接收器,如果管道内没有 GroupByKey)。我们还会在短时间内对从 Pub/Sub 读取的消息进行重复数据删除,以防止因错过确认而重复传递。因此,Dataflow 保证仅一次交付,对发布者在截然不同的时间插入的任何重复项取模。
当管道为 updated 时,运行 管道内缓冲的任何中间状态都将得到维护。流式传输管道不会失败——相反,它们会继续重试出现错误的元素。错误是暂时的并且元素最终将被成功处理,或者在一致异常(代码中的 NullPointerException 等)的情况下,您可以使用将用于处理失败元素的更正代码更新作业。
(请注意,DirectRunner 的实现不同,如果您正在查看该部分代码,可能会造成混淆。)
我一直在查看 google 数据流的源代码和文档,但没有看到任何关于 PubSubIO.Read
的消息传递语义的提及。
我想了解的问题是:PubSubIO 和 Google Dataflow 提供什么样的消息传递语义?根据我对源代码的阅读,消息在使用 ProcessingContext#output
方法发出之前会被确认。这意味着数据流流作业将丢失已确认但未传递的消息。
那么,Dataflow 如何保证(如果有的话)windows(尤其是会话)的正确性,以防万一作业失败和重新部署。
Dataflow 不会向 Pub/Sub 确认消息,直到它们在管道内的中间存储中持久化(或发送到接收器,如果管道内没有 GroupByKey)。我们还会在短时间内对从 Pub/Sub 读取的消息进行重复数据删除,以防止因错过确认而重复传递。因此,Dataflow 保证仅一次交付,对发布者在截然不同的时间插入的任何重复项取模。
当管道为 updated 时,运行 管道内缓冲的任何中间状态都将得到维护。流式传输管道不会失败——相反,它们会继续重试出现错误的元素。错误是暂时的并且元素最终将被成功处理,或者在一致异常(代码中的 NullPointerException 等)的情况下,您可以使用将用于处理失败元素的更正代码更新作业。
(请注意,DirectRunner 的实现不同,如果您正在查看该部分代码,可能会造成混淆。)