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

How do I ensure idempotence with DataFlow and Cloud Pub Sub?

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

Dataflow 可以根据任意消息删除重复消息attribute (selected by idLabel) on the receiver side, as outlined in Using Record IDs。从生产者方面来看,您需要确保根据 MySQL 记录确定性和唯一性地填充属性。如果操作正确,Dataflow 将只处理每条逻辑记录一次。