CPU, การใช้หน่วยความจำ, การใช้เธรดพูล - ASP NET core Identity ไม่ได้รับการยืนยันผู้ใช้เมลลบการจัดการ - ในแอพหรือแอพแยกกัน?

Aug 19 2020

ฉันสงสัยว่าอะไรคือทางออกที่เหมาะสมกว่า ฉันจำเป็นต้องใช้หุ่นยนต์เพื่อตรวจสอบและลบผู้ใช้ที่ลงทะเบียนที่ไม่ได้รับการยืนยันเป็นเวลา 7 วันหลังจากส่งเมลยืนยัน (หากผู้ใช้ไม่ยืนยันบัญชีของตนฉันต้องการลบผู้ใช้ออกจากฐานข้อมูล) ฉันคิดเกี่ยวกับ 3 วิธี:

  1. ใช้ผู้รับมอบสิทธิ์ในแอปหลัก ASP NET โดยตรงและเรียกใช้เป็นงาน async ในลูปด้วยการนอนหลับ 24 ชม.
  2. สร้างแอปคอนโซลซึ่งจะทำงานแบบวนซ้ำด้วยการนอนหลับ 24 ชม
  3. สร้างแอปคอนโซลซึ่งซอฟต์แวร์ของบุคคลที่สามจะเริ่มทำงานเป็นประจำ (เช่น Cron หรือ TaskScheduler)

วิธีใดต่อไปนี้จะส่งผลกระทบน้อยที่สุดสำหรับการใช้งาน CPU และหน่วยความจำ
เธรดพูลยังมีจำนวน จำกัด ยิ่งโรบ็อตมากเท่าไหร่เธรดก็จะน้อยลงสำหรับผู้ที่พยายามเข้าถึงไซต์ ASP net ของฉันฉันถูกต้องหรือไม่
และคำถามสุดท้ายของฉัน> เป็นความคิดที่ดีไหมที่ Thread นอนนานขนาดนี้? มีบางอย่างบอกฉันว่ามันไม่ใช่จริงๆ ในทางกลับกันมันเป็น ASP ซึ่งจะทำงานเป็นเดือนหรือหลายปี

อย่างไรก็ตามฉันชอบวิสัยทัศน์ของการมีทั้งหมดในแอปเดียว (สามารถกำหนดค่าได้ภายในไฟล์เดียวและเริ่มต้นพร้อมกันทั้งหมด) ในทางกลับกันมีบางอย่างบอกฉันว่ามันไม่ใช่ความคิดที่ยอดเยี่ยม

คำตอบ

2 JonasH Aug 21 2020 at 18:48

เมื่องานกำลังทำงานจริงฉันคาดหวังว่าหน่วยความจำและการใช้งานกระบวนการจะถูกครอบงำโดยสิ่งที่จำเป็นสำหรับงานและควรเปรียบเทียบกันสำหรับแต่ละวิธี ดังนั้นจึงควรดูการใช้ทรัพยากรเมื่อไม่ได้ทำงาน

  1. อยู่ระหว่างดำเนินการโดยใช้ตัวจับเวลา (หรือawait Task.Delay(..)วนรอบ)

สิ่งนี้จะต้องใช้เฉพาะหน่วยความจำสำหรับตัวจับเวลาหรือเครื่องที่มีสถานะ async และหน่วยความจำเพิ่มเติมสำหรับรหัส สิ่งนี้ควรจะค่อนข้างเล็กอาจจะไม่กี่กิโลไบต์ ไม่มีเวลาประมวลผลและไม่มีการใช้เธรดในขณะที่ไม่ได้ใช้งาน สิ่งนี้จะถือว่าคุณไม่ได้ยึดติดกับโครงสร้างข้อมูลขนาดใหญ่ใด ๆ

  1. ในกระบวนการคอนโซลถาวรแยกต่างหาก

ซึ่งจะใช้หน่วยความจำเพียงไม่กี่ MB สำหรับรันไทม์. Net และหน่วยความจำเพิ่มเติมสำหรับโค้ดและข้อมูล ในทางปฏิบัติฉันคาดว่าหน่วยความจำจะถูกเพจไปยังดิสก์หากคอมพิวเตอร์มีหน่วยความจำไม่เพียงพอ จะไม่มีการใช้เวลาโปรเซสเซอร์ในขณะที่ไม่ได้ใช้งาน

  1. ในกระบวนการคอนโซลที่กำหนดเวลาไว้แยกต่างหาก

สิ่งนี้จะใช้หน่วยความจำสำหรับอ็อบเจ็กต์ตัวกำหนดตารางเวลาเท่านั้นและสิ่งนี้ควรน้อยที่สุด เห็นได้ชัดว่าจะไม่มีการใช้เวลาตัวประมวลผลหรือเธรดในขณะที่ไม่ได้ใช้งาน

สรุป

การจัดกำหนดการกระบวนการแยกกันจะใช้ทรัพยากรน้อยที่สุด แต่วิธีการทั้งหมดควรใช้ทรัพยากรในปริมาณเล็กน้อยในขณะที่ไม่ได้ใช้งาน ดังนั้นฉันจะโต้แย้งว่าควรเลือกใช้เกณฑ์อื่นเช่นสิ่งที่ง่ายที่สุดในการบำรุงรักษาและ / หรือปรับใช้

เธรดพูลจะจัดสรรเธรดเพิ่มเติมหากจำเป็น โดยทั่วไปควรใช้เธรดเฉพาะเมื่อพวกเขากำลังทำบางอย่างจริงๆ (เช่นใช้await taskแทนtask.Wait()) และคุณจะมีเธรดพูลเธรดมากกว่าที่คุณจะมีเธรดฮาร์ดแวร์ ฉันจะกังวลเกี่ยวกับเรื่องนี้ถ้าฉันสังเกตเห็นจำนวนเธรดที่สูงกว่าปกติมาก

ฉันจะหลีกเลี่ยงThread.Sleepถ้าเป็นไปได้ จับเวลาหรือawait Task.Delayมักจะเหมาะสมกว่า