以下两种netty心跳的方案,做服务器端RPC我选第一个,你怎么看?

shuaia 发布于 2015/04/11 12:37
阅读 1K+
收藏 2

方案1:

服务器端或客户端都在写空闲时向对方发送心跳包,如果在指定的时间内发生读空闲则视为连接断开。初始化pipeline时读超时时间是写的3倍,避免网络延迟。此方案需要严格按照规则来送心跳,一旦任何一方收不到另一方发送数据即判断为连接断开。 代码片段大致如下:

IdleStateEvent event = (IdleStateEvent) evt;
if(READER_IDLE == event.state()) {
    log.debug("channel {} 超时",ctx.channel());
    ctx.channel().close();
}
if(WRITER_IDLE == event.state()) {
    log.debug("channel {},发送心跳.",ctx.channel());
    ctx.channel().writeAndFlush(Heartbeat.getSingleton());
}


方案2:

服务器端不向客户端发送,仅由客户端向服务端发送心跳。发送后给ChannelFuture绑定一个GenericFutureListener。当操作完成时去判断ChannelFuture是否成功。不成功则视为心跳检测失败。基于all_idle来实现。读和写都禁用。

代码片段大致如下:

ChannelFuture future = ctx.channel().writeAndFlush(Heartbeat.getSingleton());
log.debug("channel {},发送心跳.",future.channel());
future.addListener(new ChannelFutureListener() {
    public void operationComplete(ChannelFuture future) {
        if (future.isSuccess()) {
            log.debug("channel {},成功发送心跳包.",future.channel());
        } else {
            Channel channel = future.channel();
            Throwable cause = future.cause();
            log.warn("当前channel[{}]发送心跳包到远程失败.",
                     channel, cause);
            ctx.channel().close();
        }
    }
});





加载中
0
Monkey
Monkey
客户端发送不就行了,服务端何必增加额外的负担。
0
张山疯
张山疯
服务器都是空闲了,还为了省这点资源去发心跳包?
loyal
loyal
回复 @张山疯 : 看来你的逻辑只能到这了.
张山疯
张山疯
回复 @loyal : 逗,长连接服务哪儿闲置一说。
loyal
loyal
逗比.服务端连接了成千上万的客户端,你不能说一个客户端空闲了,服务端就空闲了.
返回顶部
顶部