news 2026/10/30 13:33:39

高并发转账系统设计方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
高并发转账系统设计方案

目录

1. 系统架构设计

1.1 核心架构模式

1.2 技术栈选择

2. 数据库设计

2.1 核心表结构

3. 核心代码实现

3.1 转账服务接口

3.2 账户服务实现

3.3 转账服务实现

3.4 分库分表策略

4. 性能优化方案

4.1 缓存策略

4.2 批量处理优化

4.3 异步补偿机制

5. 监控和告警

5.1 监控指标

6. 压力测试配置

6.1 JMeter测试计划

7. 部署配置

7.1 Docker Compose配置

8. 关键优化点总结


1. 系统架构设计

1.1 核心架构模式

应用层 → 业务层 → 数据层 ↓ 消息队列 ←→ 分布式缓存 ↓ 数据库集群

1.2 技术栈选择

  • 框架: Spring Boot 3.x + Spring Cloud
  • 数据库: MySQL 8.0 + Redis 7.x
  • 消息队列: RocketMQ/Kafka
  • 注册中心: Nacos
  • 分布式事务: Seata
  • 监控: Prometheus + Grafana
  • 压测: JMeter

2. 数据库设计

2.1 核心表结构

-- 账户表 CREATE TABLE account ( id BIGINT PRIMARY KEY COMMENT '账户ID', account_no VARCHAR(32) UNIQUE NOT NULL COMMENT '账户编号', user_id BIGINT NOT NULL COMMENT '用户ID', balance DECIMAL(20,2) NOT NULL DEFAULT 0.00 COMMENT '余额', frozen_balance DECIMAL(20,2) NOT NULL DEFAULT 0.00 COMMENT '冻结金额', version INT NOT NULL DEFAULT 0 COMMENT '版本号', currency VARCHAR(3) NOT NULL COMMENT '货币类型', status TINYINT NOT NULL DEFAULT 1 COMMENT '状态:1正常,2冻结', create_time DATETIME DEFAULT CURRENT_TIMESTAMP, update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_user_id (user_id), INDEX idx_account_no (account_no) ) ENGINE=InnoDB COMMENT='账户表'; -- 账户流水表 CREATE TABLE account_flow ( id BIGINT PRIMARY KEY, flow_no VARCHAR(64) UNIQUE NOT NULL COMMENT '流水号', account_id BIGINT NOT NULL COMMENT '账户ID', amount DECIMAL(20,2) NOT NULL COMMENT '变动金额', balance DECIMAL(20,2) NOT NULL COMMENT '变动后余额', flow_type TINYINT NOT NULL COMMENT '流水类型:1收入,2支出', biz_type VARCHAR(32) NOT NULL COMMENT '业务类型', biz_no VARCHAR(64) NOT NULL COMMENT '业务单号', remark VARCHAR(255) COMMENT '备注', create_time DATETIME DEFAULT CURRENT_TIMESTAMP, INDEX idx_account_id_time (account_id, create_time), INDEX idx_biz_no (biz_no) ) ENGINE=InnoDB COMMENT='账户流水表'; -- 转账记录表 CREATE TABLE transfer_record ( id BIGINT PRIMARY KEY, transfer_no VARCHAR(64) UNIQUE NOT NULL COMMENT '转账单号', from_account_no VARCHAR(32) NOT NULL COMMENT '转出账户', to_account_no VARCHAR(32) NOT NULL COMMENT '转入账户', amount DECIMAL(20,2) NOT NULL COMMENT '转账金额', currency VARCHAR(3) NOT NULL COMMENT '货币', status TINYINT NOT NULL DEFAULT 0 COMMENT '状态:0处理中,1成功,2失败', fail_reason VARCHAR(255) COMMENT '失败原因', remark VARCHAR(255) COMMENT '备注', create_time DATETIME DEFAULT CURRENT_TIMESTAMP, finish_time DATETIME COMMENT '完成时间', INDEX idx_status_time (status, create_time), INDEX idx_from_account (from_account_no, create_time), INDEX idx_to_account (to_account_no, create_time) ) ENGINE=InnoDB COMMENT='转账记录表';

3. 核心代码实现

3.1 转账服务接口

// 转账请求DTO @Data public class TransferRequest { @NotBlank private String fromAccountNo; @NotBlank private String toAccountNo; @DecimalMin(value = "0.01", message = "转账金额必须大于0") private BigDecimal amount; @NotBlank private String currency; private String remark; @NotBlank private String requestId; // 请求ID,用于幂等性 } // 转账服务接口 public interface TransferService { /** * 同步转账 */ TransferResult transfer(TransferRequest request); /** * 异步转账 */ CompletableFuture<TransferResult> transferAsync(TransferRequest request); /** * 批量转账 */ BatchTransferResult batchTransfer(List<TransferRequest> requests); }

3.2 账户服务实现

@Service @Slf4j public class AccountServiceImpl implements AccountService { @Autowired private AccountMapper accountMapper; @Autowired private RedisTemplate<String, Object> redisTemplate; @Autowired private RedissonClient redissonClient; // 账户本地缓存 private final Cache<String, Account> accountCache = Caffeine.newBuilder() .maximumSize(10000) .expireAfterWrite(5, TimeUnit.SECONDS) .build(); @Override @Transactional(rollbackFor = Exception.class) public Account getAccountForUpdate(String accountNo) { String lockKey = "account_lock:" + accountNo; RLock lock = redissonClient.getLock(lockKey); try { // 加锁,防止并发操作同一账户 boolean locked = lock.tryLock(3, 10, TimeUnit.SECONDS); if (!locked) { throw new ServiceException("系统繁忙,请稍后重试"); } // 从缓存获取 Account account = accountCache.getIfPresent(accountNo); if (account == null) { // 从数据库获取并加行锁 account = accountMapper.selectForUpdate
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/30 13:32:41

NumPy 函数手册:随机数(numpy.random)

在数据分析、统计模拟以及机器学习中&#xff0c;经常需要生成随机数。例如&#xff1a;• 生成随机样本• 构造模拟数据• 初始化模型参数• 实现随机抽样NumPy 提供了一组用于随机数生成&#xff08;random number generation&#xff09;的函数&#xff0c;可以生成多种概率…

作者头像 李华
网站建设 2026/10/4 13:30:27

VMware与macOS跨平台整合方案:Unlocker工具全场景应用指南

VMware与macOS跨平台整合方案&#xff1a;Unlocker工具全场景应用指南 【免费下载链接】unlocker 项目地址: https://gitcode.com/gh_mirrors/unloc/unlocker 一、核心价值解析&#xff1a;为何选择Unlocker构建虚拟机环境 在虚拟化技术广泛应用的今天&#xff0c;开发…

作者头像 李华
网站建设 2026/10/30 13:32:26

新手福音:在快马平台零基础学习开发你的首个idea ai插件

最近想学点新东西&#xff0c;看到网上关于AI插件的讨论很火&#xff0c;尤其是能集成到IDEA这类开发工具里的。作为一个编程新手&#xff0c;一开始觉得这玩意儿肯定特别复杂&#xff0c;又是监听事件&#xff0c;又是界面交互&#xff0c;还得处理网络请求&#xff0c;想想就…

作者头像 李华
网站建设 2026/10/4 13:34:57

TranslucentTB:重塑桌面视觉体验的界面革新

TranslucentTB&#xff1a;重塑桌面视觉体验的界面革新 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 痛点剖析&#xff1a;被忽视的视觉…

作者头像 李华
网站建设 2026/10/4 13:34:58

实战应用:基于快马平台构建具备本地存储的pro max待办应用

今天想和大家分享一个实战项目&#xff1a;基于UI/UX Pro Max理念&#xff0c;构建一个具备本地存储功能的待办事项应用。这个项目听起来有点复杂&#xff0c;但核心目标很明确——不仅要界面好看&#xff0c;更要交互流畅、体验极致&#xff0c;并且数据能持久保存。我最近在I…

作者头像 李华
网站建设 2026/10/4 13:35:28

3步解锁智能工具:视频内容提取与高效文档转换全攻略

3步解锁智能工具&#xff1a;视频内容提取与高效文档转换全攻略 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 在数字化办公与在线学习的浪潮中&#xff0c;视频已成为信息传递的主…

作者头像 李华