ให้บริการงานพื้นหลังในไซต์ขนาดใหญ่


49

เรากำลังจัดการกับปัญหาที่น่าสนใจใน StackOverflow

เรามีงานเล็ก ๆ น้อย ๆ "ที่ต้องทำในไม่ช้า" ตัวอย่างกำลังอัปเดตรายการ "คำถามที่เกี่ยวข้อง" สิ่งที่เราทำในอดีตคือการแบกภาระงานเหล่านั้นลงบนหน้าโหลดของผู้ใช้บางคน

เรื่องนี้ไม่เหมาะ แต่ก็ไม่ได้สังเกตเห็นได้ชัดเจนจริงๆ ตอนนี้ SO จึงผ่านเครื่องหมายคำถาม 1,000,000 รายการผู้ใช้ที่โชคร้ายเหล่านั้นเริ่มรู้สึก

วิธีแก้ปัญหาตามธรรมชาติคือการผลักงานเหล่านี้เป็นพื้นหลัง มีสองวิธีในการทำสิ่งนี้ที่ฉันกำลังพิจารณา

1. ใน IIS เป็น Thread-Pool / Work-Queue ที่กำหนดเอง

โดยพื้นฐานแล้วเราจะหมุนเธรดไม่กี่อัน (ไม่ใช่ThreadPoolเพื่อไม่รบกวน IIS) และให้พวกเขาให้บริการคอลเลกชันบางอย่างที่เรากำลังผลักให้Funcsทำงาน

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

นอกจากนี้เรายังสามารถเข้าถึงรหัสทั่วไปของเราทั้งหมด

คอนดิชั่นก็คือว่าเราไม่ควรใช้เธรดพื้นหลัง การคัดค้านที่ฉันรู้นั้นมีศูนย์กลางอยู่ที่ IIS ที่หิวโหย (ถ้าคุณใช้ ThreadPool) และเธรดที่สุ่มแบบสุ่ม (เนื่องจากการรีไซเคิล AppPool)

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

ฉันขาดการคัดค้านอื่น ๆ ในกระบวนการ IIS รวมเธรด / งานคิวหรือไม่

ย้ายไปที่ StackOverflowเนื่องจากไม่ได้รับการแก้ไขที่นี่

2. เป็นบริการ

อาจเป็นโซลูชันของบุคคลที่สามหรือโซลูชันที่กำหนดเอง

โดยพื้นฐานแล้วเราจะจัดระเบียบงานข้ามขอบเขตของกระบวนการไปยังบริการบางอย่างแล้วลืมไปเลย สันนิษฐานว่าเรากำลังเชื่อมโยงโค้ดบางส่วนเข้าหรือ จำกัด ให้กับสตริงการเชื่อมต่อ SQL ดิบ +

โปรคือมันเป็น "วิธีที่ถูกต้อง" ในการทำเช่นนี้

ข้อเสียคือเราถูก จำกัด อย่างมากในสิ่งที่เราสามารถทำได้หรือเราจะต้องใช้ระบบบางอย่างเพื่อให้บริการนี้สอดคล้องกับรหัสฐานของเรา นอกจากนี้เรายังจะต้องขอการตรวจสอบและข้อผิดพลาดทั้งหมดของเราซึ่งเราได้รับฟรีโดยใช้ตัวเลือก "In IIS"

มีประโยชน์หรือปัญหาอื่น ๆ เกี่ยวกับวิธีการบริการหรือไม่?

โดยสรุปมีปัญหาที่มองข้ามไม่ได้และผ่านไม่ได้ที่ทำให้แนวทาง # 1 ไม่สามารถใช้การได้และหากเป็นเช่นนั้นมีบริการของบุคคลที่สามที่ดีที่เราควรพิจารณาหาแนวทาง # 2 หรือไม่


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

2
ฉันอยากรู้อยากเห็นเพราะฉันมีสถานการณ์ที่คล้ายกัน (ในขนาดที่เล็กมาก) และฉันก็เช่นกันเพียงแค่ piggy-backing ในการเชื่อมต่อผู้ใช้บางคนโชคร้าย ฉันไม่คุ้นเคยกับทางออกที่ดีที่สุดดังนั้นฉันจะทำตามที่นี่ :-)
pc1oad1etter

7
ฉันไม่เข้าใจสาเหตุที่ไม่ได้อยู่ใน StackOverflow นี่คือการแลกเปลี่ยนทางวิศวกรรมไม่ใช่การประเมินราคาตามอัตวิสัย คุณกำลังขอการวิเคราะห์แนวทางที่แตกต่างนั่นคือวัตถุประสงค์ทั้งหมด เฉพาะเมื่อการวิเคราะห์ทำให้ชัดเจนว่าการแลกเปลี่ยนคืออะไรมีความคิดส่วนตัวและเท่าที่ฉันสามารถเห็นคำถามของคุณไม่ได้ 'สิ่งที่ฉันควรจะหาสิ่งที่สำคัญกว่าเวลาของฉันและทรัพยากรเซิร์ฟเวอร์หรือเวลาของผู้ใช้ของฉัน? ' หรือสิ่งที่คล้ายกัน
Joren

@ Kevin Montrose - จากความคิดเห็นของคุณดูเหมือนว่าคุณกำลังสร้างความแตกต่างระหว่าง "ต้องทำในไม่ช้า" และ "กำหนดในช่วงเวลา" คุณสามารถอธิบายรายละเอียดเกี่ยวกับเหตุผลที่ผู้ที่มีสองที่แตกต่างกันชนิดของงานพื้นหลังที่จำเป็นต้องมีรูปแบบที่แตกต่างกัน / โครงสร้างพื้นฐาน?
Portman

