有没有一种方法可以在消息到达PubSub后使用Dataflow删除SQS中的消息



我有以下基础设施:Dataflow用于将消息从AWS SQS发送到Google Cloud的Pub/Sub。使用java和Apache Beam(SqsIO(读取消息。

一旦AWS SQS中的消息到达/在PubSub中读取,Dataflow是否有办法删除这些消息?这会是什么样子?这可以用Apache Beam在java中完成吗?

感谢您提前回答!

没有内置的消息删除支持,但您可以添加代码来删除使用Beam ParDo从AWS SQS读取的消息。但您必须小心执行这样的删除操作。

Beam runner使用一个或多个工人执行读取。给定的工作项随时可能失败,运行者通常会重新运行失败的工作项。此外,大多数跑步者会融合多个步骤。例如,如果您有一个Read转换,后面跟着一个deleteParDo,运行程序可能会融合这些转换并一起执行它们。现在,如果工作项在部分删除数据后失败,则重新运行此类工作项可能会失败或产生不正确的数据。

通常的解决方案是在两个步骤之间添加一个熔合中断。您可以通过Beam的Reshuffle.viaRandomKey((变换(或仅通过添加任何使用GroupByKey的变换(来实现这一点。例如,程序的流程可以如下所示。

pipeline
.apply(SqsIO.read())
.apply(Reshuffle.viaRandomKey())
.apply(ParDo.of(new DeleteSQSDoFn()))
.apply(BigQuery.Write(...))

最新更新