系统概述
小象买菜系统是一个支持多端(Web、App、小程序、后台管理等)同步的生鲜电商平台,核心目标是实现各终端数据实时一致,提供无缝的用户体验。
多端数据同步核心架构
1. 数据同步技术选型
- 实时通信层:WebSocket + MQTT协议组合
- WebSocket用于浏览器端实时通信
- MQTT用于移动端轻量级实时通信
- 协议转换网关实现两者互通
- 数据同步策略:
- 操作转换(OT)算法处理并发编辑冲突
- 状态向量同步机制确保数据一致性
- 增量同步减少数据传输量
2. 后端服务设计
```
┌───────────────────────────────────────┐
│ API网关 │
└───────────────┬───────────────┘
│
┌───────────────▼───────────────┐
│ 同步服务集群(Sync) │
│ - 同步协议解析 │
│ - 冲突检测与解决 │
│ - 同步日志记录 │
└───────────────┬───────────────┘
│
┌───────────────▼───────────────┐
│ 业务服务集群 │
│ - 商品服务 │
│ - 订单服务 │
│ - 用户服务 │
│ - 库存服务 │
└───────────────┬───────────────┘
│
┌───────────────▼───────────────┐
│ 数据存储层 │
│ - MySQL(主库) │
│ - Redis(缓存/同步队列) │
│ - Elasticsearch(搜索) │
└───────────────────────────────┘
```
3. 关键同步场景实现
商品信息同步
```javascript
// 示例:商品更新同步流程
async function updateProduct(productId, updates) {
// 1. 更新主数据库
await db.transaction(async (tx) => {
await tx.update(products, updates, {id: productId});
// 2. 生成同步消息
const changeSet = generateChangeSet(productId, updates);
// 3. 发布到同步总线
await syncBus.publish(`product:${productId}`, changeSet);
// 4. 记录同步日志
await logSyncOperation(productId, update, changeSet);
});
// 5. 触发Webhook通知第三方系统
await notifyThirdParties(productId, updated);
}
```
购物车同步
- 实现策略:
- 本地存储+云端同步双模式
- 离线操作队列,网络恢复后批量同步
- 最终一致性保证
```javascript
// 购物车同步实现
class ShoppingCartSync {
constructor() {
this.localCart = loadLocalCart();
this.syncQueue = [];
this.isSyncing = false;
this.initWebSocket();
}
async addItem(item) {
// 1. 更新本地
this.localCart.addItem(item);
saveLocalCart(this.localCart);
// 2. 加入同步队列
this.syncQueue.push({
type: add,
item,
timestamp: Date.now()
});
// 3. 尝试同步
this.trySync();
}
async trySync() {
if (this.isSyncing || !navigator.onLine) return;
this.isSyncing = true;
const batch = this.syncQueue.splice(0, 10);
try {
await fetch(/api/cart/sync, {
method: POST,
body: JSON.stringify(batch)
});
// 同步成功处理
} catch (error) {
// 同步失败处理
this.syncQueue.unshift(...batch);
} finally {
this.isSyncing = false;
if (this.syncQueue.length > 0) {
setTimeout(() => this.trySync(), 1000);
}
}
}
initWebSocket() {
const ws = new WebSocket(wss://sync.xiaoxiang.com/cart);
ws.onmessage = (event) => {
const {type, data} = JSON.parse(event.data);
if (type === cart_update) {
this.mergeRemoteChanges(data);
}
};
}
mergeRemoteChanges(remoteCart) {
// 实现OT算法合并变更
const merged = otMerge(this.localCart, remoteCart);
this.localCart = merged;
saveLocalCart(merged);
}
}
```
冲突解决机制
1. 最后写入优先(LWW):简单场景下使用时间戳决定
2. 操作转换(OT):复杂编辑场景使用
3. 自定义合并策略:
- 购物车商品数量合并取最大值
- 地址信息部分字段优先(如默认地址标志)
性能优化措施
1. 同步数据压缩:使用MessagePack或Protocol Buffers
2. 增量同步:只传输变更部分
3. 批量处理:合并短时间内多个操作为一个同步包
4. 智能重试:指数退避算法处理网络不稳定
5. 本地缓存:关键数据本地持久化
监控与运维
1. 同步延迟监控:
- 实时计算各端数据版本差
- 设置阈值告警(如>5秒)
2. 同步成功率统计:
- 按端类型、操作类型统计
- 失败自动重试队列
3. 日志审计:
- 完整记录所有同步操作
- 支持回溯特定数据变更历史
实施路线图
1. 第一阶段:实现核心业务数据同步(商品、订单、用户)
2. 第二阶段:完善购物车、收藏夹等用户状态同步
3. 第三阶段:优化冲突解决机制,提升离线体验
4. 第四阶段:实现跨平台通知系统
技术挑战与解决方案
1. 移动网络不稳定:
- 实现断点续传
- 本地队列持久化
2. 多端时间不同步:
- 使用混合时钟(客户端时钟+服务器时钟)
- 逻辑时钟算法处理
3. 大数据量同步:
- 分页同步机制
- 关键数据优先同步
4. 安全考虑:
- 端到端加密
- 同步权限控制
- 操作审计日志
通过以上架构设计,小象买菜系统能够实现各端数据实时、准确同步,为用户提供一致的购物体验,同时保证系统的高可用性和可扩展性。