我一直在查看google数据流的源代码和文档,我没有看到PubSubIO.Read
周围的消息传递语义。
我想要了解的问题是:PubSubIO和Google Dataflow提供了哪种消息传递语义?根据我对源代码的阅读,消息在使用ProcessingContext#output
方法发出之前会被激活。这意味着Dataflow流式传输作业将丢失已被确认但未传递的消息。
那么,在失败和重新部署作业的情况下,Dataflow如何保证(如果有的话)围绕Windows(尤其是会话)等的正确性。
答案 0 :(得分:2)
数据流不会向Pub / Sub发送消息,直到它们被保存在管道中的中间存储中(或者如果管道中没有GroupByKey则发送到接收器)。我们还会在短时间内对从Pub / Sub读取的消息进行重复数据删除,以防止错过的重复交付。因此,数据流确保一次交付,模拟出版商在极大的不同时间插入的任何重复项。
当管道为updated时,将保持在正在运行的管道中缓冲的任何中间状态。流管道不会失败 - 而是继续重试有错误的元素。错误是暂时的,并且元素最终会成功处理,或者在一致异常的情况下(代码中的NullPointerException等),您可以使用将用于处理失败元素的更正代码更新作业。
(请注意,DirectRunner的实现方式不同,如果您查看代码的这一部分,可能会造成混淆。)