@Portman - ความแตกต่างพื้นฐานคือว่า "เร็ว ๆ นี้ ish" ไม่สามารถทำงานได้อย่างพิเศษเราต้องรอจนกว่าเราจะรู้ว่าพวกเขาต้องทำ ด้านหลังของการคำนวณซองจดหมายแสดงให้เห็นว่าหากเราต้องการย้ายแบบสอบถาม "คำถามที่เกี่ยวข้อง" (เพียงหนึ่งในหลาย ๆ คำถาม) ไปยังแท็บ cron "ใบ้" มันจะใช้เวลาประมาณ สัปดาห์ของการดำเนินการที่มั่นคงในการทำงานกับคำถามทั้งหมด โดยทั่วไปเราต้องการให้พวกเขาทำงานโดยเร็วที่สุด (โดยไม่มีผลกระทบต่อประสบการณ์ของผู้ใช้) ในขณะที่ภารกิจช่วงเวลาของเราสามารถทำได้โดยการเรียกใช้ไม่บ่อยกว่าหนึ่งครั้งใน 5 นาที (และโดยปกติจะน้อยกว่ามาก)
Kevin Montrose

คำตอบ:


17

สองสามสัปดาห์หลังฉันถามคำถามที่คล้ายกันเกี่ยวกับ SO ในเปลือกถั่ววิธีการของฉันบางครั้งตอนนี้ได้รับการพัฒนาบริการของ Windows ฉันจะใช้ NServiceBus (เป็นหลัก MSMQ ภายใต้หน้าปก) เพื่อร้องขอเจ้าหน้าที่จากเว็บแอปของฉันไปยังบริการของฉัน ฉันเคยใช้ WCF แต่การทำธุรกรรมแบบกระจายเพื่อทำงานอย่างถูกต้องผ่าน WCF ดูเหมือนจะเป็นความเจ็บปวดในลา NServiceBus ทำเคล็ดลับได้ฉันสามารถส่งข้อมูลและสร้างงานในการทำธุรกรรมและไม่ต้องกังวลว่าบริการของฉันจะเริ่มทำงาน ตัวอย่างง่ายๆถ้าฉันจำเป็นต้องส่งอีเมล (ตัวอย่างเช่นอีเมลการลงทะเบียน) ฉันจะสร้างบัญชีผู้ใช้และส่งสัญญาณไปยังบริการ Windows ของฉัน (เพื่อส่งอีเมล) ในการทำธุรกรรม ตัวจัดการข้อความที่ด้านบริการจะรับข้อความและดำเนินการตามนั้น

เนื่องจาก ASP. NET 4.0 และ AppFabric ได้รับการเผยแพร่มีหลายทางเลือกที่ทำงานได้กับกลไกด้านบน เมื่ออ้างอิงกลับไปที่คำถามที่กล่าวถึงข้างต้นตอนนี้เรามี AppInitialize ของ AppFabric (ผ่าน net.pipe) รวมถึงคุณสมบัติเริ่มอัตโนมัติของ ASP .NET 4.0 ซึ่งทำให้การพัฒนา Windows Services เป็นทางเลือกที่ทำงานได้ ฉันได้เริ่มทำสิ่งนี้ตอนนี้ด้วยเหตุผลหลายประการ (สิ่งที่ยิ่งใหญ่ที่สุดที่ถูกนำไปใช้งานไม่มีความเจ็บปวดในตูดอีกต่อไป):

  1. คุณสามารถพัฒนาเว็บ UI ผ่านบริการของคุณ (เนื่องจากใช้เป็นเว็บแอป) สิ่งนี้มีประโยชน์อย่างมากในการดูว่าเกิดอะไรขึ้นที่รันไทม์
  2. รูปแบบการปรับใช้ของคุณสำหรับเว็บแอปจะทำงานกับแอปพลิเคชันบริการของคุณ
  3. IIS มีคุณสมบัติที่เป็นระเบียบเล็กน้อยสำหรับการจัดการกับความล้มเหลวของแอพพลิเคชั่น (คล้ายกับบริการ Windows)
  4. นักพัฒนาเว็บมีความคุ้นเคยกับการพัฒนาแอปพลิเคชันบนเว็บ (โดยธรรมชาติ) ส่วนใหญ่ไม่ทราบวิธีปฏิบัติที่ดีที่สุดในการพัฒนาบริการ Windows
  5. มันมีทางเลือกมากมายในการเปิดเผย API เพื่อให้แอพอื่น ๆ ใช้งาน

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

  1. ความปลอดภัย อาจมีรูปแบบความปลอดภัยที่แตกต่างกันสำหรับ UI ที่แสดงข้อมูลเกี่ยวกับกระบวนการทำงานเบื้องหลัง ฉันไม่ต้องการเปิดเผย UI นี้ให้ใครอื่นนอกจากทีม ops นอกจากนี้เว็บแอปพลิเคชันอาจทำงานในฐานะผู้ใช้อื่นซึ่งมีสิทธิ์ในระดับสูง
  2. การบำรุง มันจะเป็นการดีมากที่จะสามารถปรับใช้การเปลี่ยนแปลงกับแอปพลิเคชันที่โฮสต์กระบวนการพื้นหลังโดยไม่ส่งผลกระทบต่อผู้ใช้โดยใช้เว็บไซต์ส่วนหน้า
  3. การปฏิบัติ การมีแอปพลิเคชันแยกจากคำขอหลักของผู้ใช้ในการประมวลผลไซต์หมายความว่าเธรดพื้นหลังจะไม่ลดความสามารถของ IIS ในการจัดการคิวคำขอขาเข้า นอกจากนี้แอปพลิเคชันที่ประมวลผลงานพื้นหลังสามารถปรับใช้กับเซิร์ฟเวอร์แยกต่างหากได้หากต้องการ

