进入互联网时代,你的绝大部分操作都可以在网上进行,极大的方便了我们的生活。但是信用卡盗刷者也可以利用网络来诈骗,典型的做法是:诈骗者首先入侵安全级别较低系统来盗窃信用卡卡号,用盗得的信用卡进行很小额度的消费进行测试,如果测试消费成功,那么他们就会用这个信用卡进行大笔消费,来购买那些可以倒卖的财物,实现诈骗敛财的目标。
大部分银行都有针对信用卡诈骗的反欺诈检测系统,通过对诈骗模式进行识别,及时通知用户或者直接冻结账户,来避免进一步损失。flink的入门介绍文档中就展示一种信用卡诈骗检测的实现方式,但是数据来源是一个静态数组,不符合实际用户场景。本文将介绍一种方案,通过少于 100 行代码修改该实例程序,实现基于 Oracle 上账户表变更的实时欺诈检测。
1.传统实时欺诈检测方案分析
Flink示例程序会检测每一笔交易,若发现一个帐户在 1 分钟内,先出现了一笔小交易(小于 1),后面又出现了一笔大交易(大于 500),则认为出现了欺诈交易,立即输出警告。具体的代码解析可以阅读基于DataStream API 实现欺诈检测
但是,示例程序中的数据来源 TransactionSource 的数据来源是一个静态数组 private static List<Transaction> data = Arrays.asList(new Transaction(1L, 0L, 188.23D)...的迭代器。一般情况下,客户的余额是存储在 Oracle 的账户表中的。怎么将客户余额的变化输出到 Flink 中,来实现实时的欺诈检测列?能想到的方案列举如下:
-
方案 1:轮询从 Oracle 账户表查询余额变更 应用程序固定时间间隔去轮询 Oracle 账户表的数据,检查到某个客户的账户余额发生了变化后,通知 Flink 进行欺诈检测。这种方案需要不断轮询 Oracle 数据库,对有数据库性能影响,并且就算轮询的间隔足够短,还是有可能漏掉了一些账户变更信息,不可取。
-
方案 2:业务代码修改 Oracle 账户表时通知 Flink 修改交易程序,在它去更新 Oracle 账户表时,通知 Flink 进行欺诈检测。这种方案的优势在于不会丢掉任何账户变更的事件;但是需要修改交易程序,会导致业务程序耦合度提升。实现上如果采用同步模式,可能会由于 Flink 失败而导致交易失败,也会大大提高交易持续时间;而采用异步方式,需要考虑通知 Flink 和写入账户表的原子性,有可能成功通知了 Flink 但是写入账户表失败了,也有可能写入账户表成功了,却没有通知到 Flink。
-
方案 3:利用 logminer 抽取账户表变更 Oracle 提供 logminer 来将数据库日志反解析成变更 SQL,这样就可以将 Oracle 账户表更新的信息抽取出来,通知 Flink 进行欺诈检测。这种方案的优点在于直接基于 Oracle 数据表的修改来做增量的同步(oracle 日志中记录账户表修改并提交了,说明客户修改账户是成功的,不用担心 Flink 通知了,账户表反而写失败了),降低了业务的耦合度,也不会担心丢失了账户变更事件;但是 logminer 每次只能挖掘一整个日志的变化,没法断点续传,并且挖掘的数据也只能写入 alert.log,会污染错误日志。这个方案缺陷也比较大。
上述三个方案都有一定的缺陷和问题,要么可能会漏掉部分变更数据,要么可能影响 oracle 性能。logminer 相对来说是避免漏数据,对数据库性能影响最小的方案,是否有一个类似于 logminer 而且支持断点续传,对 Flink 又比较友好的方案?
-
方案 4:利用 OGG 抽取账户表变更 Oracle 公司的 OGG 和国内部分厂商基本能避免 logminer 的缺点,但是需要在