欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Nett中的心跳機制與斷線重連詳解

 更新時間:2023年12月21日 10:01:14   作者:Colins~  
這篇文章主要介紹了Nett中的心跳機制與斷線重連詳解,我們以客戶端發(fā)送心跳為例,平時我們的心跳實現(xiàn)方式可能是搞個定時器,定時發(fā)送是吧,但是在Netty中卻不一樣,心跳被稱為空閑檢測,需要的朋友可以參考下

心跳機制

我們以客戶端發(fā)送心跳為例,平時我們的心跳實現(xiàn)方式可能是搞個定時器,定時發(fā)送是吧,但是在Netty中卻不一樣,心跳被稱為空閑檢測,因為心跳的最主要作用就是判斷是否存活、是否假死等情況,所以Netty中并不是定時發(fā)送,而是空閑的情況下才發(fā)送,空閑指的是一段時間內無讀寫事件的發(fā)生,也就是沒有信息接收和信息發(fā)送啦,這時候我就要檢測一下了

所以Netty的機制就是通過監(jiān)測一段時間內是否有信息的讀、寫發(fā)生,然后產(chǎn)生一個事件,我們可以處理這個事件來達到我們的目的

IdleStateHandler

心跳與其他的數(shù)據(jù)處理Handler一樣,都是建立連接后的數(shù)據(jù)處理,所以同樣都是處理管道中的,IdleStateHandler就是Netty幫我們封裝好了的處理類,我們可以直接使用并將它放入管道中,就可以自動檢測一段時間內是否有讀、寫發(fā)生了,常用的構造有4個參數(shù):

  • readerIdleTime:讀事件檢測,該時間內沒有信息讀取就會產(chǎn)生一個讀信息的事件
  • writerIdleTime:寫事件檢測,該時間內沒有信息發(fā)送就會產(chǎn)生一個寫信息的事件
  • allIdleTime:讀寫事件檢測,該時間內沒有信息發(fā)送或者讀取就會產(chǎn)生一個讀寫信息的事件
  • unit:時間單位
public IdleStateHandler(long readerIdleTime, long writerIdleTime, long allIdleTime, TimeUnit unit) {
    this(false, readerIdleTime, writerIdleTime, allIdleTime, unit);
}

使用:

// 管道中直接添加
// 時間配置為0則代表不檢測對應事件
channel.pipeline().addLast(new IdleStateHandler(5,0,0, TimeUnit.SECONDS))

觸發(fā)的事件類型:

  • IdleState.READER_IDLE:讀信息的事件
  • IdleState.WRITER_IDLE:寫信息的事件
  • IdleState.ALL_IDLE:讀寫信息的事件

舉個例子:假設我們是客戶端主動發(fā)送心跳,那客戶端就要檢測一段時間內是否有寫信息的操作,如果沒有就會觸發(fā)IdleState.WRITER_IDLE事件,那我們監(jiān)聽這個事件,就做出自己的處理,那就是主動發(fā)送心跳包嘛

下面我們就以客戶端發(fā)送心跳包為例!

客戶端

像上面那樣直接使用IdleStateHandler,那還需要單獨寫一個事件處理的類,所以這里我們直接繼承IdleStateHandler

ClientHeartbeatHandler 如下:

我們設置5秒,5秒內沒有寫過信息,我們就發(fā)送心跳包(這里消息很隨意,圖方便)

@Slf4j
public class ClientHeartbeatHandler extends IdleStateHandler {
    // 設置寫事件為5s
    // 如果5s沒有寫事件發(fā)生 就會觸發(fā)下面的IdleStateEvent
    private static final int WRITE_IDLE_TIME = 5;
    public ClientHeartbeatHandler() {
        super(0, WRITE_IDLE_TIME, 0, TimeUnit.SECONDS);
    }
    @Override
    protected void channelIdle(ChannelHandlerContext ctx, IdleStateEvent evt) throws Exception {
        // 指定時間內沒有寫事件發(fā)送 就會觸發(fā) IdleState.WRITER_IDLE 類型事件
        // 我們就可以對該連接進行處理 主動發(fā)送心跳
        if(evt.state()== IdleState.WRITER_IDLE){
            log.info("{} 秒內沒有發(fā)送數(shù)據(jù),再不發(fā)送小心和服務端斷開連接", WRITE_IDLE_TIME);
            ctx.writeAndFlush(new NettyMsg(ServiceCodeEnum.TEST_TYPE,"我還活著,不要斷開連接"));
        }
    }
}