การทำเช่นนี้กลับไปที่ด้านการจัดการ WCF, NServiceBus / RabbitMQ / ActiveMQ เป็นต้น, วานิลลา MSMQ, RESTful API (คิดว่า MVC) เป็นตัวเลือกทั้งหมด หากคุณใช้ Windows เวิร์กโฟลว์ 4.0 คุณสามารถแสดงปลายทางของโฮสต์ซึ่งแอปพลิเคชันเว็บของคุณสามารถใช้งานได้

วิธีการโฮสต์เว็บสำหรับบริการยังค่อนข้างใหม่สำหรับฉันเวลาเท่านั้นที่จะบอกได้ว่ามันเป็นตัวเลือกที่ถูกต้อง ถึงแม้ว่าจะดีมาก อย่างไรก็ตามถ้าคุณไม่ต้องการใช้ AppFabric (ฉันทำไม่ได้เพราะเหตุผลบางอย่างที่ไม่สนับสนุน Windows Server Web Edition) ความสามารถในการเริ่มอัตโนมัติที่กล่าวถึงในโพสต์ของ Gu ทำงานได้ดี อยู่ห่างจากไฟล์ applicationhost.config ทุกอย่างในโพสต์นั้นสามารถติดตั้งผ่านคอนโซล IIS (เครื่องมือแก้ไขการกำหนดค่าในระดับเซิร์ฟเวอร์หลัก)

หมายเหตุ: ตอนแรกฉันโพสต์ลิงก์เพิ่มเติมอีกสองสามข้อความในข้อความนี้ แต่อนิจจานี่เป็นโพสต์แรกของฉันในการแลกเปลี่ยนและสนับสนุนเพียงหนึ่งลิงก์! โดยพื้นฐานแล้วมีอีกสองคนเพื่อให้พวกเขาได้รับ Google "Death to Windows Services ... App แบบสดยาว!" และ "auto-start-asp-net-applications" ขอโทษสำหรับเรื่องนั้น.


แนวคิดพื้นฐานของการใช้เว็บไซต์แยกต่างหากเนื่องจากบริการนี้เป็นสิ่งที่น่าสนใจซึ่งฉันไม่ได้พิจารณา ...
Kevin Montrose

Rohland ฉันอาจจะพลาดอะไรบางอย่างที่นี่ แต่คุณดูเหมือนจะบอกว่าคุณกำลังโต้ตอบกับบริการ Windows จากภายในตัวจัดการ NServiceBus ของคุณบริการจะส่งอีเมล ถ้าฉันถูกต้องฉันจะถามได้ไหมว่าทำไมคุณถึงไม่ส่งอีเมลจากตัวจัดการข้อความ NServiceBus ซึ่งจะง่ายต่อการพัฒนาทดสอบและปรับใช้
ฌอน Kearon

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

22

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

สำหรับภารกิจเฉพาะคุณจำเป็นต้องจัดเก็บงานเหล่านี้ในที่จัดเก็บข้อมูลแบบถาวร จนกระทั่งแอพบรรทัดคำสั่งเลือกพวกมันออกมาจากที่เก็บข้อมูลและดำเนินการพวกเขา ฉันเคยทำสิ่งนี้มาแล้วในอดีตโดยใช้ฐานข้อมูล Cassandra เป็นผู้ให้บริการสถานะเซสชันสำหรับการบรรจุงานพื้นหลังสำหรับผู้ใช้เฉพาะในฐานข้อมูล Cassandra จากนั้นให้ commandline เลือกพวกเขาและดำเนินการให้กับผู้ใช้

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

การโปรโมตที่ไร้ยางอาย แต่นี่เป็นโครงการของฉันและวิธีแก้ปัญหาที่ฉันเพิ่งอธิบายสั้น ๆ คือสาเหตุที่ฉันสร้างโครงการ: http://github.com/managedfusion/fluentcassandra/


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

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

10

แอป Cron + เว็บ

นี่คือการออกแบบการทดสอบการต่อสู้ที่ปรับขนาดในแนวนอนพร้อมกับฟาร์มเว็บของคุณและรับรองว่าคุณกำลังใช้เทคโนโลยีเว็บสแต็คที่คุณรู้จักอยู่แล้ว

นี่คือวิธีการทำงาน:

  1. สร้างตัวควบคุม / การกระทำในเว็บแอปพลิเคชันของคุณเพื่อจัดการงานพื้นหลังที่กำหนด ตามแบบแผนฉันมักจะเรียกฉันhttp://mydomain.com/system/cronว่า
  2. เพื่อความปลอดภัยการกระทำนี้ควรถูกล็อคไว้เฉพาะที่อยู่ IP ที่ได้รับการรับรองความถูกต้องบนเครือข่ายท้องถิ่น
  3. บนเครื่องที่แยกต่างหากให้ติดตั้งWgetและตั้งค่าภารกิจที่กำหนดไว้เพื่อให้เรียกทรัพยากรจากขั้นตอนที่ 1 คุณสามารถทำให้งานทำงานบ่อยเท่าที่คุณต้องการ (โดยปกติฉันจะเลือก 30 วินาที) อย่าลืมส่งอาร์กิวเมนต์ของคุกกี้ที่เหมาะสมไปยัง Wget เพื่อให้มันตรวจสอบสิทธิ์กับแอปพลิเคชันเว็บของคุณ
  4. สำหรับความซ้ำซ้อนคุณสามารถติดตั้ง wget ที่สองตามกำหนดเวลาบนเครื่องที่สอง

