如何優雅的關閉一個IIS站點

来源:https://www.cnblogs.com/chasingdreams2017/archive/2023/12/02/17871919.html
-Advertisement-
Play Games

眾所周知,當我們使用IIS的時候,在使用負載均衡的情況下,想停掉一個站點,通常會點擊Sites(網站)中的Stop(停止)來停止一個站點。但是這樣做,會帶來一個問題,當點擊Stop(停止)時,正在響應中的請求會立刻被切斷,使客戶端無法收到響應,後續也無法連接該站點,在某些業務場景中,比如涉及金額交易 ...


眾所周知,當我們使用IIS的時候,在使用負載均衡的情況下,想停掉一個站點,通常會點擊Sites(網站)中的Stop(停止)來停止一個站點。但是這樣做,會帶來一個問題,當點擊Stop(停止)時,正在響應中的請求會立刻被切斷,使客戶端無法收到響應,後續也無法連接該站點,在某些業務場景中,比如涉及金額交易業務,在沒有使用冪等,鎖等手段的情況下,強行切斷的請求後,客戶端不知道該交易的交易情況,如果再次請求(因為本站點已停止,負載均衡會指向其他機器)會造成重覆交易,如果不請求,客戶端也不能確切的知道該交易已經成功。類似微服務中,服務間請求超時的情況。

熟悉IIS的讀者通常不會直接停止站點,而會選擇點擊Application Pools(應用程式池)中的Stop(停止)來停止一個站點,應用程式池在被停止後,新的請求會被響應503,負載均衡識別到503後,會把該請求負載到其他機器上,以保證業務不會中斷。同樣的問題,當點擊Stop(停止)停止時,正在響應的請求,會發生什麼情況呢。有經驗的開發/運維會回答,在Application Pools(應用程式池)里Advanced Settings(高級設置)中Process Model(進程模型)組包含一個Shutdown Time Limit(關閉時間限制)選項,預設值為90s。這就意味著當應用程式池停止、回收時,IIS會最多等待沒響應的請求90s,如果90s內,所有的請求響應完畢,應用程式池就會被停止、回收。那麼如何判斷IIS在這90s內未響應請求是否全部被響應呢,如果部署的程式是ASP.NET Core,可以在Event Viewer(事件查看器)/Windows Logs(Windows 日誌)/Application(應用程式)里查看事件日誌,如果出現Failed to gracefully shutdown application 'MACHINE/WEBROOT/APPHOST/xxx'.這個警告,則表明存在請求沒有被響應,被IIS強行關閉的情況。

