5

我很好奇在使用 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 已经处理了这个问题?

4

1 回答 1

6

Dataflow 可以根据接收方的任意消息属性(由 选择idLabel)对消息进行重复数据删除,如使用记录 ID中所述。在生产者方面,您需要确保基于 MySQL 记录确定性且唯一地填充属性。如果正确执行此操作,Dataflow 将只处理每个逻辑记录一次。

于 2016-02-15T16:19:10.763 回答