客户端下单超时不能认为订单失败,因为请求可能已经到达服务端,甚至已经进入撮合。正确做法是客户端提交 clientOrderId 或幂等键。
服务端收到请求后,先按 clientOrderId 查询是否已有结果。如果没有,再创建订单并分配唯一内部订单号或 Sequencer 序号。如果客户端重试相同 clientOrderId,系统应该返回同一笔订单的最终状态,而不是创建新订单。
下游服务也要幂等。成交事件、清算事件、账本事件都应有唯一 eventId,消费者按 eventId 或业务唯一键去重。资金系统尤其不能因为消息重复而重复扣款或重复加仓。