事與願違,在實際生產實踐中,讀者會發現IIS並沒有"等待"90s,就會關掉連接,而客戶端還在傻傻等待90s後才會顯示無響應,造成正在請求的HTTP無法響應。通過閱讀[官方文檔](https://learn.microsoft.com/en-us/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-8.0#ihostapplicationlifetime ".NET Generic Host in ASP.NET Core")我們得知,等ASP.NET Core收到關閉信號時,對於正在處理的HTTP請求,會等待5s,5s之後會像IIS那樣關閉連接。所以我們需要設置HostOptions
var builder = WebApplication.CreateBuilder(args);

......

builder.Services.Configure<HostOptions>(options =>
{
    //If the timeout period expires before all of the hosted services stop, any remaining active services are stopped when the app shuts down. The services stop even if they haven't finished processing. If services require more time to stop, increase the timeout.
    //Default: 5 seconds
    options.ShutdownTimeout = TimeSpan.FromSeconds(30);
});

......
按照文檔修改程式後,實際測試發現,設置.NET Generic Host的ShutdownTimeout"似乎"不生效, 在改動前由於IIS的Shutdown Time Limit預設是90s ,ASP.NET Core中ShutdownTimeout預設值是5s,所以在改動前IIS站點會最多等待正在請求的HTTP 5s 在改動後,筆者把.NET Generic Host的ShutdownTimeout調整至30s後,實測下來發現點擊停止應用程式池後,竟然只能等正在請求中的HTTP 10s ! 於是再次搜索資料,終於發現還有一個參數需要設置-> https://stackoverflow.com/questions/51634638/graceful-shutdown-of-ihostedservice  和官方文檔[地址](https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/aspnet-core-module?view=aspnetcore-3.1#attributes-of-the-aspnetcore-element "ASP.NET Core Module (ANCM) for IIS") 在最近的文檔(.NET 8)里竟然把Attributes of the aspNetCore element這一節刪掉(移走)了,導致查閱最新文檔,根部搜索不到所需信息,接下來按照文檔操作就十分簡單了,加上shutdownTimeLimit屬性,修改web.config如下:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2"
          resourceType="Unspecified" />
      </handlers>
      <aspNetCore shutdownTimeLimit="30" processPath="dotnet" arguments=".\WebApplicationTest.dll" stdoutLogEnabled="true"
        stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />
    </system.webServer>
  </location>
</configuration>
修改後,再次實測,即符合預期,在使用ASP.NET Core的情況下關於shutdownTime總結(省流)如下:

IIS應用程式池shutdownTime預設值為90s

AspNetCoreModuleV2shutdownTime預設值為10s

.NET Generic Host(應用程式)預設值為5s

如要修改shutdownTime則需同時關註以上三處設置。祝您使用愉快!

聲明

本文采用知識共用署名-非商業性使用-相同方式共用 2.5 中國大陸許可協議進行許可,發表在CSDN博客園,歡迎讀者轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接!請讀者/爬蟲們尊重版權


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文檔譯自 www.codeproject.com 的文章 "Calling Conventions Demystified",作者 Nemanja Trifunovic,原文參見此處 引言 - Introduction 在學習 Windows 編程的漫長、艱難而美妙的旅途中,你可能會對函數聲明前出 ...
  • 如何使用mysql實現可重入的分散式鎖 目錄 什麼是分散式鎖? 如何實現分散式鎖? 定義分散式表結構 定義鎖統一介面 使用mysql來實現分散式鎖 ① 生成線程標記ID ② 加鎖 ③ 解鎖 ④ 重置鎖 寫在最後 1. 什麼是分散式鎖? 百度百科:分散式鎖是控制分散式系統之間同步訪問共用資源的一種方式 ...
  • Scikit-learn是一個基於Python的開源機器學習庫,它提供了大量的機器學習演算法和工具,方便用戶進行數據挖掘、分析和預測。 Scikit-learn是基於另外兩個知名的庫 Scipy 和 Numpy的,關於 Scipy 和 Numpy 等庫,之前的系列文章中有介紹: Scipy 基礎系列 ...
  • 第二部分主要涵蓋了 SpringMVC 中作用域處理,介紹了 Request 作用域、Session 作用域和應用作用域的處理方式,以及 @ModelAttribute 註解的使用和 ModelAndView 的使用方法;最後,探討了靜態資源的處理方式,包括使用 DefaultServlet 或者 ... ...
  • acwing week2 基礎演算法3總結 總結點1:雙指針演算法 //常用模版框架 for (int i = 0, j = 0; i < n; i ++ ) { while (j < i && check(i, j)) j ++ ; } 常見問題分類: (1) 對於一個序列,用兩個指針維護一段區間 ( ...
  • 小市值選股策略的核心在於通過綜合分析公司的基本面、行業定位、財務健康狀況以及市場趨勢, 來尋找那些被市場低估但具備顯著成長潛力的股票,同時也要重視風險管理和投資組合的多樣化。 今天來給大家分享下小市值策略代碼如下: # 顯式導入 BigQuant 相關 SDK 模塊 from bigdatasour ...
  • 選項用來提供對相關設置的強類型訪問,讀取配置首選使用選項模式。選項無法脫離容器使用,依賴容器,實現了選項不同的訪問方式。選項模式使用了泛型包裝器,因此具備瞭如下優點: 不需要顯示註冊選項具體類型,只需要將泛型包裝器註入到容器中; 對於選項實例的評估推遲到獲取IOptions.Value時進行,而不是 ...
  • 前面老周給大伙伴們演示了過濾器的運行流程,大伙只需要知道下麵知識點即可: 1、過濾器分為授權過濾、資源訪問過濾、操作方法(Action)過濾、結果過濾、異常過濾、終結點過濾。上一次咱們沒有說異常過濾和終結點過濾,不過老周後面會說的。對這些過濾器,你有印象就行了。 2、所有過濾器介面都有同步版本和非同步 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...