ไชโย! ตอนนี้คุณมีเส้นทางที่จะถูกเรียกทุก ๆ 30 วินาที และถ้าคำขอใช้เวลา 5 นาทีในการดำเนินการไม่มีใครสนใจเพราะไม่ใช่ส่วนหนึ่งของคำขอหน้าเว็บของผู้ใช้

การcronกระทำนั้นดูเรียบง่ายมาก: เขามีรายการวิธีที่จะดำเนินการตามความถี่ที่แน่นอน เมื่อมีคำขอเข้ามาเขาจะเห็นว่ามีวิธีการที่ต้องดำเนินการและเรียกวิธีการที่เหมาะสมหรือไม่ ซึ่งหมายความว่าคุณสามารถควบคุมตารางเวลาในฐานข้อมูลของคุณซึ่งคุณอาจมีข้อมูลการกำหนดค่าที่สำคัญอื่น ๆ อีกมากมายสำหรับไซต์ของคุณ

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

ข้อดีและข้อเสีย

ข้อดี
  • คุณเขียนโค้ด ASP.NET MVC ได้ดีมากดังนั้นสิ่งนี้จะช่วยให้คุณสามารถเขียนงานพื้นหลังของคุณในแพลตฟอร์มเดียวกับที่คุณเขียนส่วนที่เหลือของโซลูชันของคุณ
  • งานที่ทำงานในบริบทเดียวกับเว็บแอปของคุณดังนั้นคุณสามารถแชร์แคชและใช้วิธีการช่วยเหลือที่มีอยู่แล้ว
  • หากคุณได้รับURI ที่สมดุลโหลดงานพื้นหลังของคุณก็จะได้รับความสมดุลเช่นกัน
  • การปรับใช้พร้อมกัน - คุณไม่ต้องกังวลเกี่ยวกับการซิงค์แอปพลิเคชันเว็บของคุณกับตรรกะงานพื้นหลังของคุณเพราะทั้งหมดอยู่ในการปรับใช้เดียวกัน
จุดด้อย
  • ในช่วงหลายปีที่ผ่านมามีคนไม่กี่คนที่บอกฉันว่าการออกแบบนี้เป็น "คู่ที่สูง" แต่เมื่อกดพวกเขาก็ไม่สามารถที่จะอธิบายได้ว่าทำไมมันถึงเป็นสิ่งที่ไม่ดี

หมายเหตุ: หากมีคำถามหรือข้อสงสัยใด ๆโปรดเพิ่มความคิดเห็น ฉันมีความสุขที่จะทำอย่างละเอียด


7

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

ฉันยังมีงานที่กำหนดเวลาไว้ซึ่งเข้าถึง URL ในแอป ASP.NET - นี่เป็นวิธีแก้ปัญหาที่ดี แต่มันก็เริ่มพังทลายลงในนาทีที่คุณปรับขนาดเว็บเซิร์ฟเวอร์ 1 เซิร์ฟเวอร์ที่ผ่านมา

ปัจจุบันฉันใช้สองวิธีที่แตกต่างกันทั้งที่ใช้ Quartz.NET ซึ่งเป็นห้องสมุดเล็ก ๆ แรกคือ Quartz.NET ที่กำลังดำเนินการกับ ASP.NET มันตั้งค่าใน global.asax และทำงานทุกสองสามนาที ฉันใช้สิ่งนี้เพื่ออัปเดตแคช ASP.NET นอกวงซึ่งเป็นเหตุผลเดียวที่รันเป็นส่วนหนึ่งของ ASP.NET

อย่างที่สองคือฉันเขียนไลบรารีเพื่อตัด Quartz.NET เรียกว่า DaemonMaster - ทำให้ง่ายต่อการวาง DLL ลงในไดเรกทอรีและเรียกใช้ในบริการ Windows ฉันพบว่ามันช่วยหลีกเลี่ยงบางส่วนที่น่ารำคาญในการทำงานกับ Windows Service และยังช่วยกำจัด Quartz.NET api บางส่วน บริการที่เรียกใช้ผ่าน DaemonMaster นั้นมีสองรสชาติที่แตกต่างกันอย่างแรกคืองานที่ต้องทำงานทุกคืนหรือทุก X นาที งานอื่นจะทำงานนอกคิวตามข้อมูลที่มาจากแอปพลิเคชัน ASP.NET แอป ASP.NET ปล่อยวัตถุ JSON บน RabbitMQ และบริการ PollMirMM จากนั้นประมวลผลข้อมูล

จากนี้ฉันขอแนะนำให้คุณใช้บริการ Windows (และตรวจสอบ DaemonMaster) และหากจำเป็นต้องใช้คิวเช่น RabbitMQ สำหรับส่งข้อมูลจากแอพ ASP.NET ไปยังบริการ - มันได้ผลดีที่สุดสำหรับโซลูชั่นเหล่านี้ทั้งหมด . หากคุณกำลังโหลดแคชจากนั้นทำงานใน ASP.NET เหมาะสมมิฉะนั้นฉันไม่คิดว่ามันจะ


6

ฉันจะทำสิ่งที่ถูกต้องและให้บริการ Windows ทำงานซึ่งตรวจสอบ "คิว" ฉันพูดว่า "คิว" เพราะการเขียนโปรแกรมด้วย MSMQ นั้นคล้ายกับการสูบบุหรี่ในดวงตาของคุณ

