bartoszbryg/tx-sieve

GitHub: bartoszbryg/tx-sieve

基于 Java Spring Boot 与 Python FastAPI 的实时支付处理与多层欺诈检测平台,通过规则评分、图分析与 ML 模型在毫秒级完成异步风控决策。

Stars: 0 | Forks: 0

# 实时支付欺诈检测系统 我在网上看到的大多数后端项目,都只停留在有趣问题刚开始的地方。但这个项目不同。 支付欺诈检测:高吞吐量、异步决策、JWT 安全、基于规则和基于图的分析。逐阶段构建,设计决策在制定时同步记录。 ## 阶段 0 —— 编写任何代码前我回答的三个问题 ### 1. 这个系统究竟做什么? 用户提交一笔支付。系统实时决定其是否为欺诈。决策在几毫秒内发生,而不是几分钟。 - 如果是欺诈:阻止交易并保存警报 - 如果是正常:处理交易,转移余额 就是这样。这个仓库中的一切都是为了让这一条流程正确、安全且大规模地运行而存在的。 ### 2. 核心约束条件是什么? 这些不是偏好——它们是架构从第一天起就必须满足的要求: **高吞吐量** —— 支付是突发性的。系统不能在分析欺诈时阻塞 HTTP 线程。需要队列和异步 worker。 **实时** —— 欺诈的时间窗口只有几分钟宽。每日的电子邮件报告毫无用处。分析师需要一个在检测到欺诈瞬间立即更新的实时仪表盘。WebSocket 推送计划在下一阶段实现;当前阶段会持久化警报并暴露仪表盘统计数据。 **安全** —— 这是一个银行系统。除了登录外,每个 endpoint 都需要身份验证。JWT token,无状态,基于角色的访问控制。客户和系统操作员是独立的安全主体——将它们混为一谈是设计缺陷。 **可观测** —— 你无法调整你无法测量的东西。队列深度、规则触发次数、分析延迟、欺诈率——所有这些都从第一天起就作为 Prometheus 指标暴露出来。 **可解释** —— 在银行业,没有给出原因的拦截决策在法律上是不充分的。每个触发的欺诈规则都必须留下一条类型化的、可审计的记录,说明它发现了什么以及为什么。 ### 3. 核心组件有哪些? ``` Java Spring Boot └── REST API (payments, users, alerts, dashboard) └── JWT security layer └── Fraud detection engine (rule-based + graph-based) └── Bounded queue + worker thread pool └── WebSocket broker (Phase 11, real-time analyst alerts) └── Prometheus metrics + Spring Actuator Python FastAPI (Phase 15) └── Statistical ML model (GradientBoosting) └── Feature engineering └── /score endpoint — returns fraud probability 0.0–1.0 H2 in-memory database (dev) / PostgreSQL (prod) Docker Compose (Phase 17) └── Wires both services together └── Health checks before Java starts ``` 目前,Java 负责处理交易、安全、欺诈规则、图分析以及异步 worker pipeline。Python 的统计异常检测属于后续阶段。当它接入时,如果 Python 不可用,Java 将继续运行基于规则的评分。设计上实现松耦合。 ## 架构 —— 目标全景图 ``` User submits payment (HTTP POST, JWT authenticated) │ ▼ PaymentService validates: sender exists, balance sufficient │ ▼ Transaction saved with status PENDING │ ▼ Enqueued to LinkedBlockingQueue (capacity: 10,000) API thread returns immediately — async from here │ ▼ Worker pool (4 threads) picks up transaction │ ▼ FraudDetectionEngine runs all rules in priority order │ ├── HighAmountRule > $10k warning / > $50k critical ├── RapidTransactionRule 3+ transactions in 5 minutes ├── VelocityBreachRule daily > $20k or hourly > $5k ├── BlacklistedMerchantRule merchant on known-bad list ├── UnusualLocationRule country differs from home ├── GraphFraudRule cycle detection via JGraphT └── MlFraudRule Python model probability ≥ 0.4 │ ▼ Scores accumulate (capped at 100) │ ├── score < 40 → APPROVED ├── score 40–69 → FLAGGED FOR REVIEW + alert saved └── score ≥ 70 → BLOCKED + alert saved + WebSocket broadcast (Phase 11) + no balance deduction ``` ## 为什么选择这些技术 | 技术 | 原因 | |---|---| | **Java 21 + Spring Boot 3.2** | 金融后端的生产标准。支持虚拟线程。Spring Boot 将配置保留在 YAML 中,而不是样板代码。 | | **JWT (无状态认证)** | 无需服务端 session 存储。每个请求都自我验证。这是水平扩展的必要条件。 | | **H2 (开发) / PostgreSQL (生产)** | H2 无需任何设置——应用程序无需外部依赖即可启动。生产环境通过环境变量进行切换,无需修改代码。 | | **LinkedBlockingQueue** | 在没有基础设施的情况下模拟 Kafka。有限的容量意味着背压是明确的:队列满 = 503,而不是崩溃。 | | **JGraphT** | 基于规则的评分单独查看每笔交易。而图能发现协同欺诈——洗钱团伙、骡子账户——这些是个别规则完全遗漏的。 | | **WebSocket / STOMP** | 计划在阶段 11 实现。HTTP 轮询会增加延迟并浪费连接;STOMP 推送将在交易被拦截的瞬间将警报传递到仪表盘。 | | **Python FastAPI + GradientBoosting** | 计划在阶段 15 实现。基于规则的系统能捕获已知模式。ML 能捕获不符合任何既定规则的异常。作为独立服务,这样 Python 崩溃时永远不会导致 Java API 宕机。 | | **Micrometer + Prometheus** | 每个欺诈规则触发、队列深度和分析持续时间都是一个指标。欺诈系统需要调优——你用数据调优,而不是靠猜测。 | | **Resilience4j 熔断器** | 计划在 ML 集成阶段实现。如果 Python ML 服务缓慢或宕机,熔断器就会打开,Java 就会停止尝试。 | | **Lombok + MapStruct** | 注解处理器在编译时生成样板代码,运行时零开销。Lombok 现在负责处理 getter/构造函数;如果映射需求超出了目前简单的 `TransactionMapper`,则可使用 MapStruct。 | | **金额使用 BigDecimal** | `double` 会丢失分位。在浮点数中 0.1 + 0.2 = 0.30000000000000004。银行对舍入误差负有法律责任。 | ## 构建顺序 我是按照依赖关系强制的顺序构建的——如果没有 entity,你就无法编写 service;如果没有配置好项目,你就无法编写 entity。 | 阶段 | 构建内容 | 文档 | |---|---|---| | **0** | 完成架构设计,暂无代码 | | | **1** ✅ | `pom.xml` + 入口程序 + YAML 配置(开发/生产分离) | [文档](docs/phase-01-project-foundation.md) | | **2** ✅ | 领域枚举:`TransactionStatus`、`RiskLevel`、`FraudRuleType` | [文档](docs/phase-02-project-enums-creation-for-states.md) | | **3** ✅ | JPA entity:`User`、`AppUser`、`Transaction`、`FraudAlert`、`MerchantBlacklist`、`UserSession` | [文档](docs/phase-03-project-jpa-entities.md) | | **4** ✅ | Repositories + 自定义欺诈查询 (`@Query`) | [文档](docs/phase-04-project-repository-for-jpa.md) | | **5** ✅ | DTO —— 请求/响应对象,永远不暴露原始 entity | [文档](docs/phase-05-project-dto-mapping.md) | | **6** ✅ | 类型化异常 + `GlobalExceptionHandler` | [文档](docs/phase-06-project-exception-handling.md) | | **7** ✅ | JWT 安全:token 提供者、过滤器、`UserDetailsService` | [文档](docs/phase-07-project-security-handling.md) | | **8** ✅ | 欺诈引擎:`FraudRule` 接口、5 条规则、图分析、编排器 | [文档](docs/phase-08-project-fraud-detection-engine.md) | | **9** ✅ | Services:`AuthService`、`UserService`、`PaymentService`、`FraudAlertService`、`DashboardService`、`MlFraudScoringService`、`TransactionMapper` | [文档](docs/phase-09-project-service-layer.md) | | **10** ✅ | 队列 + worker 池:`TransactionQueue`、`TransactionWorkerPool`、欺诈结果路由 | [文档](docs/phase-10-project-queue-worker-pool.md) | | **11** | WebSocket / STOMP 实时警报广播 | | | **12** | Spring 配置类:安全、WebSocket、缓存、异步、OpenAPI | | | **13** | `DataSeeder` —— 启动时加载演示数据 | | | **14** | REST controller —— 轻量级层,无业务逻辑 | | | **15** | Python FastAPI ML 服务 + GradientBoosting 模型 | | | **16** | `MlFraudRule` —— Java `<->` Python HTTP 集成 | | | **17** | Docker + Docker Compose —— 两个服务均接入健康检查 | | | **18** | 测试:单元测试(规则、引擎、服务)+ 集成测试(controller) | | 每个阶段标签都链接到该具体阶段的代码仓库。你可以浏览在任何 service 层出现之前、在添加安全机制之前、在队列存在之前的代码——完整的构建序列都是可见的。 ## 本项目的教学意义 这个项目中的每一个架构决策之所以存在,都是因为真实的银行系统需要它。这不是我凭空发明的设计——它是你从第一性原理进行推理时,由约束条件自然产生的设计。 理解一个设计决策*为什么*存在,比仅仅知道*如何*实现它更有价值。这个项目对两者都进行了记录。
标签:域名枚举, 测试用例, 自定义请求头, 请求拦截, 逆向工具