Duplicates 即使使用withIdAttribute,也会在Apache Beam/Dataflow输入上复制

Duplicates 即使使用withIdAttribute,也会在Apache Beam/Dataflow输入上复制,duplicates,google-cloud-dataflow,apache-beam,google-cloud-pubsub,Duplicates,Google Cloud Dataflow,Apache Beam,Google Cloud Pubsub,我正在尝试将数据从第三方API摄取到数据流管道中。由于第三方不提供Webhook,我编写了一个自定义脚本,不断轮询其端点以获取更多数据 数据每15分钟刷新一次,但因为我不想错过任何数据点,而且我想在新数据可用时立即使用,所以我的“爬虫”每1分钟运行一次。然后,脚本将数据发送到PubSub主题。很容易看出,PubSub将为源中的每个数据点接收大约15条重复消息 我第一次尝试识别和丢弃这些重复的消息是向每个PubSub消息(eventid)添加一个自定义属性,该消息是从源位置的[ID+更新时间]散列

我正在尝试将数据从第三方API摄取到数据流管道中。由于第三方不提供Webhook,我编写了一个自定义脚本,不断轮询其端点以获取更多数据

数据每15分钟刷新一次,但因为我不想错过任何数据点,而且我想在新数据可用时立即使用,所以我的“爬虫”每1分钟运行一次。然后,脚本将数据发送到PubSub主题。很容易看出,PubSub将为源中的每个数据点接收大约15条重复消息

我第一次尝试识别和丢弃这些重复的消息是向每个PubSub消息(
eventid
)添加一个自定义属性,该消息是从源位置的[ID+更新时间]散列创建的

const属性={
eventid:Buffer.from(`${item.lastupdate}|${item.segmentid}').toString('base64'),
timestamp:item.timestamp.toString()
};
const-dataBuffer=Buffer.from(JSON.stringify(item))
publisher.publish(数据缓冲区,属性)
然后我使用配置了数据流(这是新的
idLabel()
,基于)

PCollection输入=p
.apply(“ReadFromPubSub”,PubsubIO
.readStrings()
.fromTopic(String.format(“projects/%s/topics/%s”、options.getProject()、options.getIncomingDataTopic()))
.WithTimestamp属性(“时间戳”)
.withIdAttribute(“事件ID”))
.apply(“outputObjQuery”,…)
在该实现中,我希望当脚本第二次发送相同的数据点时,重复的
eventid
将是相同的,消息将被丢弃。但由于某些原因,我仍然在输出数据集上看到重复项

一些问题:

  • 如果第三方API不提供Webhook,是否有一种聪明的方法将数据从该API摄取到数据流
  • 关于为什么dataflow没有丢弃这种情况下的消息,有什么想法吗?
    • 我知道数据流上的重复数据消除有10分钟的限制,但即使在第二次插入时(2分钟),我也会看到重复数据

  • 任何帮助都将不胜感激

    我认为您的思路是对的,我建议使用时间戳而不是哈希。更好的方法是使用windows。查看此选项,它会过滤窗口外的数据


    关于额外的重复数据,如果您正在使用请求订阅,并且在处理数据之前已达到确认截止日期,则将根据重新发送消息。在本例中,更改确认截止时间,默认值为10秒。

    我不太确定pubsub对eventid的保证,但您必须能够使用GroupByKey操作或使用有状态操作进行重复数据消除HM,没有将GroupByKey视为重复数据消除的一种方式。如果我希望在15分钟内收到这些加倍的数据,这意味着我需要一个至少有这段时间的窗口,这样一个组就可以消除所有重复的数据,对吗?