欺诈检测 DataStream API 教程问题

Fraud Detection DataStream API tutorial questions

我正在学习教程 here

Q1:为什么在最终的应用中,无论当前交易金额如何,只要flagState = true就清除所有状态并删除定时器?我参考这部分代码:

// Check if the flag is set
if (lastTransactionWasSmall != null) {
    if (transaction.getAmount() > LARGE_AMOUNT) {
        //Output an alert downstream
        Alert alert = new Alert();
        alert.setId(transaction.getAccountId());

        collector.collect(alert);
    }
    // Clean up our state [WHY HERE?]
    cleanUp(context);
}

如果事务的数据流是 0.5, 10, 600,则 flagState 将为 0.5 设置,然后为 10 清除。所以对于600,我们跳过上面的代码块,不检查large amount。但是,如果 0.5600 笔交易在一分钟内发生,我们应该发送警报,但我们没有。

Q2:为什么要用处理时间来判断两笔交易是否相隔1分钟?事务 class 有一个 timeStamp 字段所以使用事件时间不是更好吗?由于处理时间会受到应用程序速度的影响,因此事件时间相差在 1 分钟以内的两个事务可能会由于延迟而被处理 > 1 分钟。

A1:本例中使用的欺诈模型由下图解释:

在您的示例中,交易 600 必须紧跟在 0.5 的交易之后才能被视为欺诈。由于 10 的中间交易,这不是欺诈,即使所有三笔交易都在一分钟内发生。这只是用例如何构建的问题。

A2:使用事件时间执行此操作将是一个非常有效的选择,但会使示例更加复杂。不仅需要水印,而且我们还必须按事件时间对流进行排序,因为一个现实的例子必须考虑到事件可能是乱序的。

到那个时候,用流程函数来实现就不再是最好的选择了。使用 Flink 的 CEP 库或 Flink SQL 与 MATCH_RECOGNIZE 的时间模式匹配功能是可行的方法。