You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 22:50:29