如何使用 DataFlow 和 Cloud Pub Sub 确保幂等性?
Posted
技术标签:
【中文标题】如何使用 DataFlow 和 Cloud Pub Sub 确保幂等性?【英文标题】:How do I ensure idempotence with DataFlow and Cloud Pub Sub? 【发布时间】:2016-05-25 16:46:45 【问题描述】:我很好奇在使用 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】:Dataflow 可以根据接收方的任意消息attribute(由idLabel
选择)对消息进行重复数据删除,如Using Record IDs 中所述。在生产者方面,您需要确保基于 MySQL 记录确定性且唯一地填充属性。如果正确完成,Dataflow 将只处理每个逻辑记录一次。
【讨论】:
以上是关于如何使用 DataFlow 和 Cloud Pub Sub 确保幂等性?的主要内容,如果未能解决你的问题,请参考以下文章
Google Cloud Dataflow Pub/Sub to BigQuery 模板 WriteSuccessfulRecords wall time
如何从 Dataflow 批量(有效)发布到 Pub/Sub?
如何使用 Stream 为 Spring Cloud Dataflow 中的子任务设置全局属性 - Task-Launcher-Dataflow