这是一道非常经典的 Stripe "Stateful Stream Processing"(有状态流处理)类型的题目。它考察候选人如何处理时间序列数据、如何设计高效的数据结构来查询状态,以及如何将业务规则转化为代码逻辑。
题目描述
Part 1: 授权请求处理 (Authorization Requests)
Stripe 代表商户接收付款请求。由于初期策略宽松,所有请求一律 APPROVE(批准)。 你需要处理一系列按时间顺序到达的请求,并输出格式化的日志。
输入格式:
timestamp, unique_id, amount, card_number, merchant
示例输入:
5,R1,5.60,4242424242424242,bobs_burgers
10,R2,500.00,4242111111111111,a_corp
输出格式:
<timestamp> <id> <amount> APPROVE
Part 2: 欺诈规则流 (Fraud Rules Stream)
为了降低风险,风控部门引入了“欺诈规则”。规则也是以流的形式实时更新的。
规则格式:
time, field, value
规则含义:
1, merchant, bobs_burgers: 从第 1 秒起,所有来自bobs_burgers的交易视为欺诈。20, card_number, 4242...: 从第 20 秒起,该卡号的交易视为欺诈。
规则特性:
- 规则生效后 永久有效。
- 规则 不溯及既往(只影响生效时间点及之后的交易)。
任务: 实现一个系统,同时接收“交易流”和“规则流”,对每笔交易进行判定。如果交易时间点匹配任何一条已生效的欺诈规则,则输出 REJECT,否则 APPROVE。
oavoservice 解题思路分析
这道题的难点在于双流合并与状态查询。
1. 数据结构选择
由于规则是基于特定字段(如 merchant 或 card_number)的,我们需要高效地查询某个字段是否被 ban。
- 推荐使用
HashMap<Field, HashMap<Value, ActiveTime>>。 - 例如:
rules["merchant"]["bobs_burgers"] = 1。这表示bobs_burgers从第 1 秒开始被 ban。
2. 判定逻辑
对于每一笔交易(假设时间为 T_trans):
- 检查交易的
merchant是否在规则表中。如果在,且Rule_StartTime <= T_trans,则 REJECT。 - 检查交易的
card_number是否在规则表中。如果在,且Rule_StartTime <= T_trans,则 REJECT。 - 否则 APPROVE。
3. 处理双流顺序
在实际面试中,输入可能是两个分开的 List,或者是一个混合的 Stream。
- 如果是两个 List,需要先按时间戳归并排序,或者在遍历交易时,指针同步移动规则列表。
- 既然题目保证了时间有序,直接维护一个全局的 Rule Set 即可。
代码实现片段 (Python)
class FraudDetector:
def __init__(self):
# 记录每种规则的生效时间
# key: field_name, value: { field_value: start_time }
self.rules = {
"merchant": {},
"card_number": {}
}
def add_rule(self, time, field, value):
# 如果同一实体有多次规则,保留最早的还是最新的?通常保留最早的生效时间
if value not in self.rules[field]:
self.rules[field][value] = int(time)
def check_transaction(self, time, merchant, card_num):
# 检查 Merchant
if merchant in self.rules["merchant"]:
if self.rules["merchant"][merchant] <= time:
return "REJECT"
# 检查 Card Number
if card_num in self.rules["card_number"]:
if self.rules["card_number"][card_num] <= time:
return "REJECT"
return "APPROVE"
想获取本题完整代码与测试用例?
oavoservice 拥有最全的 Stripe 面试真题库与通过验证的 Standard Solution。我们的 VO 辅助服务不仅提供答案,更教你如何向面试官展示你的系统设计思维。
- 算法优化:从 O(N) 到 O(1) 的性能提升技巧。
- 代码规范:符合工业级标准的变量命名与模块划分。
立即咨询 助你拿下 Stripe Offer。