การแนะนำ
ผมทำงานใน บริษัท ที่เราเรียกใช้งานชุดการประมวลผลหลายล้านระเบียนของข้อมูลในแต่ละวันและฉันได้รับความคิดเกี่ยวกับเมื่อเร็ว ๆ นี้ทุกเครื่องที่นั่งรอบแต่ละคนและทุกวันทำอะไรเป็นเวลาหลายชั่วโมง มันจะไม่ดีถ้าเราสามารถใช้เครื่องเหล่านั้นเพื่อหนุนพลังการประมวลผลของระบบของเรา? ในชุดของบทความนี้ฉันจะไปดูที่ผลประโยชน์ที่อาจเกิดขึ้นจากการจ้างงานสำนักงาน ตาราง การใช้สภาพแวดล้อม virtualised
ใน ส่วนที่ 1 ผมให้ภาพรวมของระบบและเทคโนโลยีที่ผมจะใช้เป็นอย่างดีตามที่กล่าวไว้บางส่วนของเหตุผลที่มีศักยภาพที่ว่าทำไมคุณต้องการที่จะสร้างตารางสำนักงาน
ควบคุมงาน
หากคุณกำลังจะใช้งานแล้วคุณจะต้องมีวิธีบางอย่างเพื่อจัดการกับพวกเขา ระบบการควบคุมงานของคุณ (บนเซิร์ฟเวอร์งานของคุณ) จะต้องคิดดีจริงๆออกมาก่อนที่จะพยายามที่จะเรียกตารางสำนักงาน ดังนั้นประการแรกสิ่งที่งานสำหรับระบบการควบคุมงานคือ
- งานมือออกเมื่อมีการร้องขอจากแรงงาน
- บอกสิ่งที่คนงานประเภทของงานที่จะเรียกใช้
- งานติดตาม
- เพื่อให้มั่นใจว่างานที่มีการใช้เพียงครั้งเดียว
- ให้ข้อมูลงานกับแรงงานหรืออย่างน้อยก็บอกพวกเขาที่จะได้รับมัน
นอกจากนี้ระบบยังจะต้องมีการขยายวิธีการแก้ปัญหาที่ทำงานอยู่ในขณะนี้กรณีเดียวอาจจะขยายไปทำงานหลายประเภทของงานเป็นธุรกิจที่เห็นคุ้มค่าในการแก้ปัญหาตาราง ตัวอย่างเช่นงานที่อาจได้รับการจัดลำดับความสำคัญพิมพ์งานได้มากกว่าหนึ่งอาจมีอยู่ (เช่นฐานรหัสหลาย ๆ คน) ในที่สุดคุณอาจจะใช้เครื่องปฏิบัติงานแตกต่างกันหลายที่เหมาะสมสำหรับประเภทของงานแต่ละงาน (แต่ที่ไม่ย้ายออกจากคนงานทั่วไป' 'ความคิด) พยายามที่จะคิดเกี่ยวกับอนาคตเมื่อการพัฒนาระบบและการมองเห็นในระยะสั้นสามารถนำไปสู่ความยุ่งยากในระยะยาวและเวลาในการพัฒนาเพิ่มขึ้น
เซิร์ฟเวอร์งาน
เรากำลังจะต้องอยู่ในการควบคุมการงานของเราจากนี้ควรจะเป็นระบบเดียวในตารางของคุณที่มี Resource Locator คงเป็นไปได้ว่าที่อยู่ IP ชื่อโฮสต์ URL (ใช้ DNS ภายใน), ฯลฯ นี้เป็นเพราะ แรงงานที่จำเป็นต้องรู้ที่จะมองหางานคนงานต้องไปหาระบบการควบคุมงาน (ไม่ได้ระบบควบคุมการหางานคนงาน)
เซิร์ฟเวอร์งานที่ตัวเองไม่ได้จริงๆต้องเป็นงานที่ซับซ้อน (ในระบบขั้นพื้นฐาน แต่อย่างใด) มันตอบสนองความต้องการในการจัดเก็บรายการของงานที่มือออกงานได้รับผลและต่อมาเก็บไว้สำหรับการเรียกใช้ในภายหลัง วิธีการชิ้นส่วนเหล่านี้ ('มือออกงาน'เช่น) มีการกำหนดไว้สามารถขั้นพื้นฐานมาก ต่อมาเมื่อเราสามารถขยายระบบเพื่อให้การบริหารจัดการรวมถึงการอินเตอร์เฟซที่จะเพิ่ม, แก้ไข, ลบ, ระงับการงาน แต่นี้อยู่นอกเหนือการออกกำลังกายนี้
มีเหตุผลใดที่เซิร์ฟเวอร์แล้วงานของคุณอาจจะไม่เป็นเสมือนเครื่องทำงานอยู่ภายในเซิร์ฟเวอร์ในการประมวลผลหลักของคุณให้มันไม่ได้ระบายทรัพยากรมากเกินไปจากมันไม่มี งานเซิร์ฟเวอร์ แต่ไม่จำเป็นต้องมีประสิทธิภาพที่สูงถ้ามันจะไปลงเมื่อวันศุกร์เย็นที่คุณกำลังจะสูญเสียทั้งวันหยุดสุดสัปดาห์ของการประมวลผลอาจมีต้นทุนคุณคู่ของสัปดาห์ที่ผ่านมามูลค่าของเวลาการประมวลผล (เมื่อเทียบกับเซิร์ฟเวอร์ในการประมวลผลหลักเพียงอย่างเดียวของคุณ) . คุณอาจต้องการพิจารณาวางเซิร์ฟเวอร์งานของคุณในสภาพแวดล้อมที่สมดุลโหลดสำหรับความพร้อมสูง
การตั้งค่าพื้นฐาน
การตั้งค่าพื้นฐานสำหรับเซิร์ฟเวอร์งานของเราจะประกอบด้วยสิ่งที่ฉันเรียกหนึ่งในเซิร์ฟเวอร์ที่ปวกเปียกของฉัน (ซึ่งก็คือ nux Li, ม. ySql, P HP) รหัสคนงานที่ทำงานอยู่บน Thea จริงจะทำงานออกมาว่างานที่จะสามารถทำงานโดยการโต้ตอบกับกับงานฐานข้อมูลของระบบการควบคุม ต่อมาเมื่อเราสามารถสร้างบริการเว็บและมือจริงออกงานมากกว่าที่มีคนงานที่จะทำงานหนักด้วยตัวเอง แต่ตอนนี้เราจะยังคงใช้ หลักการ KISS (Keep มัน Simple, Stupid!)
ดังนั้นจะช่วยให้สร้างสาม mySQL ตารางที่จะจัดการกับงาน เหล่านี้จะถูก`งาน`,``jobRecords และ jobResults`
ที่นี่ผมใช้ SQL บัดดี้ เป็นทางเลือกที่น้อยที่ดีในการ phpMyAdmin เพียงเพราะมันง่ายต่อการติดตั้งบน CentOS (สำหรับคนอื่นเห็น : 10 ทางเลือกที่ดีในการ phpMyAdmin )
ตารางนี้ประกอบด้วย 5 เขตข้อมูลง่าย
- ID : ระบุตัวตนของงาน
- ชื่อ : อ้างอิงอาจจะเป็นลูกค้าหรือหมายเลขของตัวระบุอื่น ๆ
- สถานะ : : คุณจำเป็นต้องรู้ว่างานเป็นที่เช่น
- 0 : ไม่ได้เริ่มต้น
- 1 : การเลือกขึ้น
- 2 : เสร็จสมบูรณ์
- started_by : ใครเริ่มทำงานหรือไม่ นี้ไม่จำเป็นต้องทั้งหมด แต่เป็นคนดีที่จะมี ผมขอแนะนำให้แรงงานการติดตามตามที่อยู่ IP ของพวกเขาในเครือข่ายของคุณ
- started_at : เมื่อไหร่ที่คนงานเริ่มงานหรือไม่ โดยการติดตามงานที่ยังไม่ได้ให้แล้วเสร็จภายในจำนวนครั้งที่เรารู้ว่าเราต้องรับงานอีกครั้งและเริ่มการประมวลผลโดยผู้ปฏิบัติงานอื่น แรงงานอาจหยุดการประมวลผล / ออฟไลน์สำหรับจำนวนเหตุผลใด ๆ ของความล้มเหลวของอำนาจ, ความผิดพลาดของการสูญเสียเครือข่ายอื่น ๆ
มันเป็นเรื่องง่ายว่าตารางนี้อาจจะขยายกับเขตข้อมูลเพิ่มเติมไม่กี่เพื่อให้สามารถติดตามสถิติการเป็นคอลัมน์เวลาแล้วเสร็จเพื่อดูว่านานเอางานที่เคาน์เตอร์เพื่อดูว่าหลายคนเลือกขึ้นงาน (ความต้องการที่จะเห็นได้ชัดนี้มีแนวโน้มที่จะ 1), ลำดับความสำคัญงานรายการสามารถไปบนและบน ในสถานการณ์ที่ซับซ้อนมากขึ้นงานมันจะเป็นไปได้ที่จะระบุว่าหน่วยความจำของผู้ปฏิบัติงานจะต้องเข้าถึง (และดังนั้นจึงเพียง แต่ใช้แรงงานที่เหมาะสม) หรือแม้กระทั่งสิ่งที่ประเภทของผู้ปฏิบัติงานจะต้อง
ช่วยเพิ่มงานตัวอย่างไม่กี่ :
ตารางต่อไปอีกครั้งค่อนข้างง่ายที่จะเข้าใจเหล่านี้จะบันทึกงานของเรามี พวกเขาจะเชื่อมโยงไปยังตารางงานหลักโดยคอลัมน์``jobs_id การแต่งหน้าของตารางนี้มากขึ้นอยู่กับข้อมูลที่คุณจำเป็นที่จะต้องจ่ายให้กับคนงานของคุณช่วยให้ให้เป็นตัวอย่างที่ง่ายมากที่เรามีคอลัมน์ที่สี่ :
- ID : ID ของระเบียน
- ชื่อ : ชื่อของบุคคล
- ที่อยู่ : ที่อยู่ของบุคคล
- jobs_id : รหัสงานที่บันทึกนี้จะเชื่อมโยงกับ
ตารางที่สามและสุดท้ายประกอบด้วยตารางผลก็มีมากเหมือนกันทำขึ้นเป็นตารางบันทึกของเราและมีการเพิ่มของบางคอลัมน์อาจเป็นส่วนหนึ่งของตารางบันทึก :
- job_record_id : การเชื่อมโยงผลที่ได้กับตารางงาน
- ผล : ข้อมูลผลการ
... และนั่นคือทั้งหมดที่คุณต้องการสำหรับการควบคุมงาน! (แม้ว่าในระดับพื้นฐานมาก) ในกรณีของฉันฉันชี้ไปที่ตารางที่ข้อมูลของฉันในการดำเนินการอยู่อีก แต่นี้อาจได้รับเพียงได้อย่างง่ายดายแฟ้มพารามิเตอร์เพื่อเรียกใช้รหัสจำลองคุณชื่อมัน
การเลือกงาน
ตามที่ระบุไว้ก่อนหน้านี้คนงานที่จะทำในการจัดการงานของเราสำหรับเราตอนนี้เพื่อให้ทุกอย่างที่เราต้องการจริงๆทำคือการหางานที่ต้องการการประมวลผลและได้รับข้อมูล วิธีการที่เราจะทำเช่นนี้? ดีเกณฑ์การเลือกรับงานของเราและมองหางานใน SQL ผมต่อไปนี้ :
- ใช้งานใด ๆ ที่ไม่ได้ทำเครื่องหมายเป็นเสร็จสมบูรณ์ แต่จากการปฏิบัติงานของเราและการตั้งค่าพวกเขา (แทน __ME__ กับตัวระบุที่ง่ายที่สุดจะเป็นที่อยู่ IP) :
UPDATE งาน`SET`สถานะ`= 0 WHERE`สถานะ`= 1 และ``started_by = __ME__;
- โดยใช้เกณฑ์การเลือกงานของเราเลือกงานและบอกระบบการควบคุมที่ผู้ปฏิบัติงานนี้คือการจัดการกับมัน
UPDATE งาน`SET`สถานะ`= 1,``started_by = __ME__,`started_at`= NOW () ที่`สถานะ`= 0 หรือ
(`สถานะ`= 1 และ``started_at> DATE_SUB (NOW (), ชั่วโมงช่วง x)) ORDER BY`id`ASC;
ตามงานที่โลภที่ยังไม่ได้ผลลัพธ์ในจำนวนครั้งที่เรามั่นใจว่างานทั้งหมดจะทำงานในกรณีของคนงาน crashing หรือจะ AWOL ที่
- ถัดไปคว้ารายละเอียดงานตามระเบียนที่ตัวเอง :
SELECT * FROM`WHERE`งาน``started_by = __ME__ LIMIT 1;
SELECT * FROM`WHERE`job_records`id`= __JOBID__;
เมื่อเสร็จสิ้นการงานที่เราแทรกระเบียนของเราและผลงานเป็นเครื่องหมายที่สมบูรณ์ โปรดจำไว้ว่าเป็นงานที่สามารถระงับ / ณ เวลาใด ๆ ให้เพื่อความแข็งแรงบางอย่างในสคริปต์ของคุณ มันอาจจะมีที่หยุดงานครึ่งทางปรับปรุงระบบการควบคุมงานเพื่อตรวจสอบจำนวนของระเบียนในงานและจำนวนผลการบันทึกกลับไปที่ระบบการควบคุมงานจะเป็นไปอย่างชาญฉลาด
นอกจากนี้ในขณะนี้แสดงให้เห็นว่างานสามารถเลือกและการจัดการจากกรอบ SQL - แบบสอบถามที่คุณควรจริงๆจะ สรุป การควบคุมงานของคุณเพื่อที่ว่าถ้าคุณตัดสินใจที่จะเปลี่ยนไปใช้บริการเว็บที่เป็นไฟล์ระบบตาม, XML , หรืออื่น ๆ จำนวนของระบบก็จะไม่ส่งผลกระทบต่อรหัสข้างต้นนั้น
การกำหนดค่างาน
ด้านต่อไปที่จะต้องพิจารณาคือขนาดของงานและการกำหนดค่า โดยการเล่นกับการตั้งค่างานที่เราจะสามารถนัดหยุดงานมีความสมดุลที่ดีระหว่างความเร็ว, การจำลองแบบกระบวนการและความน่าเชื่อถือ ใช้สถานการณ์ OFA คู่ :
- ใช้เวลา 1 งานในแต่ละวันเพื่อทำงาน : ซึ่งหมายความว่าคนงานของคุณต้องเป็นเวลา 15 วันในการดำเนินการแต่ละงาน (จำ 10% ของพลังงานสำหรับ 2/3rds ของเวลา) นี้จะชัดเจนไม่ได้กำหนดค่าอย่างชาญฉลาดขนาดงานของคุณเป็นวิธีที่มีขนาดใหญ่เกินไป! มันจะใช้เวลาอย่างน้อยสองครั้งเพื่อให้ได้งานการประมวลผลที่คนงานเริ่มต้นควรจะไป AWOL (เวลาที่จะรับว่ามันไม่ได้ส่งกลับผลบวกกับเวลาประมวลผล) ในอุดมคติของคุณควรมีอย่างน้อยหนึ่งงานเต็มล้างได้อย่างง่ายดายโดยสิ้นสุดระยะเวลาการใช้งานแต่ละยาว, วิธีการที่คุณเก็บงานที่มากกว่าและฟ้องกรณีที่เลวร้ายที่งานจะใช้เวลาสองวันในการดำเนินการครั้งแรกที่ควรจะหายไป
- งานใช้เวลา 1 นาทีในการทำงาน : ซึ่งหมายความว่าคนงานของคุณใช้เวลาประมาณ 15 นาทีเพื่อให้ทำงานแต่ละงาน ขณะนี้ในขั้นแรกอาจดูเหมือนเหมาะที่คุณได้รับการประมวลผลการทำงานเพิ่มเติมในช่วงเวลากลางวันแบ่งการประชุมกาแฟ, etc สถานการณ์นี้จะทำให้ความเครียดในพื้นที่อื่น ๆ ของระบบของคุณและนำเสนอปัญหาของตัวเอง ตัวอย่างเช่นอัตราส่วนแรกเวลาของคุณการติดตั้ง / การประมวลผลเป็นไปขวาลงดังนั้นการสูญเสียประสิทธิภาพของระบบ เครือข่ายของคุณเป็นไปได้อย่างต่อเนื่องสตรีมมิ่งข้อมูลงานไปยังเจ้าหน้าที่ที่ปฏิบัติงานต่างๆที่น่าผิดหวังที่มีดงวันของพวกเขาในการทำงานวัน คุณยังจะวางสายพันธุ์เพิ่มเติมเกี่ยวกับเซิร์ฟเวอร์ในการประมวลผลงานของคุณเป็นมันจะต้องมีจานออกจำนวนมากและจำนวนของชิ้นเล็ก ๆ ของการทำงานเป็นประจำ สุดท้ายในสถานการณ์เช่นนี้หากเซิร์ฟเวอร์ของงานของคุณไปลงที่คุณกำลังจะสร้างกลับเข้าสู่ระบบใหญ่ของการทำงานยังไม่เสร็จสมบูรณ์ในขณะที่งานใหญ่ได้จากการประมวลผลอย่างต่อเนื่องไม่ทราบว่าเซิร์ฟเวอร์สุขสันต์งานได้ประสบปัญหา
ในความเป็นจริงจะไม่มีการตั้งค่าเหมาะสำหรับการติดตั้งอย่างใดอย่างหนึ่งในตารางของคุณมากขึ้นอยู่กับทรัพยากรที่มีอยู่ประเภทของงานงานที่ตอบสนองความต้องการของเวลาที่ความสามารถเครือข่ายและอื่น ๆ แต่หลักเกณฑ์บางอย่างจะเป็น :
- ขนาดงานเพื่อให้แต่ละคนสามารถได้รับการผ่านงาน 3-4 อย่างน้อยในระยะเวลา 15 ชั่วโมง (ที่ยาวที่สุดในช่วงเวลาที่มีโอกาสได้ใช้งาน)
- เล่นกับขนาดงานเพื่อเวลาการติดตั้งที่กลายเป็นธรรมที่ไม่มีนัยสำคัญเมื่อเทียบกับเวลาการประมวลผล (แบกในใจที่จุดด้านบน)
- ถ้างานไม่เสร็จสมบูรณ์ในจำนวนสองเท่าของเวลา (อาจจะน้อยกว่านี้) ที่คุณคาดว่าจะเสร็จสมบูรณ์ก็คิดว่าหายไป AWOL และเริ่มประมวลผลกับคนอื่น ซึ่งหมายความว่าคุณอาจจะต้องรอถึงสามเท่าของความยาวปกติของงานเพื่อให้สมบูรณ์ (อาจจะนานกว่านั้นหากงานที่ตามมาล้มเหลว) คุณอาจต้องการลดเวลาในการนี้ แต่ควรระวังไม่ให้ลดมันมากเกินไปในขณะที่คุณอาจจะเริ่มต้นทำซ้ำงานการประมวลผลเป็นประจำ
- งานควรจะเป็นอิสระจากความต้องการจากภายนอกให้มากที่สุด เซิร์ฟเวอร์งานตัวอย่างเช่นควรจะติดต่อที่จุดเริ่มต้นและจุดสิ้นสุดของทุกงาน
- ไม่เปียกโชกเครือข่ายของคุณนี้จะมีสองผลกระทบเชิงลบ, พนักงานกลางวันของคุณจะพบการใช้เครือข่ายการทำลายและปัญหาที่เกิดขึ้นอาจจะมีประสบการณ์กับการเชื่อมต่อหมดเวลามีปัญหาที่จะได้รับเลวร้ายยิ่งเป็นคุณขนาดตารางของคุณ
- งานตรวจสอบให้แน่ใจสามารถทำงานกับคนงานของคุณ ถ้างานเป็นหน่วยความจำมากเกินไปงานที่สูงหรือพื้นที่ว่างในดิสก์มากจะเริ่มต้นการยกเลิกและสิ่งเดียวที่คุณจะสังเกตเห็นเป็นลดลงในจำนวนของงานการประมวลผลด้วยเหตุผลที่แท้จริงว่าทำไม
ส่งผลของงาน
เมื่อมีการส่งผลของงานเป็นสิ่งสำคัญที่จะตรวจสอบว่าผลลัพธ์ที่ยังไม่ได้ถูกส่งมาโดยคนอื่นโดยเฉพาะถ้าคนงานที่ปัจจุบันได้รับการอยู่เฉยๆสำหรับบางเวลา
เมื่อผลการแสดงความคิดเห็นให้แน่ใจว่าจำนวนของผลลัพธ์ที่ตรงกับจำนวนของระเบียนที่อยู่ภายในงาน
ตามที่ระบุไว้ก่อนหน้านี้และไม่สามารถเกินเน้นการสร้างความอดทนความผิดในการดึงงานและการส่งผล แรงงานที่สามารถ (และมักจะ) เข้าสู่โหมดการระงับการที่ส่วนใหญ่ไม่สะดวกครั้งและตอบสนองความต้องการนี้จะเป็น catered สำหรับ นอกจากนี้ยังมีการสรุปอีกครั้งหนึ่งไปส่งผลลัพธ์ของคุณจะช่วยให้ตอบสนองการเปลี่ยนแปลงในอนาคตระบบการควบคุมงานของคุณง่ายมากที่จะจัดการกับ
ข้อมูลอย่างย่อ
ใน section นี้เราได้ดูสิ่งที่เซิร์ฟเวอร์ควบคุมงานต้องการที่จะทำและวิธีการได้รับระบบขั้นพื้นฐานมากขึ้น เราได้พูดถึงวิธีการดึงงานจากระบบการควบคุมและวิธีการที่ดีที่สุดในการกำหนดค่างานที่จะได้รับมากที่สุดของเราของระบบตารางของคุณสำนักงาน จนจบวรรคหนึ่งหรือสองเกี่ยวกับการส่งผลกลับไปยังเซิร์ฟเวอร์การควบคุมงานได้นำเสนอ
- เซิร์ฟเวอร์การควบคุมงานจัดการงานและให้ความมั่นใจว่าทุกหน่วยงานจะแล้วเสร็จ
- โดยสรุปการส่งงานของคุณเลือกผล / เราสามารถเปลี่ยนเทคโนโลยีของเซิร์ฟเวอร์ควบคุมได้โดยไม่มีปัญหามาก
- การกำหนดค่าการงานของคุณเพื่อให้แน่ใจว่าพวกเขาจะทำงานได้อย่างรวดเร็วและมีประสิทธิภาพโดยไม่ต้องใส่ความดันมากเกินไปในโครงสร้างพื้นฐานเครือข่ายของคุณและไม่มีการทำซ้ำงานการประมวลผลเป็นประจำ
- ตรวจสอบให้แน่ใจว่าคุณได้สร้างความอดทนความผิดและข้อผิดพลาดใน checking ประจำของคุณสามารถระงับการแรงงานและดำเนินการและส่วนใหญ่ไม่สะดวกในครั้งที่ อย่าลืมตรวจสอบหากผลการได้รับแล้วส่งมาโดยคนอื่น
เวลาถัดไป
ใน ส่วนที่ 3 เราจะสร้างเครื่องประมวลผลของเราเสมือนและการตั้งค่าเครื่อง Windows ของเราที่จะกลายเป็นแรงงานที่ไม่ได้ใช้เวลา