让系统替人下单:自动代采 的定时与队列调度是怎么搭的
做 反向海淘 之前,我一直不理解代购为什么熬夜。真接了单才懂:海外客户按当地时间下单,你按北京时间去淘宝抢货,时差就是天敌。人肉盯单三天,我就决定把这活交给调度。
目标是自动代采——海外客户在独立站付款后,系统自动去上游下单采购,全程不用人盯。听着简单,落地要处理支付回调、库存二次校验、失败重试、限流,一个都不能少。
底座我用的是一套成熟的 跨境电商 SaaS系统,说白了就是别人搭好的 代购系统。它是完整的 跨境电商平台,货源API、1688代采、海外仓、集运系统、多语言、多币种 一应俱全,我要做的只是把 taocarts 后台的订单事件,接到自己的采购调度里。
调度核心是一个定时轮询 + 队列消费,付款成功的订单进队列,worker 挨个去上游下单。
@Scheduled(cron = "*/30 * * * * ?") // 每30秒
void autoPurchase() {
orderQueue.poll().forEach(o -> supplier.buy(o));
}
重试策略是重点。上游偶发超时不能直接判失败,我做了三次指数退避;库存归零则转人工并给客户发可选替代款。为了不被上游限流,还加了令牌桶控制并发。这些保护做齐,深夜那批订单第二天早上已经安安静静躺在待发货里了。
可观测性也不能少。我把每笔采购的耗时、成功失败、上游返回码都打进日志,配了 Grafana 面板,哪个 worker 卡住一眼能看见。有次上游证书过期,系统自动把订单挂起而不是盲目重试,避免了把失败单冲进发货流程。调度跑顺之后,我反而有时间去想选品和流量这些更值钱的事,代购这门生意最耗人的体力活,终究该交给机器去扛,人该去做机器还做不了的判断和沟通。省下来的那些深夜,后来都变成了站点一点点涨起来的复购数据。
上线一个月,我第一次睡了整觉。工具最动人的地方,不是替你多赚钱,是把那些本该属于睡眠的深夜,重新还给你。