Dataflow / Apache Beam 在哪个阶段确认 pub/sub 消息?

9

我有一个使用Pub/Sub订阅作为无界源的数据流处理工作。我想知道在哪个阶段数据流处理会确认收到Pub/Sub消息。如果在数据流处理管道的任何阶段抛出异常,似乎消息就会丢失。

此外,我想知道如何编写最佳实践的数据流处理管道,以便在失败时从Pub/Sub无界源中检索消息。谢谢!

1个回答

7

Dataflow Streaming Runner会在成功处理完一个bundle并且bundle的结果(输出和状态变化等)已经被持久化提交之后,确认收到的pubsub消息。失败的bundles会不断重试直到成功,并且不会导致数据丢失。如果您认为可能存在数据丢失,请提供详细信息(作业ID和您得出数据丢失结论的原因),我们将进行调查。


这是作业ID,2017-10-12_19_26_32-4234684930060241078。您可以在控制台中看到有一个阶段失败了,因此在其“输出集合”部分中没有显示任何内容。我无法通过新的数据流作业(取消此作业后)再次接收丢失的数据。我也无法使用pub/sub客户端库接收数据。 - Kakaji
1
嗯,如果您取消管道,则管道中的所有中间数据都将丢失。当数据流将数据摄入管道时,它会持久地存储数据并在出现瞬态错误的情况下保护其免受数据丢失的影响,但管道取消是另一回事。我想您希望在整个管道“完全处理”消息后进行确认,但这个概念几乎无法以一般方式定义。基本上,在出现故障的情况下,如果您想要保留数据,请使用“Update”功能更新管道以使用未出现故障的代码,或者使用“Drain”优雅地取消。 - jkff
1
我正在制作一个类似于“read_from_pubsub->process_message->send_outside”的流水线。在“send_outside”中,如果我从终端点收到50x错误等异常,我会将错误记录到日志中,并再次引发异常以供Dataflow捕获。问题是,在引发异常后,所有步骤都停止工作了。除了引发异常之外,我该如何正确返回send_outside函数? - sees
@sees 你找到解决方案了吗?我有一个类似的情况。我想知道在这种情况下消息是如何被确认的,因为它并没有像上面解释的那样“持久地提交”。 - Ashika Umanga Umagiliya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接