我很好奇在使用 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(由 idLabel
选择)对消息进行重复数据删除,如 Using Record IDs 中所述。从生产者方面来看,您需要确保根据 MySQL 记录确定性和唯一性地填充属性。如果正确执行此操作,Dataflow 将只处理每个逻辑记录一次。
关于google-cloud-dataflow - 如何确保 DataFlow 和 Cloud Pub Sub 的幂等性?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35398117/