Notes on tech,life,etc.
by Ynotes.cc
现在的“新一代核心”(如中国厂商的长亮、神州信息,以及部分自研银行如微众银行)基本都是基于 Java 构建的。 要实现一个基于 Java 的 CBS,工程上通常遵循 DDD(领域驱动设计),并在以下几个关键维度进行深度设计:
这是一个巨大的坑。很多银行一上来就拆微服务,结果因为分布式事务(Distributed Transaction)搞得焦头烂额。
这是 Java CBS 的心脏,代码必须极其严谨。
double 或 float(精度丢失问题)。java.math.BigDecimal。Money Value Object (值对象)。
public class Money {
private BigDecimal amount;
private Currency currency;
// 封装加减乘除,处理舍入模式 (RoundingMode.HALF_EVEN)
}
@Transactional 注解。@Transactional(isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class)
public void executeTransfer(TransferCommand cmd) {
// 1. 扣款 (Debit)
accountRepository.debit(cmd.getFromAccountId(), cmd.getAmount());
// 2. 入账 (Credit)
accountRepository.credit(cmd.getToAccountId(), cmd.getAmount());
// 3. 记流水 (Journal Entry)
transactionLogRepository.save(new Log(...));
}
这是 Java 系统最大的性能瓶颈。比如“Shopee 的商户收款账户”,每秒有几万笔入账,数据库行锁(Row Lock)会把系统拖死。
Java 是静态强类型语言,不像 Python 那么灵活,如何实现“配置化产品”?
SavingsAccount, LoanAccount)。InterestComponent(计息), FeeComponent(费用), LimitComponent(限额)。// 产品定义其实是一组组件的 Bean Name 列表
List<InterestStrategy> strategies = productConfig.getStrategies();
for (InterestStrategy s : strategies) {
s.calculate(context);
}
为了实现极致的灵活(比如复杂的阶梯利率),Java 核心通常会集成脚本引擎。
GroovyClassLoader。CBS 不仅要处理实时交易,每天晚上还要跑日终(EOD, End of Day),进行计息、结单、跑报表。这是 Java 的弱项(对比 COBOL)。
Partitioner 接口,把 1000 万个账户切分成 100 个切片(Slave Step)。BatchInsert)。当核心系统与外围(如支付中台)交互时,如何保证一致性?
为了避免变成“面条代码”,Java CBS 通常采用 SPI (Service Provider Interface) 机制。
AccountValidator。ThaiAccountValidator(检查身份证)。VietnamAccountValidator(检查手机号)。| 层级 | 关键技术 / 库 | 用途 |
|---|---|---|
| 接入层 | Netty / Spring WebFlux | 处理高并发 API 请求,非阻塞 I/O |
| 业务层 | Spring Boot, DDD | 领域模型构建,业务逻辑封装 |
| 动态层 | Groovy / QLExpress | 动态计算利息、费率,无需发版即可修改逻辑 |
| 批处理 | Spring Batch | 日终跑批,大数据量处理 |
| 持久层 | MyBatis / JOOQ | 相比 Hibernate 更可控 SQL,高性能 |
| 数据库 | MySQL / PostgreSQL / TiDB | TiDB (分布式数据库) 在东南亚银行越来越流行 |
| 缓存 | Redis (Cluster) | 缓存账户余额、交易限额 |
| 消息队列 | RocketMQ / Kafka | 削峰填谷,异步解耦,数据同步 CDC |
核心难点其实不在于 Java 语法本身,而在于: