我阅读了这篇关于DataStream API的欺诈检测文章。在FraudDetector类的最终代码中,我看到下面的代码行,每当我们看到少量时,都会注册处理计时器。根据我的理解,每次调用这行时,它都会创建新的计时器(除了已经创建的计时器之外(,而不会替换现有的计时器。在这种情况下,我觉得代码中有缺陷。我想听听专家们对是否存在我怀疑的问题或我的理解是错误的的意见
context.timerService().registerProcessingTimeTimer(timer);
假设我们收到以下交易
1:00:00 AM - 0.58
1:00:50 AM - 0.51
1:01:40 AM - 520.00
为了简单起见,我假设事件时间和处理时间是相同的。
在1:00:00,第一个事件到达,由于它是少量的,它将注册1:01:00及以下的计时器将是值
flagState = true
timer = 1:01:00
registered timers will be 1:01:00
在1:00:50,第二个事件到达,由于它再次是少量的,值将设置为低于
flagState = true
timer = 1:01:50
registered timers will be 1:01:00 and 1:01:50
在1:01:00,ontimer将被调用,它将清除flagState和timerState值
在1:01:40,我们收到大额,即使它在最后一笔小额交易的一分钟内(1:00:50为.51(,由于flagState值被onTime设置为null,它不会创建警报
在1:01:50,onTimer将被再次调用,并将清除两个状态的值,尽管这两个状态都已在1:01:00 被上一次onTimer调用清除
根据我的理解,这段代码不会为1:01:50发生的大型交易创建警报,它应该已经创建了警报
在进行详细分析之前,我想澄清一点:Flink消除重复计时器,这意味着对于特定的密钥和时间戳,最多可以有一个计时器。(但是,这不会影响您概述的场景。(
您概述的问题不会发生,因为每个传入事务都会清除所有现有状态并删除任何现有计时器,然后才可能在状态中存储某些内容或创建新计时器。
因此,您所概述的场景的顺序是:
在1:00:00,第一个事件到达,由于它是一个小数量:
flagState = true
timerState = 1:01:00
timer registered for 1:01:00
在1:00:50,第二个事件到达,由于lastTransactionWasSmall != null
,我们调用cleanUp
,它清除两个状态并删除计时器。然后,由于这是一个小交易,我们执行以下操作:
flagState = true
timerState = 1:01:50
timer registered for 1:01:50
然后在1:01:40我们收到了大笔款项。我们生成警报,然后清除状态并删除计时器。没有定时器会启动。