‹ 全部面经
2026–2027 Stripe VO 面经:支付交易风险关联查询系统(3 Part 递进)
Stripe VO Coding 复盘:支付风控交易关联查询,Part 1 属性匹配、Part 2 可配置权重打分、Part 3 BFS 二度间接关联,附代码分层设计与面试官考察重点。
VO
业务背景
Stripe 风控系统:给定一笔目标 Transaction,找出和这笔交易存在风险关联的其他交易。
题目分 3 个递进 Part:从简单的属性匹配,逐步升级到带权重的打分,最后扩展到图上的间接关联。题目原型来自真实的支付风控业务,用于挖掘交易之间的风险网络、识别团伙欺诈。
Part 1:基础属性匹配
需求:只要任意一个风险属性字段相同,就判定两笔交易存在关联,例如:
- 同一个银行卡号
- 同一个 IP 地址
- 同一个设备 ID
思路:本质是集合交集问题。取出目标交易的所有风险属性,遍历所有交易,判断是否有属性重合。
重点 Clarify:
- 字段是否允许空值?空属性不参与匹配。
- 一条交易可能携带多个属性。
Part 2:引入风险置信度打分
需求:不同风险字段的可疑程度不一样,给每个字段配置独立权重。两笔交易匹配到某个字段就累加对应权重,总分超过阈值才算有效的风险关联。
思路:配置化设计,避免大量 if-else 硬编码。维护一个权重字典,key 是属性名,value 是该属性的风险分数。匹配成功就累加分数,最后和阈值比较。
面试官重点考察:如何把权重做成可配置的,方便以后新增风险字段,而不需要修改核心查询逻辑。
追问:
- 如果一个属性多次匹配,分数是否重复累加?
- 如何处理权重为 0 的字段?
Part 3:扩展到间接风险关联
需求:不只找直接关联的交易,还要找出二度间接关联的交易。
- 直接关联(一度):和目标交易直接匹配的交易。
- 间接关联(二度):和直接关联交易匹配的交易。
输出目标交易的所有一度、二度关联交易,结果去重,排除目标交易本身。
思路:本质是图搜索,BFS 最合适。
- BFS 第一层,拿到所有直接关联交易(一度)。
- 遍历第一层的交易,再 BFS 一层,拿到二度关联交易。
- 所有结果去重,排除原交易 ID。
坑点:
- 循环引用:比如交易 A 关联 B,B 又关联 A,必须维护
visited集合防止死循环。 - 空结果的边界。
- 大量重复的交易 ID。
参考实现:三个 Part 逐步迭代
把「字段匹配、打分规则、图搜索、去重」拆成独立函数,后面加需求时只换规则、不改搜索:
RISK_FIELDS = ("card", "ip", "device")
def matched_fields(a, b, fields):
"""两笔交易上取值相同且非空的风险字段"""
return [f for f in fields if a.get(f) is not None and a.get(f) == b.get(f)]
# Part 1:任意字段相同即关联
def any_match(a, b):
return bool(matched_fields(a, b, RISK_FIELDS))
# Part 2:按可配置权重打分,超过阈值才关联
def make_weighted_rule(weights, threshold):
def rule(a, b):
score = sum(weights[f] for f in matched_fields(a, b, weights))
return score > threshold
return rule
# Part 3:BFS 找 max_depth 度以内的关联交易
def related_transactions(target_id, txns, is_related, max_depth=2):
by_id = {t["id"]: t for t in txns}
visited, frontier, result = {target_id}, [by_id[target_id]], []
for _ in range(max_depth):
nxt = []
for cur in frontier:
for other in by_id.values():
if other["id"] not in visited and is_related(cur, other):
visited.add(other["id"])
nxt.append(other)
result.extend(t["id"] for t in nxt)
frontier = nxt
return result
max_depth=1就是 Part 1 / Part 2,max_depth=2就是 Part 3。- 数据量大时,可以按「字段值 → 交易 ID 列表」建倒排索引,每次只看共享同一字段值的交易,不用全表扫描。
面试考察重点
Stripe 这道工程题不追求极致的时间复杂度,重点看:
- 代码分层
- 可读性
- 模块拆分
面试时一定要:
- 边写边讲思路
- 主动列出测试用例
- 不要闷头写代码
面试官会不断追加新需求,看你的代码好不好扩展,例如:
- 限制最大搜索深度
- 给关联链路增加风险分数
- 过滤低分数的关联