PSI进销存系统分布式架构与高并发设计
分布式架构设计
随着业务规模扩大,单体应用难以满足性能和可用性要求。PSI进销存系统采用分布式架构设计,将系统拆分为多个独立服务,提升系统的可扩展性、可用性和维护性。分布式架构能够有效应对业务增长带来的挑战,保证系统在高峰期稳定运行。
服务拆分策略
合理的服务拆分是高并发系统设计的基础:
- 业务边界拆分:按业务领域划分服务,如订单服务、库存服务、采购服务
- 读写分离:查询和写入操作分离,读服务可以水平扩展
- 职责单一:每个服务只负责特定功能,便于开发和维护
- 数据独立:各服务拥有独立的数据库,减少数据库瓶颈
微服务架构图
| 服务名称 | 主要功能 | 技术选型 |
|---|---|---|
| API网关 | 请求路由、认证、限流 | Koa / Nginx |
| 订单服务 | 订单创建、查询、状态管理 | Node.js / Koa |
| 库存服务 | 库存查询、锁定、扣减 | Redis + MySQL |
| 支付服务 | 支付处理、退款、对账 | Spring Boot |
| 消息服务 | 消息推送、事件通知 | RabbitMQ |
高并发库存扣减方案
库存扣减是高并发场景下的核心挑战,PSI采用多种方案保证库存一致性:
// 1. Redis预扣减方案
async function deductStock(productId, quantity) {
const stockKey = `stock:${productId}`;
// Lua脚本保证原子性
const script = `
local stock = tonumber(redis.call('GET', KEYS[1]))
local quantity = tonumber(ARGV[1])
if stock >= quantity then
redis.call('DECRBY', KEYS[1], quantity)
return 1
else
return 0
end
`;
const result = await redis.eval(script, 1, stockKey, quantity);
if (result === 0) {
throw new Error('库存不足');
}
// 异步同步到数据库
await syncStockToDb(productId, quantity);
return result;
}
// 2. 数据库乐观锁方案
async function deductStockWithOptimisticLock(productId, quantity) {
let retries = 3;
while (retries > 0) {
// 读取当前库存和版本号
const product = await db.query(
'SELECT stock, version FROM product WHERE id = ? FOR UPDATE',
[productId]
);
if (product.stock < quantity) {
throw new Error('库存不足');
}
// 乐观锁更新
const affected = await db.execute(
'UPDATE product SET stock = stock - ?, version = version + 1 WHERE id = ? AND version = ?',
[quantity, productId, product.version]
);
if (affected === 1) {
return true;
}
retries--;
await delay(10); // 短暂延迟后重试
}
throw new Error('库存扣减失败,请重试');
}
负载均衡策略
多实例部署时合理分配请求:
- 轮询策略:简单场景下使用,请求均匀分配
- 加权轮询:根据服务器性能分配不同权重
- 最少连接:将请求分配给当前连接数最少的服务器
- IP哈希:同一IP的请求固定到同一服务器,保证会话一致
异步处理架构
使用消息队列实现异步处理,提升系统吞吐量:
- 订单创建:同步创建订单,异步发送通知、记录日志
- 库存同步:多仓库库存同步通过消息队列异步处理
- 报表生成:大数据量报表生成放入队列异步执行
- 批量操作:批量导入导出使用异步任务处理
限流与熔断
保护系统在高并发下不被压垮:
| 策略 | 实现方式 | 效果 |
|---|---|---|
| 限流 | 令牌桶、漏桶算法 | 控制请求速率 |
| 熔断 | 连续失败后熔断 | 防止级联故障 |
| 降级 | 返回缓存/默认值 | 保证核心功能 |
| 排队 | 消息队列缓冲 | 削峰填谷 |
缓存策略设计
合理使用缓存可以大幅提升系统性能:
- 多级缓存:本地缓存 + Redis分布式缓存
- 缓存粒度:根据数据变化频率选择缓存粒度
- 过期策略:设置合理的过期时间,保证数据时效性
- 缓存击穿:使用互斥锁或永不过期策略
- 缓存雪崩:随机过期时间 + 持久化保障