4 คะแนน โดย GN⁺ 2024-07-24 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • 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 ความคิดเห็น

 
GN⁺ 2024-07-24
ความคิดเห็นจาก Hacker News
  • เคยประทับใจกับบล็อกเทคขององค์กรและระบบภายใน แต่ตอนนี้ตระหนักแล้วว่าโค้ดคือหนี้

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

    • Netflix, Uber, Amazon ต่างก็สร้างหลายโซลูชัน
    • วิศวกรดูเหมือนจะสนใจการสร้าง workflow engine
  • ความเห็นจากผู้ก่อตั้ง Windmill.dev

    • Maestro กับ Windmill มีความคล้ายกันหลายอย่าง
    • ความแตกต่างหลัก:
      • Windmill เขียนด้วย Rust
      • Maestro ใช้ CockroachDB ส่วน Windmill ใช้อัลกอริทึม sharding ของตัวเอง
      • ความต่างด้านไลเซนส์: Maestro เป็น Apache 2.0, Windmill เป็น AGPL
      • เมื่อเทียบกับ Maestro ที่ได้แรงสนับสนุนจาก Netflix แล้ว Windmill เป็นบริษัทเล็ก
      • Maestro ยังขาดเอกสารสำหรับ self-hosting และ UI
  • แชร์ประสบการณ์ใช้งาน Activebatch

    • Activebatch ให้สภาพแวดล้อมอัตโนมัติที่ทรงพลังได้ด้วยการติดตั้ง MS SQL DB แบบเรียบง่ายและ Windows GUI
    • Airflow และคู่แข่งโอเพนซอร์สรายอื่นซับซ้อนกว่า
    • น่าเสียดายที่ Activebatch ไม่ค่อยแพร่หลายเพราะโมเดลการขายแบบองค์กร
  • ความสับสนเกี่ยวกับการใช้ Netflix/Conductor

    • โปรเจกต์ดูเหมือนจะใช้ Netflix/Conductor แต่กำลังใช้เวอร์ชันที่ถูกเก็บถาวรแล้ว
    • ไม่ได้ใช้ Orkes Conductor
  • ความเห็นเกี่ยวกับ orchestrator

    • โอเพนซอร์สและการพัฒนาแบบเปิดเป็นเรื่องยอดเยี่ยม แต่มี orchestrator อยู่แล้วมากมาย
    • ตัวเลือกใหม่มีโอกาสถูกใช้งานเชิงพาณิชย์ต่ำ
  • เปรียบเทียบกับ Temporal

    • Maestro เขียนด้วย Java ส่วน Temporal เขียนด้วย Go
  • การประเมินเชิงบวกต่อโปรเจกต์

    • อยากสร้างอะไรคล้ายกันสำหรับโปรเจกต์ ML และ data engineering
    • รอคอยที่จะได้ลองทดสอบ
  • คำถามเรื่องความแตกต่างจาก Conductor

    • พบความคล้ายกันหลายจุดในโค้ด
    • ใช้ JSON เป็นภาษาสำหรับนิยาม workflow
  • คำวิจารณ์ต่อเนื้อหาบทความ

    • รู้สึกเหมือนเขียนโดย AI
    • ควรมีตัวอย่าง workflow ของกรณีใช้งานจริง