ฉันหลงรักกับความเรียบง่ายของDelayed :: Job in Rails และสิ่งที่คล้ายกันสามารถทำได้ใน. NET

โดยทั่วไปคุณเพิ่มประเภทใด ๆSomethingOperation(สิ่งที่มีPerform()วิธีการ) จากนั้นเพียงเรียงลำดับพารามิเตอร์ที่เกี่ยวข้องให้ความสำคัญกับพฤติกรรมการลองส่งค่าเริ่มต้นและเรียงลำดับเป็นฐานข้อมูล

บริการของคุณจะตรวจสอบเรื่องนี้และทำงานในคิว


การทำให้เป็นอันดับของพารามิเตอร์ที่เกี่ยวข้องนั้นไม่ได้เป็น "เพียงแค่" เกือบทั้งหมดเป็น "ทั้งหมด" เป็นหนึ่งในการจองที่ยิ่งใหญ่กว่าของฉันเกี่ยวกับวิธีการแยก ...
Kevin Montrose

ใช่ว่าเป็นวิธีการแก้ปัญหาเดียวกันฉันใช้ แต่ฉันอนุกรมวัตถุทั้งหมดในฐานข้อมูลเป็นไบนารีแล้วดึงพวกเขาออกไปดำเนินการ ฉันใช้ Cassandra เป็นที่เก็บข้อมูลถาวรและตัวกำหนดเวลางานของฉันเป็นตัวกำหนดตารางเวลา CRON ของฉันสำหรับแอพ commandline ที่จะเรียกใช้และดำเนินงาน
Nick Berardi

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

@ เควิน - ถ้าเพียง แต่เรามีคนที่มีประวัติของการเป็นอันดับเป็นจำนวนมาก ....
Marc Gravell

4

เรามีความสุขมากกับบริการคิวรถบัส / คิวข้อความ / บริการ สถาปัตยกรรมพื้นฐานคือสิ่งนี้

เว็บไซต์ส่งข้อความไปยังคิว

bus.Send(new ProjectApproved()); // returns immediately

บริการ Windows ได้รับและประมวลผลข้อความในเวลาของมันเอง

public class DoesSomethingAwesome : ConsumerOf<ProjectApproved>
{
   public void Consume(ProjectApproved Message)
   {
      // Do something "offline"
   }
}

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

หากคุณไม่สามารถจัดเก็บข้อมูลทั้งหมดของคุณภายในข้อความคุณสามารถจัดเก็บและเรียกข้อมูลได้ในภายหลัง ฉันขอแนะนำให้ใช้กลไกการจัดเก็บเอกสารเช่น: RavenDBหรือMongoDBตรงไปตรงมาเพื่อจัดเก็บคลาสของคุณโดยไม่มีการเปลี่ยนแปลง

เว็บไซต์ส่งข้อความไปยังคิว

// Save your object
store.Save(completeProject);

// Send a message indicating its ready to be processed
bus.Send(new ProjectApproved() { ProjectId = completeProject.Id });

บริการ Windows ได้รับและประมวลผลข้อความในเวลาของมันเอง

public class DoesSomethingAwesome : ConsumerOf<ProjectApproved>
{
   public void Consume(ProjectApproved Message)
   {
      // Retrieve your object back
      var completeProject = store.Get(Message.ProjectId);
   }
}

เพื่อให้ได้สิ่งที่เรียบง่ายที่เราใช้: แรด ESBและTopshelf การกำหนดค่านั้นง่ายมากและวางสิ่งนี้ไว้ในแอปพลิเคชันที่มีอยู่แล้วซึ่งพิสูจน์แล้วว่าใช้เวลาน้อยมาก


อย่างไรก็ตามการใช้ Service Bus กับ CQRS นั้นเป็นวิธีที่ดีในการปรับปรุงความสามารถในการปรับขนาดของคุณ
Thinkbeforecoding

3

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

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

ฉันไม่เห็นว่าทำไมงานแบ็คกราวน์ทำงานเป็นระยะ ๆ ไม่สามารถเลียนแบบผู้เข้าชมได้ ตอนนี้ฉันไม่ใช่โปรแกรมเมอร์ Windows แต่ในโลก Linux ฉันจะตั้งค่างาน cron ที่ทำงานในช่วงเวลาปกติและมันจะมีรหัส 2 บรรทัด

#!/bin/bash
wget -O /dev/null http://stackoverflow.com/specially_crafted_url

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

ปรับปรุง

ฉันคิดว่าคุณสามารถแก้ไขปัญหาเกี่ยวกับการโหลดบาลานซ์ได้ด้วยการรัน job runners บนเว็บเซิร์ฟเวอร์เอง ผู้หางานดึง URL ออกจากคิวงานและเรียกใช้ดังนี้:

wget -O /dev/null http://localhost/specially_crafted_url

เนื่องจากลักษณะของคิวงาน / การส่งข้อความงานจะได้รับการกระจายอย่างเท่าเทียมกันในหมู่นักวิ่งงานซึ่งหมายความว่าในที่สุดเว็บพิเศษของคุณจะถูกแจกจ่ายในเว็บเซิร์ฟเวอร์ของคุณ


