在金融服务这个行业做系统研发,第一印象永远是"稳"字当头。前几年我们团队守着那套跑了好几年的单体账务系统,每改一个字段都像踩雷,发版从双周拖到一个月,最后甚至没人敢动。但业务不会等人,新产品线、新渠道、新审计要求接踵而来,我们用了两年多时间,把整个平台从内到外重构了一轮。这篇内容想把这一路的核心经验梳理一下,围绕账务微服务化、数据安全治理、实时风控、大模型应用四条主线展开,每一块背后都有真实的工程取舍。适合正在做金融系统建设或数字化转型的同行参考,也适合想了解金融后台到底在忙什么的同学读一读。
1. 账务核心的微服务化:拆的不是代码,是业务边界
1.1 单体系统还能撑多久:从"不敢发布"到按需发布
先说说当初为什么要拆。老系统是个典型的单体应用,账户、交易、支付、清算、对账全在一套代码里,40多万行。开发和测试环境还好,一上生产就提心吊胆——改一个账户字段,可能影响支付渠道的报文组装;改一个对账逻辑,可能把整个批处理拖慢。发版窗口固定,问题修复还得排队,业务方经常追着问"这个功能到底什么时候能上"。
真正让我们下决心重构的,是一次账户查询接口的故障。因为某个慢SQL拖垮了连接池,连累了所有依赖这个库的服务,线上整整趴了40分钟。那次事故之后,我们组织了两次事件风暴(Event Storming)工作坊,把业务人员和开发人员关在会议室,把账户、用户、认证、交易、支付、清算、对账这些业务能力全部列出来,领域专家挨个讲清每个环节的输入输出。最后大家形成共识:拆分的依据不是代码层面"这层好拆",而是业务边界是否清晰。
拆分顺序也很关键。我们先把注册登录、用户信息这类耦合度低、影响面小的服务拆出去,验证整个CI/CD流水线和灰度发布机制跑得通,再拆账户、交易这类核心域,最后拆清结算和对账。每一步都定了业务验收标准,比如账务准确率必须100%、核心接口P99延迟不能高于200毫秒、切换后需要连续七天对账无差异。没有这些红线,重构就会变成一场无休止的拉锯战。
1.2 跨服务资金一致性:三种分布式事务方案怎么选
拆成微服务之后,第一个实际遇到的问题就是资金一致性。举最简单的转账例子:用户发起一笔转账,账户服务要扣款,交易服务要记账,通知服务要发消息。以前在一个事务里能搞定的事情,现在散落到多个服务,任何一个环节失败,都会导致两边数据不一致。
我们把业界常用方案对了一遍,核心其实是在一致性和实现复杂度之间找平衡。
| 方案 | 一致性强度 | 业务侵入度 | 适用场景 | 主要代价 |
|---|---|---|---|---|
| 本地消息表 | 最终一致 | 中 | 交易记录、异步通知、跨服务事件驱动 | 需要额外对账兜底 |
| SAGA | 最终一致 | 高 | 长流程、多步骤业务,比如开户+签约+首充 | 补偿逻辑复杂,易漏 |
| TCC | 接近强一致 | 很高 | 短事务、资源可预留,比如库存锁定 | 实现代价大,冻结/解冻逻辑易出错 |
我们最后主用的还是本地消息表。原因很实际:资金类操作,与其追求强一致,不如把账记准、把账对平。具体做法是业务操作和消息写在同一个本地事务里,消息发送靠异步任务,消费方处理时必须做幂等。每天凌晨有专门的对账任务,把流水、账务和余额三方对一遍,哪怕差一分钱都能定位到具体交易。
幂等设计是这里最容易踩坑的地方。每个请求必须带全局唯一的业务流水号,接收方用一个去重表记录处理过的流水号。没有幂等,消息重复投递一次,用户的账就可能错一次。我们吃过这个亏,后来在网关层统一生成流水号,任何内部调用都必须携带,这个规则写进了代码评审的检查项。
1.3 热点账户与余额设计:让流水走在余额前面
拆分完成之后,流量一上来,另一个问题浮出水面:热点账户。很多业务存在高频账户,比如电商大商户的收款账户、营销活动的发券账户,一天可能几十万笔资金操作。如果每笔都去update余额字段,数据库的行锁竞争会非常严重,延迟直接从几毫秒飙升到几百毫秒。
我们试过几招,效果比较明显的组合是:余额分片加异步记账。把单一账户的余额按规则拆分成多个子账户,每笔入账落到一个子账户;查询总余额时把子账户汇总。同时,交易入账先写流水,余额更新放到异步任务里攒批执行。账务系统里有一条铁律:流水不能丢,余额可以滞后。只要流水完整,任何时候都能重算余额;反过来,余额对了但流水缺了,才是真正的灾难。
当然,异步记账会带来短时间的余额不一致,所以我们的支付前置条件改为"可用余额=总余额-在途资金",这样既保证了资金安全,又缓解了热点冲突。这个经验不一定适用所有场景,但思路是一致的:热点账户的根本解法不是加机器,而是减少对单点资源的争抢。
2. 数据安全不能只靠制度:加密、脱敏、审计的工程方案
2.1 数据分级先行:哪些字段算敏感,一线开发必须清楚
很多团队谈数据安全,第一反应就是"上加密""上脱敏",但真做的时候互相扯皮。后来我们发现,问题出在数据分级没有做扎实。不知道哪些数据敏感、敏感到什么程度,加密和脱敏的范围就只能靠"拍脑袋"决定。
我们做了一套四级分级的表,全公司用同一套标准:
| 级别 | 数据示例 | 存储要求 | 展示要求 |
|---|---|---|---|
| L1 公开 | 产品公告、公开规则 | 无特殊要求 | 正常展示 |
| L2 内部 | 运营报表、内部操作日志 | 访问控制 | 内部系统可见 |
| L3 敏感 | 姓名、手机号、银行卡号、身份证号 | 加密存储 | 员工端统一脱敏 |
| L4 机密 | 支付密码、密钥、完整支付要素 | 加密存储+专用安全设施 | 禁止明文展示 |
这个表看起来简单,真正落地难在"每个字段都要对号入座"。我们专门拉了一张数据字典,把核心系统涉及的几千个字段逐个打标,每个字段标注分级、所属系统、责任人。有了这张表,之后做加密、脱敏、权限控制,就不再是一笔糊涂账。一线开发连字段级别都不知道,安全就无从谈起。
2.2 加密链路三段式:传输、存储、展示各守各的边界
数据加密不是"把数据库字段加密"就完事,而是要在传输、存储、展示三个环节各守边界。
传输环节,对外接口强制TLS,服务间调用走双向TLS(mTLS),确保链路中没有任何明文裸奔的节点。存储环节,L3字段用AES-256加密,密钥统一托管在密钥管理服务里;L4级的密钥还会放到专用的安全硬件中,应用层拿不到明文密钥。这里我推荐用信封加密的思路:上层用数据密钥(DEK)加密业务字段,DEK再由主密钥(KEK)加密保存。这样主密钥只需要保存一把,数据量再大也不怕,轮换密钥时只需换DEK。
最容易被忽略的是展示环节。客服、运营、开发,谁都不该看到完整的卡号和手机号。我们在统一的数据访问层做了脱敏处理,服务端查到明文后,只有带特定权限的请求才能拿到完整数据,其余接口一律返回掩码格式。手机号显示前三位加后四位,银行卡号只留后四位。这个边界定死在代码规范里,而不是靠每个业务团队自觉。
2.3 内部越权是最隐蔽的泄露:访问授权与审计留痕
外部攻击很多团队防得住,内部人越权反而难查。一次内部审计中我们发现,个别员工用同事的账号查过客户资料,而系统没有任何告警。后来我们上了场景化授权:员工必须先提交访问申请,说明用途,审批通过后在限定时间窗口内访问,过期自动失效。权限模型以RBAC为基础,再叠加数据权限(ABAC),做到"谁能看、能看谁、看多久"全部可配置。
审计日志是整个体系里最不能省的部分。每次对敏感数据的访问,查询条件、返回结果摘要、操作人、时间、来源IP都写入审计日志。日志表设计成只追加,禁止update和delete,并对每条日志做哈希链,后续任何篡改都能被校验出来。日常巡检定期抽查,发现异常访问立刻告警。这套机制上线后,内部越权行为基本上绝迹了,不是因为大家变自觉了,而是知道做了会被抓到。
3. 反欺诈实时风控:抢在黑产下单前完成拦截
3.1 风控时延就是风险敞口:从T+1到毫秒级决策
刚开始做风控时,系统还是T+1跑批的模式。黑产完成一批欺诈交易,第二天我们才发现异常,资金早被转移走了。后来把风控目标定成"实时",不是在交易后拦截,而是在交易进行中的那一瞬间决定放行还是拒绝。
实时风控的第一个瓶颈是数据采集。我们在客户端埋点采集设备信息、操作行为、点击序列,在服务端记录IP、设备ID、账号关联关系,全部通过消息队列实时汇入风控引擎。决策时延压到了P99小于100毫秒,正常时段大部分交易能在50毫秒内给出结果。用户体感上完全感知不到,但对黑产来说,这个时间窗口已经足够让欺诈交易在完成前被掐断。
3.2 规则引擎:策略热更新,规则可回滚
早期风控规则都是写在代码里的,一条规则从提需求到上线要排期一周,等上线了黑产早换手法了。后来我们把规则全部配置化,抽了一个规则引擎,支持热更新,新规则推上去即时生效,全程不停机。规则的属性包括:规则组、优先级、有效期、动作(放行、验证、拦截、转人工)。
举一条很典型的规则:"同一设备ID在10分钟内支付密码错误超过5次,触发短信验证。"这条规则用配置就能表达,一个运营人员自己就能调整阈值,不用再等开发。但规则引擎最怕的是规则多了之后互相冲突,所以我们定了"优先级+短路"机制,命中高优先级规则后不再往下执行,同时所有规则变更都要求先灰度:先对1%的流量生效,观察一段时间没有异常再逐步放量。没有回滚能力的规则引擎等于定时炸弹,这句话写在了风控组的墙上。
3.3 特征画像:设备指纹与行为序列怎么落地
光有规则还不够,规则要用特征吃饭。风控特征体系是另一个核心工程:设备指纹、行为序列、关系网络,三块缺一不可。
设备指纹在客户端采集硬件信息与浏览器指纹,服务端做归一化,识别出同一台设备在不同账号下的使用轨迹。行为序列关注用户操作的时间与顺序,比如正常用户不会在一分钟内连续切换三张银行卡。关系网络则借助图计算,把设备、账号、手机号、IP关联成图谱,很多单独看没问题的个体,放到图里立刻暴露出团伙特征:多个账号共用一台设备,批量注册、养号、薅羊毛的套路一目了然。
特征平台化是我们后期才补的课。早期特征散落在各个业务系统,风控团队和工程团队各算各的,同一指标口径都对不上。后来我们建了统一特征平台,离线特征和实时特征共用一套口径,风控策略直接引用特征ID,开发一次,多处复用。做风控的同学一定要记住:先把特征治理清楚,再谈模型和策略,否则上层做得再漂亮,底层数据都是歪的。
3.4 规则和模型并行:解释性和精确性并不冲突
规则引擎可解释性强,适合直接拦截,但精度有限;机器学习模型精度高,却经常被质疑"为什么拦我"。我们的路线是规则和模型并行,谁都不替代谁。
具体分工是:规则负责处理高置信度的确定性场景,例如密码错误次数、设备黑名单;模型负责识别复杂模式和微弱信号,例如异常行为序列、社群风险关联。模型干预的结果标记为"疑似",不直接拒绝交易,而是进入人工审核队列或追加验证。这既保留了对用户的友好,也给风控团队留出了复查空间。模型上线必须有A/B对比,观察拦截率、误伤率、用户投诉率三个指标,跑通之后才逐步放大流量。
黑产也在不断进化。模型不是训一次就一劳永逸,我们保持每月一次的自动重训练节奏,并持续把人工审核的结论回灌成训练样本。这是风控系统能够持续对抗的底层原因。
4. 金融大模型的生产级落地:RAG、Agent与部署选型
4.1 金融场景为什么是大模型落地的最佳试验田
金融行业本质上是文档密集型、对话密集型、决策密集型的行业。一家金融机构沉淀的规范文档、产品条款、FAQ、审批细则,总量大得惊人,而且每一条都可能影响真金白银。大模型最擅长的文本理解、知识抽取、内容生成,几乎天然对应金融行业的痛点。我们团队陆续在智能客服、合同要素提取、运营问答、审核辅助几个场景做了探索,效果比预期好。
但金融落地大模型也有三个绕不开的坎:幻觉、合规、数据安全。模型一本正经地编造答案,在别的行业是用户体验问题,在金融行业可能直接变成资金损失和舆情风险。所以在动手之前,我们就定了原则:大模型产出的内容必须要能溯源,不能出错的场景必须保留人工兜底。
4.2 RAG方案:让模型"不懂就说不懂,不要乱编"
我们解决幻觉问题的主力方案是RAG(检索增强生成)。流程并不复杂:先把内部知识库的文档解析、切片、向量化,存到向量数据库;用户提问时,先做语义检索,把最相关的几段文本找出来,连同问题一起交给大模型生成回答。
以客服场景为例,用户问"我这张卡一天能转多少限额",模型不会凭空回答,而是先从知识库检索到对应的产品条款,把条款作为依据来组织回答,同时给出条款来源和链接。如果检索结果与问题不相关,或者置信度不足,模型会直接说"这个问题我暂时无法确认",宁可不答也不编。我们内部把拒答率当成一个重要指标——在金融场景,懂得拒绝比懂得回答更重要。
这里最考验工程的是知识库建设。原始文档格式五花八门,PDF、Word、HTML夹杂图表,解析出来经常是乱的。我们花了不少精力做文档清洗和切片策略,尝试过按固定长度切片、按标题结构切片,最终按"语义完整段落"来切,检索命中率和答案准确率都上了一个台阶。这些环节看着不起眼,实际效果差异非常大。
4.3 Agent辅助业务:内部助手与流程自动化的边界
大模型直接回答用户问题只是初阶玩法,更有价值的是把大模型包装成Agent,去调用业务系统完成整个任务。我们在内部做了一个员工助手,员工向它提问"麻烦查一下用户张三近三个月的交易流水,整理一份风险摘要",Agent会拆解任务,调用用户查询接口、流水接口、风控接口,把多份数据汇总成结构化摘要,供员工参考。
这里的关键是给Agent划定边界:它只能调用内网白名单里的服务,所有敏感操作必须记录日志,生成材料只允许作为草稿,最终由员工确认后提交。AI只是把重复劳动省掉了,决策权仍然在人手里。这个定位还能规避很多合规风险,也让业务部门更容易接受。
4.4 部署选型与评测指标:上线前必须盯住的五个数字
金融机构的数据出域是个红线,所以我们的大模型主要还是走私有化部署路线。代表项目用了开源模型,再通过RAG注入内部知识,整体跑在内部集群上。如果只是做简单问答,中等参数的模型就够用,没必要盲目追求超大模型;涉及复杂推理和长文本场景,才需要考虑更大参数量的模型,成本增幅不止一个量级。
部署之外,评测体系更要提前建。我们上线前重点盯五个数字:准确率、拒答率、幻觉率、审核通过率、端到端响应时延。准确率不是唯一指标,某个模型在内部测试集上准确率很高,但对敏感问题乱答,幻觉率超标,照样不能上。审核通过率指的是内容安全合规审核的通过比例,涉及账户、资金、个人信息的内容,必须100%通过才允许对外。还有一个容易被忽视的指标是响应时延,大模型流式输出快慢直接影响客服坐席的使用意愿,太慢的工具最终会被弃用。
所以,金融服务系统做智能化,节奏远比嗓门重要。方向上可以大胆,落地时必须把评测、溯源、人工兜底这几种脚手架先搭好。
最后说几句实在话。在金融服务这个领域待久了你会发现,所有"高级"的技术,最后都要落到三个词上:稳定、可审计、可回滚。我们做微服务化时保留了大量的手工对账脚本,上风控模型时保留了每条规则的日志,让大模型写答案时坚持附上引用来源,这些都是笨办法。但在金融系统里,笨办法往往是最稳的办法。如果这篇分享能让你少踩一两个坑,或者在下一次架构评审时多一点底气,那我就没白写。