一、数据一致性的核心挑战
1. 多终端类型:Web端(商家后台)、APP端(采购员/司机)、小程序(供应商)、IoT设备(冷库传感器)等。
2. 高频并发操作:订单创建、库存扣减、物流状态更新等需实时响应。
3. 网络不稳定:移动端可能处于弱网环境,需支持离线操作与数据同步。
4. 业务复杂度高:生鲜品控、批次管理、动态定价等业务规则需严格一致。
二、技术架构设计
1. 分布式系统架构
- 微服务拆分:按业务域拆分为订单服务、库存服务、物流服务等,每个服务独立部署,通过API网关交互。
- 事件驱动架构(EDA):通过事件总线(如Kafka、RocketMQ)实现服务间解耦,例如:
- 订单创建后发布`OrderCreated`事件,库存服务监听并扣减库存。
- 物流状态变更时发布`DeliveryUpdated`事件,触发通知推送。
2. 数据同步机制
- 最终一致性模型:
- 本地数据库+异步同步:终端设备优先操作本地数据库(如SQLite),通过消息队列异步同步至中心库。
- 冲突解决策略:采用“最后写入优先”或业务规则定制(如订单状态以服务器为准)。
- 强一致性场景:
- 分布式事务:对库存扣减等关键操作,使用Seata等框架实现TCC(Try-Confirm-Cancel)模式。
- 同步锁机制:通过Redis分布式锁控制并发操作(如同一商品库存的并发扣减)。
3. 离线能力支持
- 本地缓存与队列:
- 移动端使用Room(Android)或Core Data(iOS)缓存数据,断网时操作本地队列。
- 网络恢复后批量同步,并通过版本号或时间戳检测冲突。
- 增量同步优化:
- 基于时间戳或ETag的增量拉取,减少数据传输量。
- 使用Diff算法合并本地与远程数据变更。
三、关键技术实现
1. 数据库设计
- 分库分表:按业务域分库(如订单库、库存库),水平分表提升并发能力。
- 读写分离:主库负责写操作,从库通过Binlog同步数据,供查询使用。
- 版本控制:为每条数据添加`version`字段,更新时校验版本号防止覆盖。
2. 消息队列优化
- 消息去重:通过消息ID+业务ID去重,避免重复消费。
- 顺序消费:对库存扣减等有序操作,使用Kafka分区保证消息顺序。
- 死信队列:处理失败消息,通过重试机制或人工干预解决。
3. 缓存策略
- 多级缓存:
- 本地缓存(Caffeine/Guava)缓存热点数据。
- 分布式缓存(Redis)存储全局数据,如商品基本信息。
- 缓存一致性:
- 写操作时同时更新缓存和数据库(Cache-Aside模式)。
- 对强一致性场景,使用Redis事务或Lua脚本保证原子性。
4. 监控与告警
- 数据一致性监控:
- 对比各终端数据快照,检测不一致记录。
- 监控消息队列积压量,及时扩容或优化消费逻辑。
- 告警机制:
- 对关键数据(如库存)设置阈值告警。
- 通过钉钉/企业微信推送异常通知。
四、业务场景示例
场景1:订单创建与库存扣减
1. 商家在Web端提交订单,订单服务写入本地数据库并发布`OrderCreated`事件。
2. 库存服务监听事件,通过分布式锁扣减库存,成功后发布`InventoryUpdated`事件。
3. 物流服务根据库存结果分配配送资源,更新订单状态为“已接单”。
4. 移动端APP实时拉取订单状态,通过WebSocket推送通知。
场景2:移动端离线操作
1. 司机在弱网环境下通过APP扫描商品条码,数据暂存本地SQLite。
2. 网络恢复后,APP将操作日志批量上传至服务器,服务器校验后更新中心库。
3. 若发现冲突(如库存不足),服务器返回错误,APP提示用户重新操作。
五、测试与验证
1. 混沌工程:模拟网络分区、节点故障,验证系统容错能力。
2. 全链路压测:模拟高并发场景(如促销活动),检测数据同步延迟。
3. 数据核对工具:开发自动化脚本对比各终端数据,生成差异报告。
六、总结
快驴生鲜系统通过分布式架构+事件驱动+异步同步的组合方案,结合业务场景定制一致性策略,可有效解决多终端数据一致性问题。核心原则包括:
- 非关键业务采用最终一致性(如用户通知)。
- 关键业务强制强一致性(如库存扣减)。
- 离线能力与冲突解决机制保障弱网环境可用性。
通过持续监控与优化,可确保系统在复杂业务场景下稳定运行,提升商家与供应商的协作效率。