
1) 【一句话结论】
针对百万级企业客户、日均数万笔贸易融资申请的审批系统,采用微服务架构拆分业务能力,通过分布式锁+数据库事务保障核心数据强一致性,分库分表+读写分离优化数据库性能,结合Redis缓存+热点数据动态预热,以及主备中心异步同步的容灾方案,确保高并发、数据一致性与业务连续性。
2) 【原理/概念讲解】
老师会讲解系统架构分层:用户层通过API网关统一入口,服务层拆分为贷款申请、风控评估、审批流程、放款通知等微服务,数据层采用TiDB分布式数据库(支持强一致性)+Redis缓存,实现服务解耦与弹性扩展。数据一致性保障:核心数据(如贷款状态变更)需强一致性,采用Redis分布式锁(如Redlock算法)+TiDB的XA事务实现原子操作,避免并发冲突;非核心业务流程(如申请状态流转)采用Saga模式(最终一致),将长事务拆分为多个短事务,失败时调用补偿服务回滚,适用于业务流程长且允许补偿的场景。数据库分库分表:按企业ID分库(如库1存储E001-E1000,库2存储E1001-E2000),按申请ID分表(表1存储A001-A1000,表2存储A1001-A2000),通过ShardingSphere路由查询,减少单库压力。缓存策略:Redis缓存热点数据(如热门企业贷款额度、常用审批状态),冷启动时预加载热门企业数据(如前1000家),设置TTL=3600秒,读取时先查缓存,未命中再查数据库。容灾方案:主中心(东京)与备中心(大阪)异地部署,通过Kafka异步同步数据(如贷款申请、审批记录),故障时负载均衡器(如Nginx)切换到备中心,健康检查(心跳检测)确保切换时间<1秒,保证业务连续性。
3) 【对比与适用场景】
| 方案 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 分布式锁+事务(强一致性) | 核心数据变更时,先加分布式锁,再执行数据库事务 | 强一致性,低延迟,原子操作 | 贷款状态、账户余额等关键数据变更(如审批通过后更新状态) | 需高可用锁服务(如Redis),避免死锁 |
| Saga模式(最终一致) | 将长事务拆分为多个短事务,失败时调用补偿服务回滚 | 最终一致性,降低分布式事务复杂度,适用于业务流程长(如申请-风控-审批多步骤) | 贷款申请流程、订单处理流程 | 补偿逻辑需幂等,保证重复执行不产生副作用 |
| 2PC(两阶段提交) | 领导者-从者模式,协调者决定提交或回滚 | 强一致性,但阻塞风险高(协调者故障导致整个事务失败) | 数据库数量少、事务简单(如支付、库存) | 领导者故障导致业务中断 |
4) 【示例】
API请求示例(贷款申请):
POST /api/v1/loans/applications
请求体:
{
"enterprise_id": "E001",
"loan_amount": 1000000,
"purpose": "设备采购",
"documents": ["营业执照", "财务报表"]
}
响应:
{
"application_id": "A001",
"status": "待风控",
"message": "申请提交成功,正在风控评估中"
}
分库分表查询示例(查询贷款状态):
表loan_applications按企业ID分库(库1:E001-E1000,库2:E1001-E2000),按申请ID分表(表1:A001-A1000,表2:A1001-A2000)。
查询企业E001的贷款申请A001:
路由逻辑:
缓存预热示例(动态预热):
定时任务(如系统启动后每5分钟):
# 动态预热热门企业数据
hot_enterprises = get_top_enterprises(limit=1000) # 获取访问频率最高的1000家企业
for enterprise in hot_enterprises:
loan_amount = get_enterprise_loan_amount(enterprise_id) # 从数据库获取
set_cache(f"loan_amount:{enterprise_id}", loan_amount, ttl=3600) # 设置缓存,TTL=1小时
Saga补偿示例(风控失败):
风控服务调用失败(如信用评分不足),触发补偿服务:
# 补偿服务:撤销申请
def compensate_reject_application(application_id):
# 幂等性检查
if check_compensation_status(application_id):
return
# 更新状态为“已拒绝”
update_loan_status(application_id, "已拒绝")
log_compensation(application_id) # 记录补偿日志
5) 【面试口播版答案】
“面试官您好,针对百万级企业客户、日均数万笔贸易融资申请的审批系统,我设计的架构是微服务+强一致性保障+分库分表+缓存预热+异地多活。首先,系统拆分为贷款申请、风控评估、审批流程、放款通知等微服务,通过API网关统一入口,实现服务解耦。数据层用TiDB分布式数据库(支持强一致性)+Redis缓存,分库分表处理海量数据,读写分离提升数据库性能。核心数据(如贷款状态变更)通过Redis分布式锁(Redlock算法)+TiDB的XA事务保证强一致性,比如审批通过时,先加锁更新数据库状态,再通知放款服务,避免并发冲突。非核心业务流程(如申请状态流转)采用Saga模式(最终一致),将长事务拆分为多个短事务,失败时调用补偿服务回滚,适用于业务流程长且允许补偿的场景。缓存方面,冷启动时预加载热门企业数据,并动态调整预热策略(根据访问频率增加预热数据量),减少首次访问延迟。容灾采用东京与大阪异地多活,主备中心通过Kafka异步同步数据(延迟1-2秒),故障时负载均衡器快速切换(<1秒),保证业务连续性。性能优化上,数据库分库分表后,为热点数据查询设计复合索引(如按企业ID+申请状态),缓存设置TTL并实现热点数据预热,服务间调用用gRPC减少HTTP开销,提升QPS。这样能支撑高并发、数据一致和容灾需求。”
6) 【追问清单】
问:分布式事务中,强一致性场景的具体实现细节?比如贷款状态变更时,如何避免并发冲突?
回答要点:使用Redis分布式锁(Redlock算法)加数据库事务(TiDB的XA事务),确保状态变更的原子性,避免并发时多个服务同时修改导致数据不一致。
问:缓存预热策略具体如何实现?比如动态调整预热数据量?
回答要点:通过定时任务(如系统启动后每5分钟)获取访问频率最高的企业数据,动态增加预热数据量,根据系统负载调整预热策略(高负载时增加预热数据量,减少数据库压力)。
问:容灾方案中,主中心故障时,数据同步的延迟如何处理?比如备中心数据是否实时?
回答要点:主备中心通过Kafka异步同步数据,故障时负载均衡器切换到备中心,数据同步延迟通常在秒级(1-2秒),备中心数据接近实时,切换后业务不受影响。
问:如何处理Saga补偿逻辑的幂等性?比如补偿服务重复调用是否会导致重复操作?
回答要点:补偿服务通过唯一事务ID(如申请ID)判断是否已执行,若已记录补偿日志,则跳过重复执行,避免重复撤销申请。
7) 【常见坑/雷区】