NettyClient

管道中加入這個即可,注意要放在編解碼之后

在這里插入圖片描述

服務端

基本跟客戶端一樣,但是由于是客戶端給我發(fā)心跳,所以服務端要監(jiān)測讀事件

ServerHeartbeatHandler

這里我們設置10s,一般會更多因為要給客戶端一些容忍度,適量就好,一旦沒滿足就和客戶端斷開連接

@Slf4j
public class ServerHeartbeatHandler extends IdleStateHandler {
    // 設置讀取事件為10s
    // 如果10s沒有讀事件發(fā)生 就會觸發(fā)下面的IdleStateEvent
    private static final int READER_IDLE_TIME = 10;
    public ServerHeartbeatHandler() {
        super(READER_IDLE_TIME, 0, 0, TimeUnit.SECONDS);
    }
    @Override
    protected void channelIdle(ChannelHandlerContext ctx, IdleStateEvent evt) throws Exception {
        // 指定時間內沒有讀事件發(fā)送 就會觸發(fā) IdleState.READER_IDLE 類型事件
        // 我們就可以對該連接進行處理 這里是直接關閉
        if(evt.state()== IdleState.READER_IDLE){
            log.info("{} 秒內沒有讀取到數(shù)據(jù),關閉連接", READER_IDLE_TIME);
            ctx.channel().close();
        }
    }
}

NettyServer

在這里插入圖片描述

測試

正常情況

服務端

在這里插入圖片描述

客戶端

在這里插入圖片描述

異常情況

我們將客戶端心跳拉長

在這里插入圖片描述

可以發(fā)現(xiàn)時間一到自動斷連

在這里插入圖片描述

總結

這里是以客戶端發(fā)送心跳為例,如果是以服務端發(fā)送心跳也是一樣,主要就是對讀寫事件的監(jiān)聽,然后做出相應處理,上面其實是很隨意的哈,正常情況下心跳包是會用專門的消息類型的,而且服務端也需要做出應答的,心跳應答也會有對應的消息類型

斷線重連

這個就很簡單了,肯定是斷線后,客戶端發(fā)起重連嘛,就是在客戶端檢測到連接斷開的時候,重新連接就好了

ClientHeartbeatHandler加上一段:

在這里插入圖片描述

看看效果,客戶端心跳時間還是12s哈

在這里插入圖片描述

能這么隨意嗎?當然不行啊,別學我,正常會搞多次重連,而且謹慎起見,每次重連還可以加一個時間的間隔,可以學一下nacos里面的高級玩法,隨著重連次數(shù)的增加,間隔重試的時間也隨之增加,比如:

第一次重連是4s,第二次重連是8s,第三次是16s,以此類推

也就是設置重連間隔時間基數(shù)為4s,每嘗試一次,左移一位(4<<1),連接成功后基數(shù)復位為4s

需要設置最大重試次數(shù),最長間隔時間(一直左移后面會很長時間,所以要設置一個上限,超過了就以上限為準)

偽代碼如下

    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        log.info(ctx.channel().remoteAddress() + " 已斷開連接,開始重連");
        int maxRetryNum=6; //最大重連次數(shù)
        int maxRetryTime=60; // 最大重連時間
        int baseRetryTime=4; // 間隔時間基數(shù)
        // 開始重連
        for (int i = 1; i <= maxRetryNum; i++) {
            log.info("第{}次重連,間隔{}s后開始",i,baseRetryTime > maxRetryTime ? maxRetryTime:baseRetryTime);
            ctx.channel().eventLoop().schedule(()->{
                // 重連操作
                // .......
                // 判斷是否超過隔間上限
            },baseRetryTime > maxRetryTime ? maxRetryTime:baseRetryTime,TimeUnit.SECONDS);
            // 左移擴大一倍
            baseRetryTime = baseRetryTime << 1;
        }
        log.info("這么多次重連都不行寄了吧");
    }

