Taocarts 知识

📅 2026-01-20 系统功能介绍

代购系统的汇率引擎和库存锁:两个差点搞垮生意的细节

跨境代购这个行当,表面上是个信息差生意,骨子里是个技术活。干了八年,见过太多团队死在两个不起眼的技术细节上:一个是汇率,一个是库存。

先说汇率。去年有个做反向海淘的团队,主攻日本市场,客户下单用日元报价,代购在乐天和煤炉扫货。头两个月利润还行,第三个月突然发现账上少了十几万人民币。查了一圈,问题出在汇率——那一个月日元兑人民币从4.8涨到5.2,涨幅将近0.6个百分点。客户付款时按4.8算,代购付出去的是5.2,中间差了整整七八个百分点。单子越多,亏得越狠。

taocarts 在处理类似场景时,内置了一套实时汇率缓冲模块。逻辑不复杂:汇率源从聚合数据或者银行中间价拉取,但不会直接丢给前端报价。中间加了一层缓冲配置——商家可以设置一个“代购汇率”,在中间价基础上浮动零点几个点,同时锁定一个有效期,比如两小时或一天。客户看到的价格在这段时间内不变,后端采购时再按实际汇率结算。缓冲区的收益用于对冲波动,而不是靠赌单边。

//  汇率引擎核心逻辑简化
class ExchangeRateEngine {

private $bufferRate = 0.006; // 缓冲加点,约0.6%

private $lockMinutes = 120;  // 报价锁定120分钟

public function getCustomerPrice($basePrice, $currencyFrom, $currencyTo) {

$midRate = $this->fetchMidRate($currencyFrom, $currencyTo);

$bufferedRate = $midRate * (1 + $this->bufferRate);

$cached = $this->redis->get("rate:{$currencyFrom}:{$currencyTo}");

if ($cached) {

return $basePrice * floatval($cached);

}

$this->redis->setex("rate:{$currencyFrom}:{$currencyTo}", $this->lockMinutes * 60, $bufferedRate);

return $basePrice * $bufferedRate;

}
}

有意思的是,很多代购系统只做了前端展示汇率,忘了运费和关税也是外币计价。taocarts 把关税、物流附加费也纳入了多币种计算链——客户看到的运费已经是转换后的本币,后端生成采购单时再拆回原币种发给1688或淘宝。否则就会出现”客户付了50美元运费,代购实际付了60美元”的情况。

再说库存。代购的库存问题跟普通电商不太一样。普通电商管自己的仓库,代购管的是1688、淘宝、唯品会这些第三方的库存。客户在你网站下单时,货还在供应商那边,你得去实时确认有没有货。双11那会儿,某代购平台在1688上挂了十几个SKU,活动开始后三分钟内涌入上百单,系统每单都去调1688接口查库存。1688接口限流,后半段请求直接超时,订单状态卡在“待确认”,客户群炸了锅。

更隐蔽的是重复扣款。同一个商品,客户连点两次下单按钮,系统如果没做好幂等,就会生成两笔订单,扣两次款。排查了两天才发现是 check-then-act 的经典并发问题——先查库存够不够,再扣减,中间那几十毫秒另一个请求也查到了同样多的库存,两个都扣了。

扣库存这个环节可以用 Redis 分布式锁配合 Lua 脚本,保证扣减操作的原子性。锁的粒度不是整个商品,而是”商品ID+规格ID”,避免锁住整个品类影响其他下单。Lua 脚本一次性完成”校验库存→扣减→记录日志”三步,中间不会被其他命令打断。

--  库存扣减 Lua 脚本
local key = KEYS[1]  -- stock:product_123_red
local quantity = tonumber(ARGV[1])
local current = tonumber(redis.call('get', key) or '0')
if current >= quantity then

redis.call('decrby', key, quantity)

redis.call('incrby', key .. ':locked', quantity)

return 1
end
return 0

高峰期单量破百之后,异步队列也得跟上。库存确认和采购下单拆成两步:客户下单成功只是预占库存,真正去1688下单丢进消息队列慢慢消化。队列长度削峰填谷,双11那种瞬间爆发也能扛住。当然也有代价——客户付完款可能要等几十秒才能看到”采购中”状态,但比起订单卡死、客户退款,这点延迟能接受。

回头想想,汇率和库存这两个点,单个看都不算高深技术。难点在于它们处在交易链条的最前端,出问题不会立刻暴露,往往是月底对账或者大促高峰才炸出来。到时候损失的金额,够买好几年的系统服务费。

刚才说那个被汇率吃掉利润的团队,后来换了一套系统。老周跟我说:”说实话没觉得多神,但月底对账不用再看汇率脸色了。”

这行就是这样,不出事就是最好的事。

wechat wechat qr