
1) 【一句话结论】
构建前后端分离的移动端应用,通过WebSocket实现实时数据同步(含网络不稳定场景下的重连与离线缓存),采用RBAC+TLS 1.3+AES-256加密保障安全,并针对咨询顾问现场办公场景优化UI(卡片式布局、一键同步、离线优先)。
2) 【原理/概念讲解】
3) 【对比与适用场景】
| 方案 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| WebSocket | 基于TCP的长连接协议,支持双向实时通信 | 低延迟,双向交互,需维护连接状态 | 高频实时同步(如进度更新) | 需处理网络不稳定时的重连(如心跳包检测、自动重连) |
| Server-Sent Events (SSE) | 单向从服务器到客户端的流 | 简单实现,无需特殊协议 | 实时通知(如消息提醒) | 仅支持单向,不适合双向交互 |
| 轮询 | 客户端定期向服务器请求 | 实现简单,无需特殊协议 | 低频数据同步(如每5分钟更新一次) | 网络压力大,延迟高,不适合实时同步 |
| Node.js集群/负载均衡 | 多实例部署,负载均衡 | 高并发处理能力,高可用 | 高流量场景(如大量用户同时同步) | 需配置负载均衡器(如Nginx) |
4) 【示例】
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
let reconnectInterval = null;
wss.on('connection', (ws) => {
ws.on('open', () => {
console.log('WebSocket连接已建立');
clearInterval(reconnectInterval);
});
ws.on('close', () => {
console.log('WebSocket连接关闭,开始重连');
reconnectInterval = setInterval(() => {
try {
const newWs = new WebSocket('wss://api.deloitte.com/project-sync');
newWs.onopen = () => {
clearInterval(reconnectInterval);
console.log('重连成功');
};
} catch (e) {
console.error('重连失败');
}
}, 3000); // 每3秒重连一次
});
ws.on('message', (message) => {
// 处理消息
});
});
const socket = new WebSocket('wss://api.deloitte.com/project-sync');
socket.onopen = () => {
const localData = { data: { task: '完成需求分析' }, version: Date.now() }; // 版本号用时间戳
socket.send(JSON.stringify({ type: 'sync-local', data: localData }));
};
socket.onmessage = (event) => {
const data = JSON.parse(event.data);
if (data.type === 'update') {
const remoteData = data.content;
if (remoteData.version > localData.version) {
// 服务器数据更新,更新本地
localStorage.setItem('currentData', JSON.stringify(remoteData));
updateUI(remoteData);
}
}
};
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', (ws) => {
ws.on('message', (message) => {
const data = JSON.parse(message);
if (data.type === 'sync-local') {
processOfflineData(data.data);
}
});
});
function processOfflineData(data) {
const serverData = db.get('latestData');
if (data.version > serverData.version) {
// 本地离线数据更新,保存到数据库
db.save({ data: data.content, version: data.version });
// 广播更新
wss.clients.forEach(client => {
if (client.readyState === WebSocket.OPEN) {
client.send(JSON.stringify({ type: 'update', content: data.content, version: data.version }));
}
});
} else {
// 服务器数据更新,忽略本地离线数据
localStorage.setItem('currentData', JSON.stringify(serverData));
updateUI(serverData);
}
}
project-data-key,访问控制策略:
{
"Version": "2012-10-17",
"Id": "project-data-key-policy",
"Statement": [
{
"Sid": "AllowProjectManagerAccess",
"Effect": "Allow",
"Principal": {
"AWS": ["arn:aws:iam::123456789012:role/project-manager-role"]
},
"Action": ["kms:Decrypt", "kms:ReEncrypt*"],
"Resource": "arn:aws:kms:us-east-1:123456789012:key/project-data-key"
}
]
}
5) 【面试口播版答案】
“面试官您好,针对管理咨询项目进度跟踪的移动端应用设计,我的核心思路是构建前后端分离的系统,重点解决实时同步(网络不稳定)、数据安全(权限与加密)和顾问场景体验。系统架构上,前端用React Native,后端Node.js+Express。实时同步用WebSocket,支持长连接,通过心跳包检测连接,断线后自动重连,IndexedDB缓存离线数据,网络恢复时同步。数据安全方面,传输用TLS 1.3加密,敏感数据AES-256加密,密钥由KMS管理,RBAC控制权限(顾问仅操作自身任务)。用户体验针对现场办公,卡片式布局突出关键信息,一键同步,离线优先模式。这样既保证实时性,又保障安全,提升顾问使用效率。”
6) 【追问清单】
7) 【常见坑/雷区】