如何在Node.js路由应用中实现带超时的Agent邀请握手机制
Node.js 无数据库会话邀请超时处理实现方案
核心思路
采用内存存储(原生Map结构)临时保存待确认的会话邀请,配合setTimeout实现30秒超时逻辑,收到Agent确认时及时清理定时器与内存记录,全程不依赖数据库。
具体实现步骤
1. 定义内存存储结构
在路由应用中初始化两个核心内存容器:
// 存储待确认的会话邀请:key=会话ID,value=邀请详情(AgentID、定时器ID等) const pendingInvitations = new Map(); // 维护在线Agent的Socket连接:key=AgentID,value=Socket实例 const agentSockets = new Map();
2. 发送邀请并启动超时定时器
当分配会话给Agent时,执行以下逻辑:
function sendChatInvitation(sessionId, agentId, sessionDetails) { const agentSocket = agentSockets.get(agentId); if (!agentSocket) return; // 通过Socket推送聊天邀请给Agent agentSocket.emit('chat-invitation', { sessionId, sessionDetails }); // 启动30秒超时定时器 const timeoutTimer = setTimeout(() => { // 超时后清理记录,触发重路由 pendingInvitations.delete(sessionId); rerouteSession(sessionId); // 你已实现的重路由函数 }, 30000); // 将邀请信息存入内存 pendingInvitations.set(sessionId, { agentId, timerId: timeoutTimer, sessionDetails }); }
3. 处理Agent确认请求
在路由应用的POST端点中处理Agent的确认消息:
// 示例用Express框架实现POST端点 app.post('/agent/confirm-invitation', (req, res) => { const { sessionId, agentId } = req.body; const pendingInvite = pendingInvitations.get(sessionId); // 校验邀请有效性 if (!pendingInvite || pendingInvite.agentId !== agentId) { return res.status(400).json({ success: false, message: '无效的邀请确认' }); } // 清除超时定时器 clearTimeout(pendingInvite.timerId); // 移除待确认记录 pendingInvitations.delete(sessionId); // 更新会话状态(你已有的业务逻辑) updateSessionStatus(sessionId, `会话已分配至${agentId} Agent`); res.status(200).json({ success: true }); });
4. Agent离线时的清理逻辑
监听Agent Socket断开事件,及时清理该Agent相关的待确认邀请:
// 绑定Agent Socket断开事件 agentSocket.on('disconnect', () => { // 遍历清理该Agent对应的所有待确认邀请 for (const [sessionId, invite] of pendingInvitations.entries()) { if (invite.agentId === agentId) { clearTimeout(invite.timerId); pendingInvitations.delete(sessionId); rerouteSession(sessionId); } } agentSockets.delete(agentId); });
注意事项
- 单进程限制: 内存存储仅适用于单进程部署,多进程场景需改用Redis等内存中间件(但符合你禁止数据库的要求)
- 进程重启风险: 内存数据会随进程重启丢失,建议搭配PM2等进程守护工具,重启时自动重路由未处理会话
- 并发安全: Node.js单线程环境下
Map操作天然安全,无需额外锁机制
内容的提问来源于stack exchange,提问作者shivam
相关产品推荐
相关产品推荐

