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

วันที่ รายงานปัญหา ดูแหล่งที่มา ตอนกลางคืน · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

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

ประเภทที่เรียบง่ายที่สุดของบิลด์แบบกระจายคือบิลด์ที่ใช้ประโยชน์จากรีโมต caching ซึ่งแสดงในรูปที่ 1

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

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

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

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

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

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

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

ระบบปฏิบัติการระยะไกล

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

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

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

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

การเผยแพร่บิลด์ที่ Google

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

ระบบบิลด์ระดับสูง

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

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

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

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