作者:Heng Ma|RisingWave Content lead
随着在线交易量的与日俱增,商家和支付服务提供商共同面临着实时识别和预防欺诈行为的棘手挑战。传统的欺诈检测系统通常在交易发生数小时甚至数天后才进行分析,无法满足当下的需要,实时欺诈检测的重要性愈发突出。
然而,构建一个实时欺诈检测系统历来复杂且成本高昂。通常需要多种技术组件,包括数据收集、数据处理、检测机制和响应逻辑。这样的架构集成难度大,维护要求高,且在交易量剧增时通常难以扩展。
RisingWave 是一款流式数据库,简化了实时数据处理。开发人员可以使用熟悉的 SQL 来实时接入交易数据流、定义欺诈检测规则、设置警报并输出可疑交易数据。它可以很好地降低传统架构的复杂性和解决集成难题。
本文将详细介绍如何使用 RisingWave 轻松构建一个实时欺诈检测系统。
1. 系统架构
系统层面包括以下组件:
- 包含实时交易流的 Kafka 主题。
- RisingWave 流数据库,执行以下功能:
- 从 Kafka 主题中摄取数据,实时处理交易。
- 实时筛选和聚合数据,应用规则识别可疑模式。
- 存储分析结果,提供交易和检测到的欺诈行为的历史记录。
- 将识别出的欺诈交易流式传输到另一个 Kafka 主题。
- 接收来自 RisingWave 的欺诈交易流的 Kafka 主题,该主题可触发下游操作,例如阻止欺诈交易和/或发送警报。
根据此架构,我们用一个具体的例子来展示如何使用 RisingWave 构建实时欺诈检测系统。
2. 构建实时欺诈检测系统
步骤1:将交易流接入 RisingWave
假设所有交易事件存储在 transaction_stream Kafka 主题中,其数据格式如下:
[ { "user_id": "user123", "transaction_id": "tx001", "amount": 500, "location": "New York", "timestamp": "2023-05-01T10:00:00Z" }, { "user_id": "user123", "transaction_id": "tx002", "amount": 15000, "location": "New York", "timestamp": "2023-05-01T10:05:00Z" }, { "user_id": "user456", "transaction_id": "tx003", "amount": 100, "location": "Los Angeles", "timestamp": "2023-05-01T10:10:00Z" }, { "user_id": "user456", "transaction_id": "tx004", "amount": 200, "location": "New York", "timestamp": "2023-05-01T10:15:00Z" }]
现在,让我们通过 RisingWave 的内置 Kafka 源连接器,将 RisingWave 作为 Consumer 从这一 Kafka 主题摄取数据。在 RisingWave 中,可以通过 CREATE SOURCE 或 CREATE TABLE 命令接入数据。两者区别在于,使用 CREATE TABLE 会将完整数据持久化,而在本场景中我们不需要持久化完整数据,因此选择使用 CREATE SOURCE。
CREATE SOURCE transaction_stream (
user_id VARCHAR,
transaction_id VARCHAR,
amount DECIMAL,
location VARCHAR,
timestamp TIMESTAMP
) WITH (
connector = 'kafka',
topic = 'transaction_stream',
properties.bootstrap.server = 'kafka:9092',
scan.startup.mode = 'latest',
format = 'json'
);
步骤2:使用 SQL 识别欺诈交易
接下来,我们将在 RisingWave 中创建物化视图以识别欺诈交易。RisingWave 的物化视图采用增量计算,实时保持最新结果,支持立即查询。这些结果可以流式传输到其他系统以执行后续操作。
我们将定义四个物化视图来识别四种常见的欺诈模式,这些视图是实时欺诈检测系统的基础,通过它们我们可以实时监控和响应可疑交易。
模式 1:短时间内多笔交易
此模式用于检测在短时间内进行异常多次交易的用户。
我们使用固定时间窗口函数将数据划分为 5 分钟的时间间隔,然后筛选出符合以下条件的用户:
- 在单个 5 分钟窗口内完成超过 5 笔交易
- 在单个 5 分钟窗口内交易总金额超过 20000
CREATE MATERIALIZED VIEW velocity_fraud_alerts AS
SELECT
user_id,
COUNT(*) as tx_count,
SUM(amount) as total_amount,
MIN(transaction_id) as first_tx_id,
MAX(timestamp) as latest_timestamp
FROM TUMBLE(transaction_stream, timestamp, INTERVAL '5 minutes')
GROUP BY
user_id
HAVING COUNT(*) > 5 OR SUM(amount) > 20000;
模式 2:短时间内多地交易
此模式识别短时间内在多个地点进行交易的用户,这表明存在异常的旅行模式。我们使用固定时间窗口函数分析 2 小时内的交易,并标记出在 2 小时内跨越 3 个或以上地点交易的用户。
CREATE MATERIALIZED VIEW location_fraud_alerts AS
SELECT
user_id,
COUNT(DISTINCT location) as location_count,
array_agg(transaction_id) as transaction_ids,
array_agg(location) as locations
FROM TUMBLE(transaction_stream, timestamp, INTERVAL '2 hours')
GROUP BY
user_id
HAVING COUNT(DISTINCT location) >= 3;
模式 3:非高峰期大额交易
此模式检测在非高峰时段发生的大额交易,并标记出符合以下条件的交易:
- 交易金额大于 5000
- 发生在凌晨 1 点到 5 点之间
CREATE MATERIALIZED VIEW time_pattern_fraud_alerts AS
SELECT
transaction_id,
user_id,
amount,
timestamp,
location
FROM transaction_stream
WHERE
EXTRACT(HOUR FROM timestamp) BETWEEN 1 AND 5
AND amount > 5000;
模式 4:拆分多笔小额交易
此模式识别在短时间内发生的多笔小额交易,但总金额较大的情况。我们标记出符合以下条件的交易:
- 在 15 分钟内包含 5 笔或以上小额交易(每笔金额小于 2000)
- 总金额超过可疑阈值(8000)
CREATE MATERIALIZED VIEW split_transaction_alerts AS
WITH time_window AS (
SELECT
user_id,
COUNT(*) as tx_count,
SUM(amount) as total_amount,
array_agg(transaction_id) as transaction_ids,
MAX(amount) as max_amount,
AVG(amount) as avg_amount
FROM TUMBLE(transaction_stream, timestamp, INTERVAL '15 minutes')
GROUP BY
user_id
)
SELECT *
FROM time_window
WHERE
-- 多笔小额交易
tx_count >= 5
-- 每笔交易金额相对较小
AND max_amount < 2000
-- 但总金额较大
AND total_amount > 8000
-- 平均交易金额接近
AND ABS(avg_amount - (total_amount/tx_count)) < 100;
创建这些物化视图后,我们可以插入一些数据来模拟上述模式。
-- 正常交易
('user_1', 'tx_001', 100.00, 'New York', '2024-11-06 10:00:00'),
-- 速度欺诈模式:5 分钟内多笔交易
('user_2', 'tx_002', 5000.00, 'Chicago', '2024-11-06 11:00:00'),
('user_2', 'tx_003', 4500.00, 'Chicago', '2024-11-06 11:02:00'),
('user_2', 'tx_004', 6000.00, 'Chicago', '2024-11-06 11:04:00'),
-- 地点欺诈模式:不可能的旅行
('user_3', 'tx_005', 3000.00, 'New York', '2024-11-06 12:00:00'),
('user_3', 'tx_006', 2500.00, 'Los Angeles', '2024-11-06 12:30:00'),
('user_3', 'tx_007', 4000.00, 'Miami', '2024-11-06 13:00:00'),
-- 拆分交易模式
('user_4', 'tx_008', 1900.00, 'Boston', '2024-11-06 14:00:00'),
('user_4', 'tx_009', 1850.00, 'Boston', '2024-11-06 14:05:00'),
('user_4', 'tx_010', 1900.00, 'Boston', '2024-11-06 14:10:00'),
('user_4', 'tx_011', 1850.00, 'Boston', '2024-11-06 14:12:00'),
('user_4', 'tx_012', 1900.00, 'Boston', '2024-11-06 14:14:00'),
-- 深夜大额交易模式
('user_5', 'tx_013', 7500.00, 'Seattle', '2024-11-06 03:30:00')
查询这些物化视图时,将获得符合这些模式的数据。例如,对于split_transaction_alerts,将获得以下结果。
SELECT * from split_transaction_alerts;
------
transaction_id user_id amount timestamp location
tx_013 user_5 7500 2024-11-06T03:30:00Z Seattle
步骤3:将欺诈数据输出到 Kafka 主题
对于每个物化视图,可以将数据导出到 Kafka 主题,用来触发后续操作并发送警报。或者,可以在 RisingWave 中用 Python 或 Java 定义 UDF(用户定义函数),将警报发送到相关账户。
CREATE SINK velocity_fraud_alerts_sink FROM velocity_fraud_alerts
WITH (
connector='kafka',
properties.bootstrap.server='localhost:9092',
topic='velocity_alerts',
properties.message.max.bytes = 2000
)
FORMAT PLAIN ENCODE JSON;
3. 提升欺诈检测系统
随着欺诈模式的不断演变,调整检测算法以保持领先至关重要。一种方法是利用机器学习来识别并标记可疑交易。通过机器学习模型,可以动态更新检测逻辑,捕获新的模式并去除过时的模式。RisingWave 完全支持此类高级场景,能够执行复杂的流式聚合并作为在线特征存储。我们将在后续的博客文章中更深入地探讨这一主题。
4. 关于 RisingWave
RisingWave 是一款开源的分布式流处理数据库,旨在帮助用户降低实时应用的开发成本。RisingWave 采用存算分离架构,提供 Postgres-style 使用体验,具备比 Flink 高出 10 倍的性能以及更低的成本。
👨🔬加入 RW 社区,欢迎关注公众号:RisingWave中文开源社区
🧑💻想要了解和探索 RisingWave,欢迎浏览我们的官网:risingwave.com/
🔧快速上手 RisingWave,欢迎体验入门教程:github.com/risingwave
💻深入理解使用 RisingWave,欢迎阅读用户文档:zh-cn.risingwave.com/docs