校园中转业务上云时,应把订单来源同步、履约事实和通知投递分别建模,用来源映射避免重复登记,用事务事件记录本地变化,再通过独立对账识别缺失与不一致。消息到达和履约完成是不同事实。本文讨论可选架构,不表示微订实际采用某项云产品。
服务边界:先模块化,再决定是否拆分
业务可以先在一个应用中分成来源适配、履约、通知和核对模块。来源适配负责取得获准数据及查询来源结果;履约负责点位、任务和交接;通知负责投递意图及回执;核对模块比较应有和实际记录。是否拆独立服务取决于规模、团队和运维条件,而不是因为使用了云就必须拆分。
接入其他平台时,先确认授权、允许字段、调用频率和失败处理。人工录码只可能是业务登记,不能假设具有完整交易控制权。来源系统中发生的取消或退款,应保留原编号、事件含义和发生时间,由明确规则决定本地如何处理。
| 数据层 | 建议保存 | 不能直接推定 |
|---|---|---|
| 来源映射 | 来源类型、原编号、本地任务号 | 扫码成功代表交易已支付 |
| 事件收件箱 | 事件标识、版本及处理结果 | 收到消息代表本地业务已完成 |
| 履约记录 | 交接事实、责任、结果 | 通知成功代表餐品已领取 |
| 核对差异 | 双方状态与差异原因 | 缺记录等于零费用或已取消 |
来源映射:业务身份与传输身份分开
相同业务可能通过扫描和接口先后到达,单用消息编号无法识别它们是同一来源订单。可以建立由来源类型、原业务编号及约定服务范围组成的映射,再记录各条传输事件。具体唯一键必须经过业务确认,不能把不同配送段误合为一条任务。
消息的事件标识用于去重传输,业务映射用于识别对象。若原编号缺失或同编号字段冲突,应进入待核对,不擅自创建新对象或覆盖已有目的地。人工合并和拆分也要保存原始引用与操作原因,避免后续无法解释。
本地事务与Outbox
在同一个数据库事务中,可以保存履约状态变化及待发送事件,事务提交后由投递任务发送。若业务更新成功但进程在发消息前退出,待发送记录仍可恢复;若发送成功后回执丢失,重试可能造成重复投递,因此消费者仍需幂等。
消费者把去重判断、受支持的业务变化和处理结果放在同一事务。不要先标记已消费,再异步执行业务;否则中途退出会留下永远跳过的事件。也不要仅用内存标记去重,重启后标记丢失可能重复执行。
producer transaction:
update fulfillment with expected_version
insert outbox(event_id, object_id, object_version, schema_version)
commit
consumer transaction:
if inbox contains event_id: return saved_result
require supported(schema_version)
apply_allowed_transition(object_id, object_version)
insert inbox(event_id, result_reference)
commit
乱序与未知结果:先保留事实
取消消息可能晚于到站消息,接手消息也可能重复。应以业务对象和可接受的转换判断,不按到达时间无条件覆盖。对象版本缺口可以暂停该对象并查询来源事实,其他独立任务仍继续;不能为了让列表“完成”跳过未知项。
调用外部来源超时,只说明本次没有取得结果,不能证明对方未执行。后续沿原业务引用查询,避免换一个编号再创建。若来源端提供明确幂等协议,按其有效期及参数约束使用;没有此能力时,更需要人工核对和记录未知结果。
对账不是把两边改成一样
核对时固定校区、时间范围、订单集合与状态定义,比较来源映射、已登记任务、有效交接及通知结果。差异可分为来源有而本地无、本地有而来源未确认、状态冲突、重复关联及跨期。对账发现问题后先查原事实,不为平表直接修改交易或伪造交接。
费用账与履约账也应分开。商品退款、配送服务费和各段费用可能来自不同规则,关联时记录规则版本与生效时刻。没有明确结果的记录保持待处理,并有责任人,不能将未知金额当作零或用覆盖旧分录消除差异。
可观测性和恢复演练
日志关联来源引用、任务号、事件号及差异编号,按需脱敏,不写入授权凭据和个人明细。可观察未处理事件年龄、版本缺口、重复命中与待核对数量;阈值依据实际业务基线设定,不编造统一性能目标。
备份和恢复需要分别验收。可在获准环境中演练事务提交后进程退出、投递后回执丢失、消费者处理时回滚、未知事件版本及来源暂不可用。恢复后检查既有任务是否重复、原事件是否仍可追溯、差异是否有人接手。
若选择托管数据库或消息服务,另核网络、备份、访问控制、配额及监控责任;云产品名称不会自动保证业务一致性。本文没有报告真实部署、成本节省或压测数据,模型与伪代码均为示例。作者:微订(上海逊柯计算机科技有限公司)。本文讨论校园中转业务来源事件与履约对账的通用设计。