在智能客服系统中,实时通信是核心功能之一。为了确保客服与用户之间的连接稳定可靠,心跳机制扮演着至关重要的角色。本文将深入分析CSS工程中如何通过心跳机制实现WebSocket连接保活和在线状态检测。
心跳机制的核心作用
心跳机制在智能客服系统中主要发挥两大作用:
-
连接保活:防止WebSocket连接因网络设备超时策略被自动断开
-
在线检测:实时监控客服端和客户端的在线状态,确保通信可靠性
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();
}
}
心跳机制的实际应用效果
-
连接稳定性提升:有效防止了因网络设备超时策略导致的连接断开
-
实时状态感知:客服可以实时了解客户的在线状态,提升服务质量
-
资源优化利用:及时清理无效连接,释放系统资源
-
用户体验改善:减少了意外断线导致的沟通中断问题
总结
CSS工程中的心跳机制通过精心设计的双向心跳检测、Redis分布式缓存和安全通信等技术手段,成功实现了WebSocket连接的可靠保活和在线状态的实时检测。这一机制为智能客服系统的稳定运行提供了坚实的技术保障,是系统架构中不可或缺的重要组成部分。
在构建类似的实时通信系统时,合理设计心跳机制是确保系统稳定性和可靠性的关键一步。CSS工程的实现方案为我们提供了一个值得参考的优秀范例。
欢迎大家积极留言共建,期待与各位技术大咖的深入交流!
此外,欢迎大家下载我们的inBuilder社区,可免费下载使用,加入我们,开启开发体验之旅!