日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Dubbo 优雅停机

發(fā)布時間:2025/1/21 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Dubbo 优雅停机 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

背景

對于任何一個線上應(yīng)用,如何在服務(wù)更新部署過程中保證客戶端無感知是開發(fā)者必須要解決的問題,即從應(yīng)用停止到重啟恢復(fù)服務(wù)這個階段不能影響正常的業(yè)務(wù)請求。理想條件下,在沒有請求的時候再進行更新是最安全可靠的,然而互聯(lián)網(wǎng)應(yīng)用必須要保證可用性,因此在技術(shù)層面上優(yōu)化應(yīng)用更新流程來保證服務(wù)在更新時無損是必要的。

傳統(tǒng)的解決方式是通過將應(yīng)用更新流程劃分為手工摘流量、停應(yīng)用、更新重啟三個步驟,由人工操作實現(xiàn)客戶端無對更新感知。這種方式簡單而有效,但是限制較多:不僅需要使用借助網(wǎng)關(guān)的支持來摘流量,還需要在停應(yīng)用前人工判斷來保證在途請求已經(jīng)處理完畢。這種需要人工介入的方式運維復(fù)雜度較高,只能適用規(guī)模較小的應(yīng)用,無法在大規(guī)模系統(tǒng)上使用。

因此,如果在容器/框架級別提供某種自動化機制,來自動進行摘流量并確保處理完以到達的請求,不僅能保證業(yè)務(wù)不受更新影響,還可以極大地提升更新應(yīng)用時的運維效率。

這個機制也就是優(yōu)雅停機,目前Tomcat/Undertow/Dubbo等容器/框架都有提供相關(guān)實現(xiàn)。下面給出正式一些的定義:優(yōu)雅停機是指在停止應(yīng)用時,執(zhí)行的一系列保證應(yīng)用正常關(guān)閉的操作。這些操作往往包括等待已有請求執(zhí)行完成、關(guān)閉線程、關(guān)閉連接和釋放資源等,優(yōu)雅停機可以避免非正常關(guān)閉程序可能造成數(shù)據(jù)異常或丟失,應(yīng)用異常等問題。優(yōu)雅停機本質(zhì)上是JVM即將關(guān)閉前執(zhí)行的一些額外的處理代碼。

適用場景

  • JVM主動關(guān)閉(System.exit(int);
  • JVM由于資源問題退出(OOM);
  • 應(yīng)用程序接受到SIGTERM或SIGINT信號。

配置方式

服務(wù)的優(yōu)雅停機

在Dubbo中,優(yōu)雅停機是默認開啟的,停機等待時間為10000毫秒。可以通過配置dubbo.service.shutdown.wait來修改等待時間。

例如將等待時間設(shè)置為20秒可通過增加以下配置實現(xiàn):

dubbo.service.shutdown.wait=20000

容器的優(yōu)雅停機

當使用org.apache.dubbo.container.Main這種容器方式來使用 Dubbo 時,也可以通過配置dubbo.shutdown.hook為true來開啟優(yōu)雅停機。

通過QOS優(yōu)雅上下線

基于ShutdownHook方式的優(yōu)雅停機無法確保所有關(guān)閉流程一定執(zhí)行完,所以 Dubbo 推出了多段關(guān)閉的方式來保證服務(wù)完全無損。

多段關(guān)閉即將停止應(yīng)用分為多個步驟,通過運維自動化腳本或手工操作的方式來保證腳本每一階段都能執(zhí)行完畢。

在關(guān)閉應(yīng)用前,首先通過 QOS 的offline指令下線所有服務(wù),然后等待一定時間確保已經(jīng)到達請求全部處理完畢,由于服務(wù)已經(jīng)在注冊中心下線,當前應(yīng)用不會有新的請求。這時再執(zhí)行真正的關(guān)閉(SIGTERM或SIGINT)流程,就能保證服務(wù)無損。

QOS可通過 telnet 或 HTTP 方式使用,具體方式請見Dubbo-QOS命令使用說明。

流程

Provider在接收到停機指令后

  • 從注冊中心上注銷所有服務(wù);
  • 從配置中心取消監(jiān)聽動態(tài)配置;
  • 向所有連接的客戶端發(fā)送只讀事件,停止接收新請求;
  • 等待一段時間以處理已到達的請求,然后關(guān)閉請求處理線程池;
  • 斷開所有客戶端連接。

Consumer在接收到停機指令后

  • 拒絕新到請求,直接返回調(diào)用異常;
  • 等待當前已發(fā)送請求執(zhí)行完畢,如果響應(yīng)超時則強制關(guān)閉連接。

當使用容器方式運行 Dubbo 時,在容器準備退出前,可進行一系列的資源釋放和清理工。

例如使用 SpringContainer時,Dubbo 的ShutdownHook線程會執(zhí)行ApplicationContext的stop和close方法,保證 Bean的生命周期完整。

實現(xiàn)原理

  • 在加載類org.apache.dubbo.config.AbstractConfig時,通過org.apache.dubbo.config.DubboShutdownHook向JVM注冊 ShutdownHook。

    /*** Register the ShutdownHook*/ public void register() {if (!registered.get() && registered.compareAndSet(false, true)) {Runtime.getRuntime().addShutdownHook(getDubboShutdownHook());} }
  • 每個ShutdownHook都是一個單獨的線程,由JVM在退出時觸發(fā)執(zhí)行org.apache.dubbo.config.DubboShutdownHook。

    /*** Destroy all the resources, including registries and protocols.*/ public void doDestroy() {if (!destroyed.compareAndSet(false, true)) {return;}// destroy all the registriesAbstractRegistryFactory.destroyAll();// destroy all the protocolsdestroyProtocols(); }
  • 首先關(guān)閉所有注冊中心,這一步包括:

    • 從注冊中心注銷所有已經(jīng)發(fā)布的服務(wù);
    • 取消訂閱當前應(yīng)用所有依賴的服務(wù);
    • 斷開與注冊中心的連接。
  • 執(zhí)行所有Protocol的destroy(),主要包括:

    • 銷毀所有Invoker和Exporter;
    • 關(guān)閉Server,向所有已連接Client發(fā)送當前Server只讀事件;
    • 關(guān)閉獨享/共享Client,斷開連接,取消超時和重試任務(wù);
    • 釋放所有相關(guān)資源。
  • 執(zhí)行完畢,關(guān)閉JVM。

  • 注意事項

    • 使用SIGKILL關(guān)閉應(yīng)用不會執(zhí)行優(yōu)雅停機;
    • 優(yōu)雅停機不保證會等待所有已發(fā)送/到達請求結(jié)束;
    • 配置的優(yōu)雅停機等待時間timeout不是所有步驟等待時間的總和,而是每一個destroy執(zhí)行的最大時間。例如配置等待時間為5秒,則關(guān)閉Server、關(guān)閉Client等步驟會分別等待5秒。

    ?

    原文:http://dubbo.apache.org/zh-cn/blog/dubbo-gracefully-shutdown.html

    總結(jié)

    以上是生活随笔為你收集整理的Dubbo 优雅停机的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。