เราได้ทำไปแล้วสำหรับทุกสิ่งที่ทำงานตามช่วงเวลาที่คาดเดาได้สิ่งที่เราทิ้งไว้คือสิ่งที่ไม่สามารถคาดการณ์ล่วงหน้าได้ล่วงหน้า ตัวอย่างเช่น "บล็อกคำถามที่เกี่ยวข้อง" จะอัปเดตเฉพาะคำถามที่มีการดูล่าสุด รายการคำถามที่ติดแท็กจะถูกแคชไว้ก็ต่อเมื่อมีคนสนใจตรวจสอบแท็กเหล่านั้น เนื่องจากเรามีคำถามมากกว่าหนึ่งล้านข้อและการเข้าถึงแท็ก 25k เราจึงไม่สามารถทำงานที่เกี่ยวข้องทั้งหมดได้ (และนั่นเป็นเพียง 2 ตัวอย่าง) "ในกรณีนี้"
Kevin Montrose

นอกจากนี้ยังมีปัญหาโหลดบาลานซ์เนื่องจาก SO ถูกแบ่งข้ามหลายเซิร์ฟเวอร์ โดยทั่วไปหากคุณข้ามไปยัง stackoverflow.com คุณจะพบเซิร์ฟเวอร์เดียวกันเสมอ วิธี wget จะบังคับให้เราจัดการภารกิจทั้งหมดไปยังเซิร์ฟเวอร์เดียว (หรือทำการปรับการตั้งค่าการโหลดบาลานซ์ของเราอีกครั้ง) ซึ่งจะเจ็บปวดจริงๆ
Kevin Montrose

เป็นสิ่งที่ดีถ้าสิ่งต่าง ๆ ทำงานเป็นระยะปกติใช่มั้ยฮะ? ฉันเข้าใจสิ่งที่คุณพูด แต่วิธีการที่อธิบายไว้ข้างต้น (และฉันคิดว่าบางคนพูดถึง) ไม่เปลี่ยน เมื่อการดูหน้าเว็บบอกว่า "ถึงเวลาที่จะใช้งานนี้" คุณจะติดงานในคิวข้อความ งานแบ็คกราวน์ที่รันนานจะรันงานที่ค้นหา ในกรณีนี้งานไม่มีอะไรมากไปกว่า URL ที่จำเป็นต้องมีการร้องขอ hehe คุณอาจตั้งค่านี้ไว้บนเซิร์ฟเวอร์ที่ใช้ร่วมกัน $ 20 ต่อเดือนเนื่องจากไม่จำเป็นต้องใช้รหัสฐานของคุณในการทำงาน ดู Amazon SQS สำหรับบริการส่งข้อความที่ใช้งานง่าย
mellowsoon

เกี่ยวกับปัญหาการโหลดบาลานซ์ ในกรณีที่มีความประสงค์มีวิธี! แทนที่จะทำการร้องขอไปยัง stackoverflow.com คุณสามารถกดเซิร์ฟเวอร์สุ่มโดยใช้ที่อยู่ IP หากตัวโหลดบาลานซ์ตรวจสอบคุกกี้เพื่อไพพ์คำขอคุณสามารถปลอมคุกกี้ได้ หากตรวจสอบที่อยู่ IP คุณอาจจะปลอมแปลงได้ (เนื่องจากคุณไม่สนใจเกี่ยวกับการตอบสนองจากเซิร์ฟเวอร์)
mellowsoon

เห็นพ้องกันว่าสมดุลภาระไม่ควรจะเป็นด้วยเหตุผลไม่ได้ที่จะทำนี้ เนื่องจากคำขอspecially_crafted_urlมาจาก IP ที่รู้จักคุณสามารถเพิ่มกฎบน load balancer เพื่อทำ round-robin สำหรับการร้องขอจาก IP นั้นเท่านั้น
Portman

2

ฉันคิดว่าการต่อต้านด้วยวิธีการบริการที่บริสุทธิ์คือคุณมีรหัสกระจัดกระจายอยู่ในบริการและอยู่ห่างจากแอปหลัก

นี่คือสิ่งที่เราได้ทำไว้กับงานที่ไม่ต้องคำนึงถึงเวลาขนาดใหญ่ซึ่งมีการเก็บรหัสไว้ด้วยกันและทำให้การบริการง่ายขึ้น:

  1. สร้างคิวงาน (ทั้งในหน่วยความจำหรือฐานข้อมูลสิ่งที่จำเป็นต้องมีสำหรับประเภทของงาน)
  2. สร้างบริการบนเว็บที่จะดำเนินการงานที่อยู่ในคิว
  3. แอพบริการที่ใช้งานง่าย ๆ ที่เรียกใช้บริการเว็บในช่วงเวลาที่กำหนดไว้ปล่อยให้สิ่งที่ซับซ้อนทั้งหมด (การดึงข้อมูลงานและการดำเนินการ) ไปยังบริการเว็บใน codebase หลักของคุณ

ง่ายยิ่งขึ้นเพียงโทรออกในแอพคอนโซลและใช้ Task Scheduler หรือ VisualCron เพื่อเปลี่ยนเป็น "บริการ"


1
ฉันได้รับสิ่งนี้อย่างแน่นอนในแอปพลิเคชันที่สำคัญในที่ทำงาน - บริการของ Windows ที่เรียกใช้แอปพลิเคชันเว็บเป็นระยะ ๆ แอพพลิเคชั่นบนเว็บยังคงไร้สัญชาติดึงสถานะออกจากฐานข้อมูลตามต้องการ ทำงานรักษา
Bevan

1

ฉันชอบ TopShelf คงความเรียบง่าย แต่ยังคงเป็นวิธีที่เหมาะสมในการใช้งานเป็นบริการ Windows สร้างแอป Console โดยทั่วไปเพิ่มโค้ดประมาณ 15-20 บรรทัดจากนั้นจะติดตั้งเป็นบริการ

