4. 基于规则的实时大额交易拦截
任务说明
实现一个流处理函数 process_transaction,对每笔交易判断金额是否超过预设阈值(默认 10000),超过则标记为可疑并输出告警。函数逐笔处理,返回处理结果,便于在实时管道中调用。
核心实现
THRESHOLD = 10000.0 # 大额交易阈值
def process_transaction(tx, threshold=THRESHOLD):
"""
处理单笔交易,判断是否为大额可疑交易。
tx: dict,至少包含 'tx_id'、'amount'
返回: dict,包含原始交易信息 + 'suspicious' 标记 + 可选 'alert'
"""
amount = float(tx["amount"])
suspicious = amount > threshold
result = {
"tx_id": tx["tx_id"],
"amount": amount,
"suspicious": suspicious,
}
if suspicious:
result["alert"] = (
f"[ALERT] 大额交易 tx_id={tx['tx_id']} "
f"amount={amount:.2f} 超过阈值 {threshold:.2f}"
)
return result
def run_stream(transactions, threshold=THRESHOLD):
"""模拟流式处理:逐笔调用 process_transaction 并输出告警。"""
for tx in transactions:
result = process_transaction(tx, threshold)
if result["suspicious"]:
print(result["alert"])
else:
print(f"[OK] tx_id={result['tx_id']} amount={result['amount']:.2f}")
yield result
if __name__ == "__main__":
stream = [
{"tx_id": "T001", "amount": 500},
{"tx_id": "T002", "amount": 25000},
{"tx_id": "T003", "amount": 10000},
{"tx_id": "T004", "amount": 99999.99},
]
list(run_stream(stream))
运行与验证
直接运行脚本:python rule_engine.py。观察输出:
- T001(500)应输出
[OK],suspicious=False。 - T002(25000)应输出
[ALERT],suspicious=True。 - T003(10000)等于阈值,按
>判定为[OK],suspicious=False。 - T004(99999.99)应输出
[ALERT]。
通过条件:每笔交易返回结果中 suspicious 与金额是否严格大于阈值一致;可疑交易均带 alert 字段并打印告警行。
边界与扩展点
- 阈值可通过参数覆盖,便于按业务线配置不同限额。
- 判定使用严格大于,若业务要求“达到即拦截”,将
>改为>=即可。 - 接入真实流时,将
run_stream的输入替换为消息队列消费迭代器,输出替换为告警通道即可,核心判定逻辑不变。