`

心跳机制 heartbeat

    博客分类:
  • java
阅读更多

       心跳机制可以分为集中式和分散式,简单说集中式就是A通过心跳告诉B自己还活着,C通过B来获得或者的A,这里面的A,B,C可以是一个集群,可以认为B是个服务发现的功能。这种方式广泛应用于hadoop,NameServer来管理哪些DataNode时活的,客户端存储数据要从nameserver中获取存储的datanode的位置。这种方式有弊端就是B会存在单点故障,当然也有方式解决,譬如zookeeper来充当B的角色,实现相对复杂,但是监控等比较容易,而且A不需要关心C到底哪些活的,B(相对简单)告诉A那个可用即可。

分散式:A 和 C 通过心跳来告诉C,A是活的。这种方式简单,譬如A是server端,有两台机器,C是client端,有10台机器,那么C定时向A发送心跳,来看A是否还活着,决定向那一台机器发送数据,这种简单,但是存在弊端,就是譬如A有10台机器,C有30台机器,单位时间那么就存在300个心跳,也就是存在了信令风暴。各有利弊,要看实际需求。

       从实现机制上看有两种,第一种如果链接是TCP那么可以采用TCP自带的keepalive选项,第二种就是应用程序自己控制。

       第一中TCP的keepalive,从名字可以看出,可以用来保持tcp链接的alive,tcp的keepalive有三个参数,tcp_keepalive_time 链接闲置多久发送keepalive的包

tcp_keepalive_probes 发送几个ack 包不回复当作连接死亡

tcp_keepalive_intvl 两个ack包间隔多久

centos默认值7200秒(2个小时,要不要这么蛋疼啊!)、9次、75秒,连接就有了一个时间窗口,如果发送的ack连续不回复,那么这个时间窗口就会越来越小,当变为零时,则认为该连接不可用。这里有一篇非常详细的介绍文章: http://tldp.org/HOWTO/html_single/TCP-Keepalive-HOWTO ,很多网络设备,由于硬件的限制(cpu,内存),尤其时NAT(network address Translations),无法保持其上的所有连接,因此必要的时候,会在连接池上选择一些不活跃的链接踢掉,典型的算法LRU,把最久没有数据的链接踢掉,通过tcp的keepalive机制,可以让连接每隔一个小时产生一个ack包,降低被T掉的风险,当然代价就是额外的网络和cpu负担。

       第二种就是应用程序自己控制,判断方法有两种,时间差策略和简单标志。时间差标志,当前时间-上次心跳时间 > 某个时间差,则认为该连接不可用。简单标志,当发送心跳,对面没有返回,则认为对方不可用。

拿netty的长连接举例,客户端和服务器创建了长连接,我们可以把它们的连接存到一个列表,在netty的handler种,我们定义new IdleStateHandler(60, 15, 13,TimeUnit.SECONDS)然后在某个handler种定义连接http://www.oschina.net/question/139577_146101,@Override

    public void userEventTriggered(ChannelHandlerContext ctx, Object evt)
            throws Exception {
        if (evt instanceof IdleStateEvent) {
            IdleStateEvent event = (IdleStateEvent) evt;
            if (event.state().equals(IdleState.READER_IDLE)) {
                System.out.println("READER_IDLE");
                // 超时关闭channel
                ctx.close();
            } else if (event.state().equals(IdleState.WRITER_IDLE)) {
                System.out.println("WRITER_IDLE");
            } else if (event.state().equals(IdleState.ALL_IDLE)) {
                System.out.println("ALL_IDLE");
                // 发送心跳
                ctx.channel().write("ping\n");
            }
        }
        super.userEventTriggered(ctx, evt);
    }

这样来决定是否关闭channel,RocketMQ是这样做的。当下次在发送数据时,需要重新创建链接。

分享到:
评论

相关推荐

    Netty HelloWorld + HeartBeat Demo

    Netty入门,HelloWorld Demo 以及实现了心跳机制的HeartBeat Demo

    heartbeat心跳检测(CS)

    利用I/O复用机制撰写的简单心跳客户端和服务器。主要包括以下工作: 设计客户端和服务器之间交互的报文格式; 设计客户端,具有发送心跳和超时重发的功能; 设计服务器,具有接收心跳和其他程序的能力,具有超时重发...

    TCP协议的KeepAlive机制与HeartBeat心跳包.docx

    KeepAlive

    QT_HeartBeat.rar

    QT中TCP连接中的心跳机制和断线重连,通过简单的代码让刚入门的初级程序员更容易的了解网络通信中的心跳机制,和客户端断线重连机制

    小程序websocket心跳库(websocket-heartbeat-miniprogram)

    在16年的时候因为项目接触到websocket,而后对心跳重连做了一次总结,写了篇博客,而后18年对之前github上的demo代码进行了再次开发和开源,最终封装成库。如下: github: ...

    Rabbitmq heartbea心跳检测机制原理解析

    heartbeat通常用来检测通信的对端是否存活(未正常关闭socket连接而异常crash)。其基本原理是检测对应的socket连接上数据的收发是否正常,如果一段时间内没有收发数据,则向对端发送一个心跳检测包,如果一段时间内...

    HeartBeatServer.rar

    编程语言:C#,功能:网络编程中,一旦双方建立连接,理想情况下,在任意一方没有断开连接时,TCP应该都是活跃的,由于网络问题,可能会导致一方的连接丢失了,而另一方还在不停的发送数据,...因此需要引入心跳机制。

    netty-action:Netty长链接、服务器主动推送消息、Netty心跳机制

    netty-action Netty 实战相关 安装 ...cd netty-action mvn -Dmaven.test.skip=true clean package 启动 -- 启动 SBA java -jar springboot-admin-1.0.0-...java -jar netty-action-heartbeat-client-1.0.0-SNAPSHOT.

    websocket-heartbeat-js:简单而有用

    websocket-heartbeat-js 介绍websocket-heartbeat-js基于浏览器javascript的WebSocket ,其主要目的是确保Web客户端和服务器之间的连接,并具有心跳检测和自动重新连接的机制。 当客户端设备出现网络中断或服务器...

    威隆心跳「Wialon HeartBeat」-crx插件

    威隆统计推广 Wialon Hosting独特的GPS追踪系统将大量的功能与高运行速度和灵活的机制相结合,有效地实现了系统的定制化。 支持语言:English,русский

    The universal “heartbeat” oscillications in black hole systems accross the mass-scale

    不同尺度黑洞心跳现象的统一研究,吴庆文,Bozena Czerny,极亮X射线源HLX-1是最佳的中等质量黑洞后选体之一,大约每400天爆发一次。这种准周期性的爆发机制目前并不清楚,我们发现如果其黑洞质�

    NettyChat:基于Netty + TCP + Protobuf实现的Android IM库,包含Protobuf序列化,TCP拆包与粘包,长连接握手认证,心跳机制,断线重连机制,消息重发机制,读写超时机制,离线消息,螺纹池等功能

    使用方式1. 依赖im_lib库,implementation project(':im_lib')2. 自定义IMSEventListener,实现OnEventListener,重写对应的方法配置参数3. 自定义IMSConnectStatusListener,实现IMSConnectStatusCallback,重现...

    Wialon HeartBeat-crx插件

    语言:English,русский wialon统计扩展名 wialon心跳 - 显示Wialon托管的状态和统计的扩展名。 WIALON托管独特的GPS跟踪系统结合了大量功能,具有高运行速度和灵活的机制,有效地实现了系统的定制。

    2017最新老男孩MySQL高级专业DBA实战课程全套【清晰不加密】,看完教程月入40万没毛病

    03-Heartbeat心跳连接介绍.avi 04-裂脑的概念讲解.avi 05-裂脑发生的多种原因介绍.avi 06-防止裂脑发生的8种秘籍01.avi 07-防止裂脑发生的8种秘籍02.avi 08-防止裂脑发生的8种秘籍03.avi 09-有关fence设备和仲裁机制...

    通俗易懂的Netty从入门到源码剖析教程

    还对Netty的核心技术进行了源码剖析(包括: Netty心跳(heartbeat)服务、EventLoop源码、任务提交到异步线程池、Pipeline Handler HandlerContext创建源码、Netty启动过程源码、bossGroup和workerGroup机制源码等)。

    PlusWell热备软件

    PlusWell Cluster容错软件在集群节点间保持着间歇的通信信号,也叫做心跳信号,是错误检测的一个机制。即通过每一个通信路径,在两个对等系统之间进行周期性的握手,如果连续没有收到的心跳信号到了一定的数目,...

    论文研究-iSCSI高可用存储解决方案的设计和实现.pdf

    介绍了心跳传输机制和iSCSI协议的原理和实现。以成熟的开源软件Hearbeat和 UNH iSCSI软件为基础,在Linux操作系统平台上设计和实现了一套在广域网下基于iSCSI技术的高可用存储解决方案,从而为中小企业关键业务提供...

    JINI 核心技术

    14.6.4 编译并运行Heartbeat例子 355 14.7 第三方事件代管程序 358 14.7.1 设计为可组合 358 14.7.2 实际应用组合 359 14.7.3 如何通过管道传送事件 359 14.7.4 建立管道 360 14.7.5 接收器角度的管道 361 14.7.6 ...

    JINI核心技术

    14.6.4 编译并运行Heartbeat例子 355 14.7 第三方事件代管程序 358 14.7.1 设计为可组合 358 14.7.2 实际应用组合 359 14.7.3 如何通过管道传送事件 359 14.7.4 建立管道 360 14.7.5 接收器角度的管道 361 14.7.6 ...

    03开源NewSql数据库TiDB-Deep Dive into TiDB

    优化热点调度机制,统计更多的信息,并根据这些信息做更合理的调度;优化 RocksDB 的性能,使用 DeleteFilesInRanges 等特性,提升空间回收效率,降低磁盘负载,以及更加平滑地使用磁盘资源等等。 OLAP 性能优化 ...

Global site tag (gtag.js) - Google Analytics