http://code.google.com/p/topshelf/


1

วิธีการเกี่ยวกับการบริการ Windows ที่ง่ายมากที่ทำงานบนเว็บเซิร์ฟเวอร์และ URL การบำรุงรักษาเป็นระยะซึ่งงานเบ็ดเตล็ดของคุณ ให้มันเร่งความเร็วเท่าไหร่ในการร้องขอใด ๆ


1

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

  • ไม่มีบริการภายนอกสำหรับตรวจสอบ
  • ความง่ายในการใช้งาน: ไม่มีการจัดการข้ามกระบวนการไม่มีการตรวจสอบงานขั้นสูง
  • คุณยังอยู่ในกระบวนการ IIS ของคุณดังนั้นคุณสามารถทำการบันทึกตามปกติของคุณและอื่น ๆ ได้ (ไม่จำเป็นต้องใช้ไฟล์บันทึกหลายไฟล์)
  • การปรับใช้ที่ง่ายขึ้นอย่างมาก (เมื่อคุณอัปเดตบริการคุณต้องหยุดบริการคัดลอกไฟล์เริ่มบริการ - นี่คือนอกเหนือจากการอัปเดตปกติของคุณไปยังรหัสเว็บไซต์)

ในความคิดของฉันการแก้ปัญหาใน IIS เป็นเพียง "ขั้นตอนต่อไป" จากการย้อนกลับไปยังหน้าสุ่ม


1

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

ทั้งสรรพสินค้า Redis / Ruby

สุจริตถ้าคุณทำตามวิธีการบริการมันไม่จำเป็นต้องบูรณาการกับแพลตฟอร์มปัจจุบันของคุณซึ่งฉันรู้สึกว่าเป็นข้อดี ฉันหวังว่ามันจะเป็นระบบ set-and-forget ที่จะทำงาน (ด้วยการตรวจสอบบางชนิด) และงานที่เสร็จสมบูรณ์ ฉันไม่แน่ใจว่าจะต้องทำงานบนแพลตฟอร์มเดียวกันเลยเนื่องจากเพิ่งจะอัปเดต / แก้ไขข้อมูลฐานข้อมูล

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

Resque

Kthxbye


ฉันต้องลอง Kthxbye ถ้าเพียงเพราะชื่อที่ยิ่งใหญ่!
Nathan Palmer

น่ากลัวมาก ต่อไปจะเป็น ORLY? ห้องสมุด. อาจเป็นสถิติการตรวจสอบบางชนิด ... ;)
Lukas

0

ฉันจะใช้บริการ WCF ที่โฮสต์โดย WAS เพื่อฟังคิว MSMQ

ข้อดี

  • ดำเนินการและลืมข้อความทางเดียวจากเว็บแอป

  • การควบคุมปริมาณ MSMQ / WCF และลองอีกครั้ง

  • รับประกันการส่งมอบ;

  • การจัดการจดหมายตาย

  • การประมวลผลแบบกระจาย

  • การเปิดใช้งาน WAS / MSMQ

คอนของ

  • MSMQ (ยังไม่ตาย ... ยัง)

คุณสมบัติ MSMQ ใน WCF ทำให้การใช้ MSMQ ดีมาก ใช่คุณจะมีเลือดออกในการกำหนดค่า แต่ผลประโยชน์ที่จะเกินดุลเสียสละ


0

ฉันพบปัญหานี้สองสามครั้งเมื่อมีการพัฒนาเว็บแอปพลิเคชัน เราได้แก้ไขด้วยการสร้างแอปพลิเคชันคอนโซล windows ที่ดำเนินงานและสร้างงานตามกำหนดเวลาที่ทำงานทุกครั้งเพื่อให้งานทำจริง


0

คุณสามารถแบ่งงานบนเธรดพื้นหลัง (หรือหลายเธรดพื้นหลัง) โดยใช้ Rx และสิ่งต่อไปนี้:

var scheduler = new EventLoopScheduler( SchedulerThreadName );
_workToDo = new Subject<Action>();
var queueSubscription = _workToDo.ObserveOn( scheduler ).Subscribe( work => work() );
_cleanup = new CompositeDisposable( queueSubscription, scheduler );

ใช้:

var work = () => { ... };
_workToDo.OnNext( work ); // Can also put on error / on complete in here

โฮสต์ทั้งหมดที่อยู่ในชั้นเรียนที่มีเพียงหนึ่งเดียว (หรือที่รู้จักว่าซิงเกิล แต่ทำอย่างถูกต้อง - ใช้คอนเทนเนอร์ IoC ของคุณเพื่อกำหนดไลฟ์สไตล์)

คุณสามารถควบคุมขนาดของเธรดพูล ฯลฯ โดยการเขียนตัวกำหนดตารางเวลาแบบกำหนดเองแทนการใช้ EventLoopScheduler (ซึ่งรันเธรดเดี่ยว)


0

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

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

และระบบเดียวกันนี้ใช้งานได้บนยูนิกซ์โดยมีการดัดแปลงเล็กน้อย


0

ฉันไม่ได้มีคำตอบสำหรับคุณตัวเอง แต่ปัญหารุ่งระฆัง - ผมจำได้ว่าพวกสุ่มบางพูดคุยเกี่ยวกับพอดคาสต์ครั้ง

Spolsky: ฉันสังเกตเห็นหนึ่งในคำถามที่คุณถามในบล็อกว่าคุณควรจัดการกับงานที่เกิดขึ้นประจำโดยทั่วไปอย่างไร?