偽代碼哈,偽代碼!

結果如下

建立連接后,手動關閉服務端,可以看到重連了6次,每次間隔時間翻倍,達到間隔時間上限后,就以上限的時間為準

在這里插入圖片描述

到此這篇關于Nett中的心跳機制與斷線重連詳解的文章就介紹到這了,更多相關Nett心跳機制內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java調用騰訊云短信API接口的實現(xiàn)

    Java調用騰訊云短信API接口的實現(xiàn)

    這篇文章主要介紹了Java調用騰訊云短信API接口的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • Spring常見的事務失效場景及解決方案

    Spring常見的事務失效場景及解決方案

    Spring 事務管理是企業(yè)級應用開發(fā)中不可或缺的一部分,它可以幫助我們確保數(shù)據(jù)的一致性和完整性,然而,在實際開發(fā)中,由于各種原因,事務可能會失效,本文將詳細介紹 Spring 事務失效的常見情況,并提供相應的解決方案和示例代碼,需要的朋友可以參考下
    2024-11-11
  • Java同步鎖synchronized用法的最全總結

    Java同步鎖synchronized用法的最全總結

    這篇文章主要介紹了Java同步鎖synchronized用法的最全總結,需要的朋友可以參考下,文章詳細講解了Java同步鎖Synchronized的使用方法和需要注意的點,希望對你有所幫助
    2023-03-03
  • Java打印數(shù)組的三種方法整理

    Java打印數(shù)組的三種方法整理

    許多學編程專業(yè)的同學面試的時候,考官都會問到Java如何打印數(shù)組這樣的問題,下面這篇文章主要給大家介紹了關于Java打印數(shù)組的三種方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-06-06
  • java程序中foreach用法示例

    java程序中foreach用法示例

    這篇文章主要介紹了java程序中foreach用法示例,需要的朋友可以參考下
    2014-04-04
  • java設計模式-裝飾者模式詳解

    java設計模式-裝飾者模式詳解

    這篇文章主要介紹了Java設計模式之裝飾者模式詳解和代碼實例,Decorator模式(別名Wrapper):動態(tài)將職責附加到對象上,若要擴展功能,裝飾者提供了比繼承更具彈性的代替方案,需要的朋友可以參考下
    2021-07-07
  • SpringCloud之注冊中心之Nacos負載均衡詳解

    SpringCloud之注冊中心之Nacos負載均衡詳解

    Nacos提供多種負載均衡策略,包括權重、同機房、同地域、同環(huán)境等,服務下線和權重配置可以通過Nacos管理界面進行,同時,Nacos使用Raft算法選舉Leader節(jié)點,若IP地址改變可能會影響Leader選舉,配置同集群優(yōu)先訪問可以提高訪問速度,通過配置集群名稱和負載均衡策略
    2025-03-03
  • Spring控制Bean加載順序的操作方法

    Spring控制Bean加載順序的操作方法

    正常情況下,Spring 容器加載 Bean 的順序是不確定的,那么我們如果需要按順序加載 Bean 時應如何操作?本文將詳細講述我們如何才能控制 Bean 的加載順序,需要的朋友可以參考下
    2024-05-05
  • Java 在PPT中創(chuàng)建散點圖的實現(xiàn)示例

    Java 在PPT中創(chuàng)建散點圖的實現(xiàn)示例

    本文將以Java代碼示例展示如何在PPT幻燈片中創(chuàng)建散點圖表。文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Java調用DOS實現(xiàn)定時關機的實例

    Java調用DOS實現(xiàn)定時關機的實例

    Java調用DOS實現(xiàn)定時關機的實例,需要的朋友可以參考一下
    2013-04-04

最新評論