Dataflow/Apache Beam 在啥阶段确认发布/订阅消息?

Posted

技术标签:

【中文标题】Dataflow/Apache Beam 在啥阶段确认发布/订阅消息?【英文标题】:At what stage does Dataflow/Apache Beam ack a pub/sub message?Dataflow/Apache Beam 在什么阶段确认发布/订阅消息? 【发布时间】:2018-03-25 02:17:01 【问题描述】:

我有一个将 Pub/Sub 订阅作为无限源的数据流流作业。我想知道数据流在什么阶段确认传入的发布/订阅消息。在我看来,如果在数据流管道的任何阶段引发异常,消息就会丢失。

我还想知道如何使用 pub/sub 无限源编写数据流管道的最佳实践,以便在失败时检索消息。谢谢!

【问题讨论】:

【参考方案1】:

在捆绑成功并且捆绑的结果(输出和状态突变等)已被持久提交后,Dataflow Streaming Runner 会确认捆绑接收的 pubsub 消息。失败的捆绑包会重试直到成功,并且不会导致数据丢失。如果您认为可能会发生数据丢失,请提供详细信息(作业 ID 和您得出结论认为数据已因故障而丢失的原因),我们将进行调查。

【讨论】:

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

以上是关于Dataflow/Apache Beam 在啥阶段确认发布/订阅消息?的主要内容,如果未能解决你的问题,请参考以下文章

GCP Dataflow + Apache Beam - 缓存问题

无法在 DataFlow Apache Beam 中创建通用日期转换类

Google Dataflow (Apache beam) JdbcIO 批量插入 mysql 数据库

我可以在多个键(连接条件)上连接 Dataflow(Apache Beam)中的两个表吗?

开发手册在啥阶段用

java junit有啥作用呢,普遍用在啥地方呢