netty心跳检测 heartbeat(五)

HeartBeat心跳

心跳检测的必要性 

1.集群心跳检测,避免网络中断

2.数据同步:主节点写日志,从节点每隔一段时间拉取主节点日志。

心跳检测存在的意义:

客户端和服务端已经建立了长连接,客户端开飞行模式,关机,关闭wifi,服务端不会(感知)收到通知(handRemoved)并关闭连接。

核心事件 :

ChannelInboundHandlerAdapter类的userEventTriggered事件

心跳检测服务端代码 :

server启动类 :

 1 public class HeartBeatServer {
 2
 3     public static void main(String[] args) throws InterruptedException {
 4
 5         EventLoopGroup bossGroup = new NioEventLoopGroup();
 6         EventLoopGroup workerGroup = new NioEventLoopGroup();
 7
 8         try{
 9             ServerBootstrap serverBootstrap = new ServerBootstrap();
10             serverBootstrap.group(bossGroup,workerGroup).
11                     channel(NioServerSocketChannel.class)
12                     .handler(new LoggingHandler(LogLevel.INFO))
13                     .childHandler(new MyHeartBeatInitializer());
14
15             ChannelFuture channelFuture = serverBootstrap.bind(8899).sync();
16             channelFuture.channel().closeFuture().sync();
17         }finally {
18             bossGroup.shutdownGracefully();
19             workerGroup.shutdownGracefully();
20         }
21
22     }
23
24 }

心跳检测初始化类 :

 1 public class MyHeartBeatInitializer extends ChannelInitializer<SocketChannel> {
 2     @Override
 3     protected void initChannel(SocketChannel ch) throws Exception {
 4
 5         ChannelPipeline channelPipeline = ch.pipeline();
 6
 7         channelPipeline.addLast(new IdleStateHandler(3,7,10, TimeUnit.SECONDS));
 8         channelPipeline.addLast(new MyHeartBeatHandler());
 9
10     }
11 }

心跳检测逻辑处理handler:

 1 public class MyHeartBeatHandler extends ChannelInboundHandlerAdapter {
 2
 3     @Override
 4     public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
 5
 6         if(evt instanceof IdleStateEvent){
 7             IdleStateEvent idleStateEvent = (IdleStateEvent)evt;
 8
 9             String eventType = null;
10
11             switch (idleStateEvent.state()){
12                 case READER_IDLE:
13                     eventType = "读空闲";
14                     break;
15                 case WRITER_IDLE:
16                     eventType = "写空闲";
17                     break;
18                 case ALL_IDLE:
19                     eventType = "读写空闲";
20                     break;
21
22             }
23
24             System.out.println(ctx.channel().remoteAddress()+" 超时事件:"+eventType);
25
26             ctx.channel().close();
27         }
28
29     }
30 }
时间: 2024-10-10 04:21:01

netty心跳检测 heartbeat(五)的相关文章

Netty实现服务端客户端长连接通讯及心跳检测

通过netty实现服务端与客户端的长连接通讯,及心跳检测.        基本思路:netty服务端通过一个Map保存所有连接上来的客户端SocketChannel,客户端的Id作为Map的key.每次服务器端如果要向某个客户端发送消息,只需根据ClientId取出对应的SocketChannel,往里面写入message即可.心跳检测通过IdleEvent 事件,定时向服务端放送Ping消息,检测SocketChannel是否终断.         环境JDK1.8 和netty5      

Netty实践(四):心跳检测实现

心跳检测的概念 在分布式架构中,比如Hadoop集群,Storm集群等,或多或少都涉及到Master/Slave的概念,往往是一个或者多个Master和N个Slave之间进行通信.那么通常Master应该需要知道Slave的状态,Slave会定时的向Master进行发送消息,相当于告知Master:"我还活着,我现在在做什么,什么进度,我的CPU/内存情况如何"等,这就是所谓的心跳.Master根据Slave的心跳,进行协调,比如Slave的CPU/内存消耗很大,那么Master可以将

通过netty实现服务端与客户端的长连接通讯,及心跳检测。

