• <source id="sqj45"><optgroup id="sqj45"></optgroup></source>
  • <rt id="sqj45"></rt>
    <rt id="sqj45"></rt><rt id="sqj45"></rt>
  • <source id="sqj45"><nav id="sqj45"></nav></source><rt id="sqj45"></rt><rt id="sqj45"></rt><tt id="sqj45"><noscript id="sqj45"></noscript></tt>
    專業 靠譜 的軟件外包伙伴

    您的位置:首頁 > 新聞動態 > 互聯網系統通信架構設計開發案例-基于Netty

    互聯網系統通信架構設計開發案例-基于Netty

    2017-08-23 13:57:45

     

    基于Netty的通信框架可靠性設計

    在客戶端和服務端進行網絡通信時,網絡閃斷、網絡超時、通信對端宕機等故障時有發生,為了保證異常場景下系統的可用性,通信框架必須具有很高的可靠性。

    1.鏈路有效性檢測

    從技術層面來看,要解決鏈路的可靠性問題,必須周期性的對鏈路進行有效性檢測。目前最流行和通用的做法就是心跳檢測。

    心跳檢測機制分為三個層面:

    • TCP層面的心跳檢測,即TCP的Keep-Alive機制,他的作用域是整個TCP協議棧

    • 協議層的心跳檢測,主要存在于長連接協議中,例如SMPP協議

    • 應用層的心跳檢測,他主要由各業務產品通過約定方式定時給對方發送心跳消息實現

    心跳檢測的目的就是確認當前鏈路可用,對方或者并且能夠正常接收和發送消息。作為高可靠的NIO框架,Netty也提供了心跳檢測機制。

    不同的協議,心跳檢測機制也存在差異,歸納起來主要分為兩類:

    • Ping-Pong型心跳:由通信一方定時發送Ping消息,對方接收到Ping消息之后,立即返回Pong應答消息給對方,屬于請求-響應型心跳。

    • Ping-Ping型心跳:不區分心跳請求和應答,由通信雙方按照約定定時向對方發送心跳Ping消息,它屬于雙向心跳。

    心跳檢測策略如下:

    • 聯系N次心跳檢測都沒有收到對方的Pong應答消息或Ping請求消息,則認為鏈路已經發生邏輯失效,這杯稱作心跳超時。

    • 讀取和發送心跳消息的時候如果直接發生了IO異常,說明鏈路已經失效,這被稱為心跳失敗。

    無論發生心跳超時還是心跳失敗,都需要關閉鏈路,由客戶端發起重連操作,保證鏈路能夠恢復正常。

    Netty的心跳檢測實際上是利用了鏈路空閑檢測機制實現的,他的空閑檢測機制分為三種:

    • 讀空閑,鏈路持續時間t沒有讀取到任何消息

    • 寫空閑,鏈路持續時間t沒有發送任何消息

    • 讀寫空閑,鏈路持續時間t沒有接收或者發送任何消息

    2.斷連重連機制

    當發生如下異常時,客戶端需要釋放資源,重新發起連接:

    • 服務端因為某種原因,主動關閉連接,客戶端檢測到鏈路被正常關閉

    • 服務端因為宕機等故障,強制關閉連接,客戶端檢測到鏈路被Reset掉

    • 心跳檢測超時,客戶端主動關閉連接

    • 客戶端因為其他原因,強制關閉連接

    • 網絡類故障,例如網絡丟包、超時、單通等,導致鏈路中斷

    客戶端檢測到鏈路中斷后,等到INTERVAL時機,由客戶端發起重連操作,如果重連失敗,間隔周期INTERVAL后再次發起重連,直到重連成功。

    為了保證服務端能夠有充足的時間釋放句柄資源在首次斷連時客戶端需要等到INTERVAL時機之后再發起重連,而不是失敗后就立即重連。

    為了保證句柄資源能夠及時釋放,無論什么場景下的重連失敗,客戶端都必須保證自身資源被及時釋放,包括但不限于SocketChannel、Socket等。重連失敗后,需要打印異常堆棧信息,方便后續的問題定位。

    3.消息緩存重發

    當我們調用消息發送接口的時候,消息并沒有真正被寫入到Socket中,而是先放入NIO通信框架的消息發送隊列中,由Reactor線程掃描待發送的消息隊列,異步發送給通信對端。假設消息隊列中積壓了部分消息,此時鏈路中斷,這回導致部分消息并沒有真正發送給通信對端。

    發生此故障時,我們希望NIO框架能夠自動實現消息緩存和重新發送,遺憾的是作為基礎的NIO通信框架,無論是Mina還是Netty,都沒有提供該功能,需要通信框架自己封裝實現,基于Netty的實現策略如下:

    • 調用Netty ChannelHandlerContext的write()方法時,返回ChannelFuture對象,我們在ChannelFuture中注冊發送結果監聽Listener。

    • 在Listener的operationComplete方法中判斷操作結果,如果操作不成功,將之前發送的消息對象添加到重發隊列中。

    • 鏈路重連成功后,根據策略,將緩存隊列中的消息重新發送給通信對端。

    4.資源優雅釋放

    Java的優雅停機通常通過注冊JDK的ShutdownHook實現,當系統接收到退出指令后,首先標記系統處于退出狀態,不再接收新的消息,然后將積壓的消息處理完,最后調用資源回收接口將資源銷毀,最后各線程退出執行。

    通常優雅退出有個時間限制,例如30s,如果到達執行時間仍然沒有完成退出前的操作,則由監控腳本直接kill -9 pid,強制退出。

    Netty提供了完善的優雅停機接口shutdownGracefully,通過調用相關接口,可以實現線程池、消息隊列、Socket句柄、多路復用器等的資源釋放。

     

    關于:中科研拓

    深圳市中科研拓科技有限公司專注提供軟件+硬件結合系統解決方案定制開發服務,其中包括:軟件外包、軟件開發、軟件定制、硬件開發、硬件定制、智能硬件開發、物聯網項目等開發外包服務,通過IT技術實現創造客戶和社會的價值,成為優秀的軟件公司,通過客戶需求導向、開放式創新、卓越運營管理等戰略的實施,全面打造公司的核心競爭力。優秀軟件外包公司、軟件開發公司,聯系電話400-0316-532,郵箱sales@zhongkerd.com,網址www.ruige-europe.com


      上一篇   [返回首頁] [打印] [返回上頁]   下一篇
    香蕉97超级碰碰碰免费公开
  • <source id="sqj45"><optgroup id="sqj45"></optgroup></source>
  • <rt id="sqj45"></rt>
    <rt id="sqj45"></rt><rt id="sqj45"></rt>
  • <source id="sqj45"><nav id="sqj45"></nav></source><rt id="sqj45"></rt><rt id="sqj45"></rt><tt id="sqj45"><noscript id="sqj45"></noscript></tt>