智能客服系统中的心跳机制:保活与在线检测的关键实现

0 阅读1分钟

在智能客服系统中,实时通信是核心功能之一。为了确保客服与用户之间的连接稳定可靠,心跳机制扮演着至关重要的角色。本文将深入分析CSS工程中如何通过心跳机制实现WebSocket连接保活和在线状态检测。

心跳机制的核心作用

心跳机制在智能客服系统中主要发挥两大作用:

  1. 连接保活:防止WebSocket连接因网络设备超时策略被自动断开

  2. 在线检测:实时监控客服端和客户端的在线状态,确保通信可靠性

CSS工程中心跳机制的实现架构

CSS工程采用了双向心跳设计,同时在客服端和客户端实现了心跳发送和检测机制。

1. 服务端心跳实现(客服端)

在ServiceWebSocket.java中,系统为每个客服连接启动定时心跳任务:

taskManager.startTask(this.userId, () -> {
    //1. 发送自身心跳
    sendSelfHeartbeat(this);

    // 2. 检查客户端心跳
    checkClientHeartbeats(this);
}, Duration.ofSeconds(30));

发送心跳包

心跳包发送逻辑核心在于创建特定类型的数据包并更新Redis中的心跳时间戳:

public static void sendSelfHeartbeat(ServiceWebSocket serviceWebSocket) {
    if (serviceWebSocket != null) {
        // 创建心跳数据包
        CsPackageDto cssPacket = CssWebSocketUtil.createCsPackage("", 
                          serviceWebSocket.getUserId(), 
                          serviceWebSocket.getCsUser().getName());
        cssPacket.setCtype("heartbeat");
        
        // 在Redis中记录心跳时间,设置35秒过期
        long currentTime = System.currentTimeMillis();
        redisUtil.set(RedisStorageConstant.SERVICE_LAST_HEARTBEAT + 
                      serviceWebSocket.getUserId(), currentTime, 35);
        
        // 加密并发送心跳包
        info = AesUtil.encrypt(gson.toJson(cssPacket));
        // 推送消息...
    }
}

检测客户端心跳

客服端会定期检查其负责的所有客户端的心跳状态:

private static void checkClientHeartbeats(ServiceWebSocket serviceWebSocket) {
    // 遍历客服负责的所有客户
    for (String customerId : serviceWebSocket.getCustomerList()) {
        // 检查Redis中是否存在该客户的心跳记录
        if (!redisUtil.hasKey(RedisStorageConstant.CUSTOMER_LAST_HEARTBEAT + customerId)) {
            log.warn("客户端 {} 心跳丢失", customerId);
            // 发送客户离开通知...
            // 更新会话状态...
        }
    }
}

2. 客户端心跳实现

在CustomerWebSocket.java中,系统同样为每个客户连接启动心跳任务:

taskManager.startTask(this.userId + "heartbeat", () -> {
    try {
        //1. 发送自身心跳
        sendSelfHeartbeat(this);

        // 2. 检查服务端心跳
        checkServerHeartbeat(this);
    } catch (Exception e) {
        logger.error("心跳任务异常", e);
        // 异常处理...
    }
}, Duration.ofSeconds(30));

3. 心跳超时处理机制

系统采用Redis的键过期机制来实现心跳超时检测:

  • 心跳时间戳在Redis中设置35秒过期时间

  • 心跳发送间隔为30秒,确保正常情况下键不会过期

  • 当客户端或客服端断开连接,心跳无法正常更新,键会在35秒后过期

  • 系统通过检查键是否存在来判断连接状态

4. 客户端心跳响应处理

在前端代码chat-customer.component.ts中,系统对接收到的心跳消息进行处理:

if (jsonData.ctype === 'heartbeat') {
  console.log('客户心跳包' + encifo);
  return;
}

心跳机制的关键设计要点

1. 分布式架构下的状态共享

CSS工程巧妙利用Redis作为分布式缓存,解决了在多服务器部署环境下的状态共享问题:

  • 所有服务器节点都可以访问Redis中的心跳信息

  • 即使客户和客服连接到不同的服务器节点,也能正确检测彼此的在线状态

  • 支持系统的水平扩展,提高并发处理能力

2. 安全通信保障

心跳机制在实现中考虑了安全性:

  • 心跳消息通过AES加密传输,保障通信安全

  • 使用同步锁机制确保并发环境下的消息发送安全

  • 心跳任务异常时会自动关闭连接,防止资源泄露

3. 优雅的资源管理

系统实现了心跳资源的优雅管理:

public static void cleanupResources(ScheduledFuture<?> heartbeatFuture, 
                                  ScheduledExecutorService heartbeatScheduler) {
    // 取消心跳任务
    if (heartbeatFuture != null) {
        heartbeatFuture.cancel(true);
    }
    if (heartbeatScheduler != null) {
        heartbeatScheduler.shutdownNow();
    }
}

心跳机制的实际应用效果

  1. 连接稳定性提升:有效防止了因网络设备超时策略导致的连接断开

  2. 实时状态感知:客服可以实时了解客户的在线状态,提升服务质量

  3. 资源优化利用:及时清理无效连接,释放系统资源

  4. 用户体验改善:减少了意外断线导致的沟通中断问题

总结

CSS工程中的心跳机制通过精心设计的双向心跳检测、Redis分布式缓存和安全通信等技术手段,成功实现了WebSocket连接的可靠保活和在线状态的实时检测。这一机制为智能客服系统的稳定运行提供了坚实的技术保障,是系统架构中不可或缺的重要组成部分。

在构建类似的实时通信系统时,合理设计心跳机制是确保系统稳定性和可靠性的关键一步。CSS工程的实现方案为我们提供了一个值得参考的优秀范例。

欢迎大家积极留言共建,期待与各位技术大咖的深入交流!

此外,欢迎大家下载我们的inBuilder社区,可免费下载使用,加入我们,开启开发体验之旅!