个人编制软件展示

PSI - Purchase Sale Inventory 进销存软件

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('库存扣减失败,请重试');
}

负载均衡策略

多实例部署时合理分配请求:

  1. 轮询策略:简单场景下使用,请求均匀分配
  2. 加权轮询:根据服务器性能分配不同权重
  3. 最少连接:将请求分配给当前连接数最少的服务器
  4. IP哈希:同一IP的请求固定到同一服务器,保证会话一致

异步处理架构

使用消息队列实现异步处理,提升系统吞吐量:

限流与熔断

保护系统在高并发下不被压垮:

策略 实现方式 效果
限流 令牌桶、漏桶算法 控制请求速率
熔断 连续失败后熔断 防止级联故障
降级 返回缓存/默认值 保证核心功能
排队 消息队列缓冲 削峰填谷

缓存策略设计

合理使用缓存可以大幅提升系统性能:

← 下一篇:PSI进销存系统API网关设计与流量管控 上篇:PSI进销存软件数据备份与灾难恢复 →