如何确保DataFlow和Cloud Pub Sub的幂等性?

时间:2016-02-14 21:19:16

标签: google-cloud-dataflow google-cloud-pubsub

我很好奇使用Cloud DataFlow和PubSub时确保幂等性的最佳方法?

我们目前有一个系统可以处理和存储MySQL数据库中的记录。我对使用DataFlow进行一些报告感到好奇,但是想了解我需要做些什么来确保我不会意外地重复计算(或者多次计算)相同的消息。

我的困惑分为两部分,首先确保我只发送一次消息,然后确保我只处理一次。

我的直觉如下:

每当我感兴趣的事件被记录在我们的MySQL数据库中时,将其转换为PubSub消息并将其发布到PubSub。 假设成功,记录与MySQL记录一起返回的PubSub id。这样,如果它有一个PubSub ID,我知道我发送了它,我不需要再发送它。如果发布到PubSub失败,那么我知道我需要再次发送它。一切都好。

但是如果在PubSub写入成功后对MySQL的写入失败,我可能最终会再次向pub sub发布相同的消息,所以我需要在DataFlow端处理这种情况和PubSub发送消息的情况两次(根据https://cloud.google.com/pubsub/subscriber#guarantees)。

处理此问题的最佳方法是什么?在AppEngine或其他系统中,我会检查数据存储区以查看我创建的新记录是否存在,但我不确定如何使用DataFlow执行此操作。有没有办法可以轻松实现过滤器来阻止消息被处理两次?或者DataFlow是否已处理此问题?

1 个答案:

答案 0 :(得分:6)

数据流可以根据attribute中概述的任意消息Using Record IDs(由idLabel选择)在消息接收方重复消息。从生产者方面来说,您需要确保基于MySQL记录确定性地和唯一地填充属性。如果这样做正确,Dataflow将只处理一次逻辑记录。