ฉันมีเว็บแอป ASP.NET (.NET Framework 4.7.2.) ที่ปรับใช้กับ AWS/ECS และเราสังเกตเห็นว่า Application_Start ไม่ได้ทำงานเพียงครั้งเดียว ไม่ใช่สองครั้ง แต่เป็นสามครั้ง! บางทีคนอื่นอาจประสบปัญหานี้
เราแก้ไขการรีสตาร์ทพิเศษ 1 ใน 2 ครั้ง ครั้งแรกเกิดขึ้นเนื่องจากจุดเข้าใช้งานนักเทียบท่าของ Microsoft ของ ServiceMonitor ขั้นตอนแรกของการดำเนินการคือการหยุดบริการ w3svc เปลี่ยน applicationHost.config (ผ่าน appcmd.exe) เพื่อแทรกตัวแปรสภาพแวดล้อมระดับนักเทียบท่า (ตัวแปรที่จัดเตรียมผ่านคำสั่ง ENV ในไฟล์นักเทียบท่าหรือผ่านพารามิเตอร์บรรทัดคำสั่งการเรียกใช้นักเทียบท่า) ส่วนตัวแปรสภาพแวดล้อมของ DefaultAppPool แล้วเริ่มบริการใหม่
โดยปกติแล้ว นั่นจะไม่เป็นปัญหา แต่ถ้าแอปพลิเคชันของคุณถูกตั้งค่าให้เริ่มอัตโนมัติด้วย preloadEnabled=true สิ่งที่เกิดขึ้นคือบริการจะเริ่มต้นทันทีโดยอัตโนมัติด้วยคอนเทนเนอร์ มีเพียง ServiceMonitor เท่านั้นที่จะเข้ามาและหยุดมันได้ เปลี่ยนการตั้งค่าและเริ่มต้นใหม่อีกครั้ง ดังนั้นการเรียกใช้เริ่มต้นที่เริ่มต้นโดยระบบจะถึงวาระและไม่ควรเกิดขึ้นตั้งแต่แรก ไม่มีตัวแปรสภาพแวดล้อมที่คาดไว้ทั้งหมด และทำงานได้จริงๆ เนื่องจากแอปถูกตั้งค่าให้เริ่มทำงานอัตโนมัติ เราแก้ไขโดยการตั้งค่าโหมดเริ่มต้น w3svc เป็น 'Manual' สิ่งนี้ป้องกันการเรียกใช้ Application_Start เริ่มต้นที่ถึงวาระ ดังนั้นอย่างน้อยในคอนเทนเนอร์นักเทียบท่าภายในเครื่อง เราจะได้รับเพียงการรันเริ่มต้นเพียงครั้งเดียวของแอปพลิเคชัน ซึ่งเริ่มต้นหลังจาก ServiceMonitor ใช้การตั้งค่าที่ถูกต้อง
สิ่งต่าง ๆ ใน ECS นั้นแตกต่างกันเล็กน้อย นอกจากการเรียกใช้การเริ่มต้นเพิ่มเติมที่เรียกใช้โดย ServiceeMonitor แล้ว เรายังได้รับการเรียกใช้อีกครั้ง (ครั้งที่ 3) ซึ่งถูกเรียกใช้โดยการตั้งค่าอื่นๆ ที่นำไปใช้ที่รันไทม์ ซึ่งสันนิษฐานโดยสภาพแวดล้อม ECS คำถามหลักของฉันคือ มีใครทราบบ้างว่าการเปลี่ยนแปลงการตั้งค่าที่เกิดจาก ECS เหล่านี้อาจเป็นอย่างไร ECS ใช้ตัวแปรสภาพแวดล้อมหรือทำการเปลี่ยนแปลงอื่น ๆ กับ IIS ตามค่าเริ่มต้นหรือไม่ นี่คือสิ่งที่เกิดขึ้นเฉพาะใน ECS ซึ่งจะไม่เกิดขึ้นเมื่ออิมเมจนักเทียบท่าเดียวกันถูกเรียกใช้ในเครื่องบนเดสก์ท็อปนักเทียบท่า
ไม่ว่าการเปลี่ยนแปลงการตั้งค่าเหล่านี้จะเป็นอย่างไร การเปลี่ยนแปลงเหล่านี้ก่อกวนเป็นพิเศษ เนื่องจากไม่ก่อให้เกิดการรีไซเคิลกระบวนการที่ทับซ้อนกันตามปกติ ซึ่งจะหมุนกระบวนการใหม่ที่แยกจากกันซึ่งอุ่นเครื่องก่อนที่จะแทนที่กระบวนการเก่า การเปลี่ยนแปลงการตั้งค่าเหล่านี้ก่อให้เกิดประเภทของการรีไซเคิลในกระบวนการที่คุณจะได้รับหากคุณแก้ไขไฟล์ web.config เป็นต้น ฉันคิดว่าสิ่งนี้จะแทนที่ AppDomain ในกระบวนการที่กำลังทำงานอยู่ สิ่งนี้ไม่ดีสำหรับเรา เนื่องจากเรากำลังเรียกใช้ไลบรารีการติดตามระดับต่ำของ SignalFx ที่เชื่อมต่อเข้ากับ CLR และทำให้เกิดการละเมิดการแบ่งปันที่ทำให้กระบวนการขัดข้องเมื่อ AppDomain ใหม่พยายามโหลดแอสเซมบลีที่เป็นกลางของโดเมนด้วยสิทธิ์ที่แตกต่างกัน รอบการเริ่มต้นแอปพลิเคชันพิเศษเหล่านี้ไม่เพียงทำให้โหลดเพิ่มเติมในระบบเนื่องจากทำทั้งหมดสามเท่า (รวมถึงการไฮเดรชั่นแคชจากฐานข้อมูล การตั้งค่าการสมัครรับข้อมูลหัวข้อ Azure ฯลฯ) แต่ยังทำให้ความต้องการหน่วยความจำเพิ่มเติมบนระบบซึ่งสามารถ นำไปสู่ข้อยกเว้น OutOfMemory โดยเฉพาะอย่างยิ่งในนักเทียบท่าที่คอนเทนเนอร์มีหน่วยความจำฮาร์ดจำกัด