งานสร้างแบบกระจาย

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

การแคชจากระยะไกล

ประเภทที่ง่ายที่สุดของบิลด์ที่เผยแพร่คือบิลด์ที่ใช้ประโยชน์จากการแคชระยะไกลเท่านั้น ดังที่แสดงในรูปที่ 1

บิลด์ที่เผยแพร่พร้อมการแคชระยะไกล

รูปที่ 1 บิลด์ที่กระจายแสดงการแคชจากระยะไกล

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

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

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

การดำเนินการจากระยะไกล

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

ระบบการดำเนินการจากระยะไกล

รูปที่ 2 ระบบการดำเนินการจากระยะไกล

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

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

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

งานสร้างที่เผยแพร่ที่ Google

ตั้งแต่ปี 2008 Google ได้ใช้ระบบบิลด์แบบกระจายที่ใช้ทั้งการแคชระยะไกลและการดำเนินการจากระยะไกล ดังที่อธิบายไว้ในรูปที่ 3

ระบบการสร้างระดับสูง

รูปที่ 3 ระบบบิลด์แบบกระจายของ Google

แคชระยะไกลของ Google เรียกว่า ObjFS ซึ่งประกอบด้วยแบ็กเอนด์ที่เก็บเอาต์พุตของบิลด์ใน Bigtable ที่กระจายทั่วทั้งกลุ่มเครื่องที่ใช้งานจริงของเรา และ Daemon ของ FUSE ฟรอนท์เอนด์ชื่อ objfsd ที่ทำงานบนเครื่องของนักพัฒนาซอฟต์แวร์แต่ละราย Daemon ของ FUSE ช่วยให้วิศวกรเรียกดูเอาต์พุตต่างๆ ได้ราวกับว่าเป็นไฟล์ปกติที่จัดเก็บไว้ในเวิร์กสเตชัน แต่มีเนื้อหาไฟล์ที่ดาวน์โหลดมาแบบออนดีมานด์เฉพาะสำหรับไฟล์ไม่กี่ไฟล์ที่ผู้ใช้ขอโดยตรงเท่านั้น การแสดงเนื้อหาไฟล์แบบออนดีมานด์ช่วยลดการใช้เครือข่ายและดิสก์ได้อย่างมาก และระบบสามารถสร้างได้เร็วขึ้น 2 เท่าเมื่อเทียบกับตอนที่เราจัดเก็บเอาต์พุตทั้งหมดของบิลด์ไว้ในดิสก์ภายในของนักพัฒนาซอฟต์แวร์

ระบบการดำเนินการจากระยะไกลของ Google เรียกว่า Forge ไคลเอ็นต์ Forge ใน Blaze (เครื่องมือที่เทียบเท่าภายในของ Bazel) ที่เรียกว่าผู้จัดจำหน่ายส่งคำขอสำหรับการดำเนินการแต่ละรายการไปยังงานที่ทำงานอยู่ในศูนย์ข้อมูลของเราที่เรียกว่าเครื่องจัดตารางเวลา เครื่องจัดตารางเวลาจะเก็บแคชของผลลัพธ์การดำเนินการไว้ ซึ่งทำให้สามารถแสดงการตอบกลับได้ทันทีหากการดำเนินการนั้นสร้างขึ้นโดยผู้ใช้อื่นของระบบแล้ว แต่ถ้ายังไม่ได้ทำก็จะวางการดำเนินการไว้ในคิว งานผู้ดำเนินการกลุ่มใหญ่จะอ่านการดำเนินการจากคิวนี้อย่างต่อเนื่อง ดำเนินการ และจัดเก็บผลลัพธ์ใน Bigtable ของ ObjFS โดยตรง ผู้ดำเนินการสามารถใช้ผลลัพธ์เหล่านี้เพื่อดำเนินการในอนาคตได้ หรือให้ผู้ใช้ปลายทางดาวน์โหลดผ่าน objfsd ก็ได้

ผลลัพธ์ที่ได้คือระบบปรับขนาดให้รองรับบิลด์ทั้งหมดที่ดำเนินการใน Google ได้อย่างมีประสิทธิภาพ งานสร้างของ Google มีขนาดมหึมาจริงๆ Google ใช้เวอร์ชันทดสอบนับล้านๆ กรอบการทดสอบ และผลิตเอาต์พุตของบิลด์จากซอร์สโค้ดหลายพันล้านบรรทัดทุกวัน ระบบนี้ไม่เพียงช่วยให้วิศวกรของเราสร้างฐานโค้ดที่ซับซ้อนได้อย่างรวดเร็ว แต่ยังช่วยให้เราใช้เครื่องมือและระบบอัตโนมัติจำนวนมากที่อาศัยการสร้างของเราได้ด้วย