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

edh*_*ose 4 google-cloud-pubsub google-cloud-dataflow

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

Sam*_*ety 6

数据流可以根据接收方的任意消息属性(选择idLabel)对消息进行重复数据删除,如使用记录ID中所述.从生产者方面来说,您需要确保基于MySQL记录确定性地和唯一地填充属性.如果这样做正确,Dataflow将只处理每个逻辑记录一次.