-
Maestro: ตัวออร์เคสเตรเตอร์เวิร์กโฟลว์ของ Netflix
-
TL;DR
- Netflix เปิดซอร์สโค้ดของ Maestro แล้ว
- เริ่มต้นใช้งานได้จากที่เก็บบน GitHub และหากคิดว่ามีประโยชน์ก็ขอให้ช่วยกดดาว
-
Maestro คืออะไร
- Maestro เป็นเวิร์กโฟลว์ออร์เคสเตรเตอร์แบบทั่วไปที่ออกแบบมาเพื่อจัดการเวิร์กโฟลว์ขนาดใหญ่ และสามารถขยายระบบในแนวนอนได้
- จัดการวงจรชีวิตทั้งหมดของเวิร์กโฟลว์ เช่น data pipeline และ pipeline สำหรับฝึกโมเดลแมชชีนเลิร์นนิง
- ผู้ใช้สามารถแพ็ก business logic ได้ในหลายรูปแบบ เช่น Docker image, notebook, bash script, SQL และ Python
- ต่างจากเวิร์กโฟลว์ออร์เคสเตรเตอร์แบบดั้งเดิมที่รองรับเพียง DAG (Directed Acyclic Graph) เท่านั้น Maestro รองรับทั้งเวิร์กโฟลว์แบบมีวัฏจักรและไม่มีวัฏจักร พร้อมทั้งมีแพตเทิร์นที่นำกลับมาใช้ซ้ำได้หลายแบบ เช่น foreach loop, subworkflow และ conditional branching
-
เส้นทางของ Maestro
- ย้ายเวิร์กโฟลว์หลายแสนรายการได้สำเร็จโดยกระทบต่อผู้ใช้น้อยที่สุด
- ในช่วง 1 ปีที่ผ่านมา จำนวนงานที่รันเพิ่มขึ้น 87.5% และปัจจุบันรันงานเฉลี่ยวันละ 500,000 งาน
-
ความสามารถในการขยายระบบและความอเนกประสงค์
- Maestro เป็นเวิร์กโฟลว์ออร์เคสเตรเตอร์แบบ fully managed ที่ให้บริการ Workflow-as-a-Service แก่ผู้ใช้ปลายทาง แอปพลิเคชัน และบริการหลายพันรายการของ Netflix
- รองรับกรณีการใช้งานเวิร์กโฟลว์ที่หลากหลาย เช่น ETL pipeline, ML workflow และ AB testing pipeline
- Netflix เชื่อว่าควรมีออร์เคสเตรเตอร์เพียงตัวเดียวที่ดูแลทั้งหมดได้ เพราะตารางข้อมูลของบริษัทอยู่ใน data warehouse เดียวกัน
-
แนะนำ Maestro
- ใช้นิยามเวิร์กโฟลว์ที่กำหนดในรูปแบบ JSON
- ผสานฟิลด์ที่ผู้ใช้กำหนดเองเข้ากับฟิลด์ที่ Maestro ดูแล เพื่อสร้างนิยาม orchestration ที่ยืดหยุ่นและทรงพลัง
- นิยามเวิร์กโฟลว์ประกอบด้วย properties และเวิร์กโฟลว์ที่มีการจัดการเวอร์ชัน
- properties รวมถึงข้อมูลผู้เขียนและเจ้าของ รวมถึงการตั้งค่าการรัน
- เวิร์กโฟลว์ที่มีการจัดการเวอร์ชันประกอบด้วยตัวระบุที่ไม่ซ้ำกัน ชื่อ คำอธิบาย แท็ก การตั้งค่า timeout และระดับความสำคัญ
-
กลยุทธ์การรันเวิร์กโฟลว์
- กลยุทธ์การรันแบบลำดับ: รันเวิร์กโฟลว์ทีละตัวตามลำดับ FIFO
- กลยุทธ์การรันแบบลำดับอย่างเข้มงวด: หากมีข้อผิดพลาดแบบบล็อก จะหยุดการรันไว้และต้องแก้ไขด้วยตนเอง
- กลยุทธ์รันเฉพาะตัวแรก: นำเวิร์กโฟลว์อินสแตนซ์ใหม่ออกจากคิวจนกว่าเวิร์กโฟลว์ที่กำลังรันอยู่จะเสร็จสิ้น
- กลยุทธ์รันเฉพาะตัวล่าสุด: รันเฉพาะเวิร์กโฟลว์ที่ถูกทริกเกอร์ล่าสุด และหยุดอินสแตนซ์เดิมที่กำลังรันอยู่
- กลยุทธ์การรันขนานแบบจำกัด concurrency: รันเวิร์กโฟลว์หลายอินสแตนซ์แบบขนานตามขีดจำกัด concurrency ที่กำหนดไว้ล่วงหน้า
-
การรองรับพารามิเตอร์และภาษาสำหรับนิพจน์
- รองรับพารามิเตอร์แบบไดนามิกและ code injection ซึ่งช่วยเพิ่มความยืดหยุ่นและความเป็นไดนามิกของเวิร์กโฟลว์อย่างมาก
- เพื่อแก้ปัญหาด้านความมั่นคงปลอดภัยและความปลอดภัย จึงพัฒนา parser สำหรับ expression language แบบคัสตอมขึ้นเอง
- Simple and Safe Expression Language (SEL): ภาษานิพจน์ที่เรียบง่ายและปลอดภัย ซึ่งพัฒนามาเพื่อแก้ความเสี่ยงที่เกี่ยวข้องกับ code injection
- output parameter: สามารถส่ง output parameter จากการรันของผู้ใช้กลับเข้าสู่ระบบได้
- parameterized workflow: เริ่มต้นแต่ละขั้นตอนในช่วง runtime ตามพารามิเตอร์ที่ผู้ใช้กำหนด
-
แพตเทิร์นการรันเวิร์กโฟลว์
- รองรับ Foreach: ใช้รันงานเดียวกันซ้ำ ๆ ด้วยพารามิเตอร์ที่ต่างกัน
- รองรับ conditional branching: รันขั้นตอนถัดไปเมื่อเงื่อนไขที่กำหนดเป็นจริงเท่านั้น
- รองรับ subworkflow: ทำให้สามารถแชร์ฟังก์ชันการทำงานร่วมกันระหว่างหลายเวิร์กโฟลว์ได้
-
รันไทม์ของขั้นตอนและพารามิเตอร์ของขั้นตอน
- อินเทอร์เฟซรันไทม์ของขั้นตอน: อินเทอร์เฟซที่ใช้อธิบายงานในขณะรัน
- การรวมพารามิเตอร์ของขั้นตอน: ฉีดพารามิเตอร์ runtime และแท็กก่อนการรันขั้นตอน เพื่อควบคุมพฤติกรรมของขั้นตอนแบบไดนามิก
-
การพึ่งพากันของขั้นตอนและสัญญาณ
- สามารถใช้งานการพึ่งพากันของขั้นตอนเพื่อแสดงความสัมพันธ์ด้านการรันได้
- สัญญาณคือส่วนของข้อความที่ใช้ส่งข้อมูล รวมถึงค่าพารามิเตอร์
-
เบรกพอยต์
- สามารถตั้งเบรกพอยต์ในขั้นตอนของเวิร์กโฟลว์ได้ โดยทำงานคล้ายเบรกพอยต์ระดับโค้ด
- เมื่อถึงเบรกพอยต์ ขั้นตอนนั้นจะเข้าสู่สถานะ "หยุดชั่วคราว" และความคืบหน้าของกราฟเวิร์กโฟลว์จะหยุดไว้จนกว่าผู้ใช้จะสั่งทำงานต่อด้วยตนเอง
-
ไทม์ไลน์
- บันทึกทุกเหตุการณ์สำคัญ รวมถึงไทม์ไลน์การรันของแต่ละขั้นตอน
- มีประโยชน์ต่อการดีบักและช่วยให้มองเห็นสถานะของขั้นตอนได้ลึกขึ้น
-
นโยบายการลองใหม่
- รองรับนโยบายการลองใหม่สำหรับขั้นตอนที่เข้าสู่สถานะสิ้นสุดเนื่องจากความล้มเหลว
- แยกการลองใหม่ที่เกิดจากข้อผิดพลาดของแพลตฟอร์มออกจากเงื่อนไขที่ผู้ใช้กำหนดเอง
-
มุมมองแบบรวม
- สามารถดูสถานะแบบรวมของทุกขั้นตอนในเวิร์กโฟลว์อินสแตนซ์ได้
- คำนวณสถานะแบบรวมโดยผสานข้อมูล runtime ของการรันปัจจุบันเข้ากับค่ารวมพื้นฐาน
-
Rollup
- ให้ภาพสรุประดับสูงของเวิร์กโฟลว์อินสแตนซ์
- อธิบายรายละเอียดสถานะของแต่ละขั้นตอนและจำนวนขั้นตอนในแต่ละสถานะ
-
การเผยแพร่อีเวนต์ของ Maestro
- สร้างอีเวนต์และเผยแพร่ไปยังระบบภายนอกเมื่อมีการเปลี่ยนแปลงในนิยามเวิร์กโฟลว์ เวิร์กโฟลว์อินสแตนซ์ หรือสเต็ปอินสแตนซ์
- แบ่งเป็นอีเวนต์ภายในและอีเวนต์ภายนอก
-
เริ่มต้นใช้งาน Maestro
- ถูกใช้งานอย่างกว้างขวางภายใน Netflix และตอนนี้ได้เปิดซอร์สโค้ดแล้ว
- สามารถดูโค้ดได้ในที่เก็บบน GitHub และหากมีคำถามหรือข้อคิดเห็น ขอให้สร้าง GitHub issue
-
คำขอบคุณ
- กล่าวขอบคุณสมาชิกทีมที่มีส่วนร่วมในโปรเจกต์ Maestro และเพื่อนร่วมงานที่ Netflix
สรุปโดย GN⁺
- Maestro เป็นออร์เคสเตรเตอร์ที่ออกแบบมาเพื่อจัดการเวิร์กโฟลว์ขนาดใหญ่ของ Netflix และรองรับ business logic ได้หลากหลายรูปแบบ
- พารามิเตอร์แบบไดนามิกและ code injection ช่วยเพิ่มความยืดหยุ่นและความเป็นไดนามิกอย่างมาก
- มีทั้งกลยุทธ์การรันและแพตเทิร์นที่หลากหลาย ทำให้กำหนดและจัดการเวิร์กโฟลว์ที่ซับซ้อนได้ง่าย
- เหมาะกับการจัดการแหล่งข้อมูลเดี่ยว เช่น data warehouse ของ Netflix
- ออร์เคสเตรเตอร์อื่นที่ให้ความสามารถคล้ายกัน ได้แก่ Apache Airflow และ Prefect
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
เคยประทับใจกับบล็อกเทคขององค์กรและระบบภายใน แต่ตอนนี้ตระหนักแล้วว่าโค้ดคือหนี้
สงสัยว่ากว่าจะทำให้วิศวกรพอใจกับโซลูชัน workflow ต้องผ่านการวนซ้ำกี่รอบ
ความเห็นจากผู้ก่อตั้ง Windmill.dev
แชร์ประสบการณ์ใช้งาน Activebatch
ความสับสนเกี่ยวกับการใช้ Netflix/Conductor
ความเห็นเกี่ยวกับ orchestrator
เปรียบเทียบกับ Temporal
การประเมินเชิงบวกต่อโปรเจกต์
คำถามเรื่องความแตกต่างจาก Conductor
คำวิจารณ์ต่อเนื้อหาบทความ