Atwood: ใช่

Spolsky: นั่นเป็นลักษณะที่เป็นธรรมหรือไม่? ทุกเว็บไซต์มีงานบางอย่างที่คุณไม่ต้องการดำเนินการในขณะที่หน้าเว็บกำลังโหลด แต่คุณต้องการดำเนินการบางอย่างที่เกิดขึ้นซ้ำ

Atwood: ใช่แล้วงานพื้นหลังของสิ่งต่าง ๆ

Spolsky: ใช่แล้วคุณคิดยังไง?

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


1
ใช่มันใช้งานได้กับไซต์ที่เล็กกว่า StackOverflow มาก สเกลเป็นปัญหาใหญ่ที่นี่โชคไม่ดี (หรือโชคดีขึ้นอยู่กับว่าคุณดูอย่างไร)
Kevin Montrose

@Kevin Montrose ฉันขอร้องให้เพิกเฉยต่อโดเมนทั้งหมดที่นี่ คุณช่วยอธิบายได้ไหมว่าทำไมการมีหน้าเว็บลับทำงาน (บางทีในหน่วยเล็ก ๆ ) และถูกเรียกโดยหน้าที่รีเฟรช / cron งานที่อื่นไม่ปรับขนาดได้? ฉันไม่สงสัยเลยว่าคุณพูดถูก แต่ฉันชอบที่จะเรียนรู้
Oddthinking

ข้อเสนอแนะเฉพาะของคุณ (แคชหมดอายุ) ไม่ได้ปรับขนาดเนื่องจากการหมดอายุของแคชทั้งหมด (ใน ASP.NET) เรียกใช้เธรดเดี่ยว (เป็นการแฮ็กที่ฉลาดสำหรับไซต์ขนาดเล็กเช่นเคยเป็น) งาน cron ไม่ได้ขนาดเพราะเราได้โค่งเซิร์ฟเวอร์เดียว (ดังนั้นตอนนี้คือ 3 และยังคงเติบโต) และงาน cron ใด ๆ จะตีเซิร์ฟเวอร์เดียว (อย่างน้อยเปลี่ยนค่าคงที่จะเป็นจริงที่เจ็บปวดกับ load- ของเรา การตั้งค่าสมดุล) ภารกิจ cron จะต้องทำงานบ่อยเช่นกันเนื่องจากงานเหล่านี้เกิดซ้ำตามลำดับนาที
Kevin Montrose

มันน่าสังเกตว่าเราใช้การจัดตารางเวลา "สไตล์ cron" สำหรับการเรียกใช้ที่น้อยลงช่วงเวลาที่แน่นอนงานที่มีอยู่แล้วสิ่งต่าง ๆ เช่นการให้ตราสัญลักษณ์และประกาศอีเมลทุกวัน
Kevin Montrose

0

ภาพรวม API ของคิวงาน Java

แนวคิดของงาน
ในการประมวลผลพื้นหลังของ App Engine งานเป็นคำอธิบายที่สมบูรณ์ของหน่วยงานขนาดเล็ก คำอธิบายนี้ประกอบด้วยสองส่วน:

  • data payload ซึ่ง parameterizes งาน
  • รหัสซึ่งใช้งาน

Tasks as Offline Web Hooks
โชคดีที่อินเทอร์เน็ตให้บริการโซลูชั่นดังกล่าวแล้วในรูปแบบของคำขอ HTTP และการตอบสนอง data payload เป็นเนื้อหาของคำร้องขอ HTTP เช่นตัวแปรแบบฟอร์มเว็บ, XML, JSON หรือข้อมูลไบนารีที่เข้ารหัส การอ้างอิงรหัสคือ URL เอง รหัสจริงคือสิ่งใดก็ตามที่เซิร์ฟเวอร์ดำเนินการเพื่อเตรียมการตอบสนอง


ฉันไม่ได้แนะนำให้ใช้งานคิวงาน GAE API แต่ทำตามโมเดลของพวกเขา พวกเขาเคยคิดมาสักระยะหนึ่งแล้วเขียนการนำไปปฏิบัติ
antony.trupe

0

ทำทั้งสองอย่าง

เพิ่มพารามิเตอร์ทางเลือกให้กับพา ธ คำถามที่ทำงานที่คุณกำลัง piggybacking ตามคำขอของผู้ใช้ในปัจจุบัน:

ให้บริการงานพื้นหลังในไซต์ขนาดใหญ่

สร้างแอปคอนโซลที่ทำงานบนเซิร์ฟเวอร์แต่ละเครื่องและเปิดไบนารีบันทึก IIS ที่ใช้ร่วมกันและอ่านไปยังจุดสิ้นสุดปัจจุบันของไฟล์ ใช้ filesystemwatcher หรือช่วงเวลาที่กำหนดเพื่ออ่านไปข้างหน้าเพื่อรวบรวมการปรับปรุงในขณะที่ IIS ล้างบันทึก

ใช้ข้อมูลนี้เพื่อพิจารณาว่าหน้าใดที่มีการดูอยู่ในปัจจุบัน

ใช้ URL หน้าจากบันทึกการแยกวิเคราะห์เพื่อเรียกใช้เวอร์ชัน "extrastuff" ของ url บน localhost ด้วยวัตถุ webclient

เพิ่มในรหัสบางอย่างเพื่อสลับไฟล์ในตอนท้ายของแต่ละช่วงเวลาบันทึกหรือเริ่มต้นกระบวนการใหม่ในแต่ละช่วงเวลาบันทึก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.