基本思路:netty服务端通过一个Map保存所有连接上来的客户端SocketChannel,客户端的Id作为Map的key.每次服务器端如果要向某个客户端发送消息,只需根据ClientId取出对应的SocketChannel,往里面写入message即可.心跳检测通过IdleEvent 事件,定时向服务端放送Ping消息,检测SocketChannel是否终断. 环境JDK1.8 和netty5 以下是具体的代码实现和介绍: 1公共的Share部分(主要包含消息协议类型的定义) 设计消息类型:

Netty之心跳检测技术(四)

Netty之心跳检测技术(四) 一.简介 "心跳"听起来感觉很牛X的样子,其实只是一种检测端到端连接状态的技术.举个简单的"栗子",现有A.B两端已经互相连接,但是他们之间很长时间没有数据交互,那么A与B如何判断这个连接是否可用呢?我们通常的做法就是,让任何一方,例如我们让A端,定时的发送(例如每5秒钟)一句问候"Are you ok?",如果B都到来自A的问候,回了一句"GUN",A收到了来自B的信息,也不在乎B到底给我回了

使用netty开发心跳检测和重连机制的规划与设计

心跳检测 代码逻辑与设计思路 方案1 1.1心跳机制 通过ping-pong双向心跳机制 可以保证无论通信哪一方出现网络故障,都能被及时检测出来 为了防止由于对方短时间内繁忙没有及时返回应答造成的误判,只有连续N次心跳检测都失败才认定链路已经损害,需要关闭链路并重建链路.当读或者写心跳消息发生I/O异常的时候,说明链路已经中断,此时需要立即关闭链路,如果是客户端,需要重新发起连接.如果是服务端,需要重新发起连接.如果是服务端,需要清空缓存的半包信息,等待客户端重连. 1.2重连机制 如果链路中断

NETTY 心跳机制

最近工作比较忙,但闲暇之余还是看了阿里的冯家春(fengjiachun)的github上的开源代码Jupiter,写的RPC框架让我感叹人外有人,废话不多说,下面的代码全部截取自Jupiter,写了一个比较完整的例子,供大家一起学习分享,再次对@Luca抱拳,Jupiter的Github地址: https://github.com/fengjiachun/Jupiter 今天研究的是,心跳和重连,虽然这次是大神写的代码,但是万变不离其宗,我们先回顾一下Netty应用心跳和重连的整个过程: 1)客

windows cluster 心跳检测阀值优化

通过cmd命令Cluster.exe /prop查看当前群集的属性信息,其中心跳阀值相关属性: SameSubnetDelay:同一子网中的节点的测信号频率 SameSubnetThreshold: 同一子网中的节点的延迟的阈值 CrossSubnetDelay: 不同的子网中的节点的检测信号频率 CrossSubnetThreshold: 在不同的子网中的节点的延迟的阈值 SameSubnetDelay 默认代表每1秒执行一次Windows群集心跳检测,SameSubnetThreshold

心跳包(HeartBeat)

http://itindex.net/detail/52922-%E5%BF%83%E8%B7%B3-heartbeat-coderzh 几乎所有的网游服务端都有心跳包(HeartBeat或Ping)的设计,在最近开发手游服务端时,也用到了心跳包.思考思考,心跳包是必须的吗?为什么需要心跳包?TCP没有提供断线检测的方法吗?TCP提供的KeepAlive机制可以替代HeartBeat吗? 由于连接丢失时,TCP不会立即通知应用程序.比如说,客户端程序断线了,服务端的TCP连接不会检测到断线,而是

EF架构~通过EF6的DbCommand拦截器来实现数据库读写分离~再续~添加对各只读服务器的心跳检测

回到目录 上一讲中基本实现了对数据库的读写分离,而在选择只读数据库上只是随机选择,并没有去检测数据库服务器是否有效,如服务器挂了,SQL服务停了,端口被封了等等,而本讲主要对以上功能进行一个实现,并对配置文件也进行了一些优化,让它更好的支持多个数据库服务器,分别配置各个的账号和密码及数据库服务端口等等,接下来,就来看一下主要的代码吧. 一 配置文件 <!-- ef实现对sql读写分离的配置,sqlserver端采用发布与订阅实现 --> <add key="readDb&quo