请选择 进入手机版 | 继续访问电脑版

默认
发表评论 6
关于自已开发的IM服务端管理存活channel时,如何判断连接是否失效的办法
public ConcurrentHashMap<String,Channel> pcChannels = new ConcurrentHashMap<>();//保存pc端的channel
public ConcurrentHashMap<String,Channel> webChannels = new ConcurrentHashMap<>();//保存web端的channel

public ConcurrentHashMap<String,Long> heartbeat = new ConcurrentHashMap<>();//将存活的连接保存起来现在的问题是这样存的话,如果客户端异常离线,服务端如何知道,map如何清除已经失效的连接
我现在的做法是,接受到客户端的心跳消息就修改heartbeat的时间戳。在服务端开启一个定时任务,定时循环heartbeat
如果心跳时间戳超过3分钟没有接受到某个连接的心跳消息,就把三个map里的对应key的数据清除。这样做是不是不妥啊。
常规操作是怎么样的。

即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

标签:IM开发
上一篇:用netty的websocket开发IM,收到ContinuationWebSocketFrame该如何处理?下一篇:IM开发基础知识补课(一):正确理解前置HTTP SSO单点登陆接口的原理
推荐方案
评论 6
如果定时任务挂了,大量的僵尸连接会占用资源。
定时任务短时间执行大量的循环,对服务器资源会不会消耗过大。
引用:淘序员 发表于 2018-01-11 19:14
如果定时任务挂了,大量的僵尸连接会占用资源。
定时任务短时间执行大量的循环,对服务器资源会不会消耗过 ...

你用的是Netty框架吗?如果是Netty框架的话,服务端的会话心跳检查和超时检测不需要你自已写,你自已写先不说是不是最佳实践,可靠性什么的肯定没有Netty内置的好,具体如何使用,你可以参考MobileIMSDK框架的服务端netty版源码,只要配置一下即可,就像下面这样:
1.png
签名: 《IM开发基础知识:正确理解前置HTTP SSO单点登陆接口的原理》http://www.52im.net/thread-1351-1-1.html
引用:JackJiang 发表于 2018-01-11 19:32
你用的是Netty框架吗?如果是Netty框架的话,服务端的会话心跳检查和超时检测不需要你自已写,你自已写先 ...

ch.pipeline().addLast(new IdleStateHandler(0, 0, 60 * 10));
这个方法是不是也能设置?
引用:淘序员 发表于 2018-01-11 21:54
ch.pipeline().addLast(new IdleStateHandler(0, 0, 60 * 10));
这个方法是不是也能设置?

看样子应该可以,但我没用过IdleStateHandler
签名: 《IM开发基础知识:正确理解前置HTTP SSO单点登陆接口的原理》http://www.52im.net/thread-1351-1-1.html
引用:淘序员 发表于 2018-01-11 21:54
ch.pipeline().addLast(new IdleStateHandler(0, 0, 60 * 10));
这个方法是不是也能设置?

当然可以,

检测空闲连接和超时是为了及时释放资源。常见的方法发送消息用于测试一个不活跃的连接来,通常称为“心跳”,到远端来确定它是否还活着。(一个更激进的方法是简单地断开那些指定的时间间隔的不活跃的连接)。
处理空闲连接是一项常见的任务,Netty 提供了几个 ChannelHandler 实现此目的。IdleStateHandler就是常用的方法。
这里有个连接讲的更详细
https://waylau.gitbooks.io/essen ... and%20Timeouts.html
引用:mw-im 发表于 2018-01-12 16:28
当然可以,

检测空闲连接和超时是为了及时释放资源。常见的方法发送消息用于测试一个不活跃的连接来, ...

赞!
签名: 《IM开发基础知识:正确理解前置HTTP SSO单点登陆接口的原理》http://www.52im.net/thread-1351-1-1.html
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部