- Windmill พิสูจน์ผ่านการทดสอบเบนช์มาร์กว่าเป็นเอนจินเวิร์กโฟลว์โอเพนซอร์สแบบโฮสต์เองได้ที่เร็วที่สุดเมื่อเทียบกับเอนจินเวิร์กโฟลว์อื่น ๆ เช่น Airflow, Prefect, Temporal
- Windmill รองรับภาษาการเขียนโปรแกรมหลากหลาย และมีสภาพแวดล้อมการพัฒนาแบบรวมศูนย์ที่ช่วยให้สร้างและทดสอบเวิร์กโฟลว์ได้ภายในไม่กี่นาที โดยไม่ต้องมี SDK ที่ซับซ้อนหรือกระบวนการดีพลอยที่ยุ่งยาก
- Airflow/Prefect รองรับเพียงรันไทม์เดียว (Python) แต่ Windmill รองรับ Python, Typescript, Go, Bash และรองรับการรัน SQL query โดยตรงกับ BigQuery, Snowflake, Mysql, Postgresql
- เมื่อเทียบกับ Temporal นั้น Temporal เชี่ยวชาญด้านการจัดการคิวงาน แต่ Windmill ยังทำหน้าที่เป็นเอนจินการรันงานแบบทนทานได้ด้วย โดยมีความสามารถในการรอเหตุการณ์ (reactivity) รวมอยู่ด้วย
ความแตกต่างระหว่างเอนจินเวิร์กโฟลว์กับคิวงาน
- คิวงานคือแกนหลักของเอนจินเวิร์กโฟลว์ และนักพัฒนาจำนวนมากก็สร้างตรรกะของตนเองขึ้นมาเพื่อใช้คิวงานโดยไม่ใช้เอนจินเวิร์กโฟลว์
- มีอิมพลีเมนเทชันของคิวอยู่แล้วหลายแบบ เช่น SQS, Kafka, Redis with RMSQ, Orban
- นักพัฒนาจำนวนมากสร้างตรรกะของตนเองโดยยึดคิวงานเป็นศูนย์กลาง จนได้ประสบการณ์ที่คล้ายกับการใช้เอนจินเวิร์กโฟลว์ (หรือก็คือการสร้างเอนจินเวิร์กโฟลว์ของตัวเอง)
เอนจินเวิร์กโฟลว์แบบ "All-Inclusive" คืออะไร
- เอนจินเวิร์กโฟลว์จะประสานงานเวิร์กโฟลว์ในระบบกระจายเพื่อให้งานเสร็จสมบูรณ์ โดยเคารพข้อจำกัดด้านการพึ่งพากันของงาน
- ข้อดีหลัก 5 ประการของเอนจินเวิร์กโฟลว์:
- การจัดสรรทรัพยากร: ใช้คลัสเตอร์ได้อย่างคุ้มค่าสูงสุด สามารถมอบหมายงานทั้งหมดไปยังเวิร์กเกอร์ที่ต่างกันซึ่งมีทรัพยากรต่างกัน (CPU, หน่วยความจำ, GPU) และรับประกันได้ว่าทรัพยากรทั้งหมดของเวิร์กเกอร์จะถูกใช้กับงานนั้น
- การประมวลผลแบบขนาน: หากบางขั้นตอนสามารถรันแบบขนานได้ตามข้อจำกัดของเวิร์กโฟลว์ (branch, for loop) เอนจินเวิร์กโฟลว์ก็สามารถ dispatch ขั้นตอนเหล่านั้นไปยังเวิร์กเกอร์หลายตัวที่แยกจากกันจริง ไม่ใช่แค่เธรดเท่านั้น
- การสังเกตการณ์: ทุกงานมี ID เฉพาะตัว และสามารถสังเกตได้เป็นรายงาน เช่น ตรวจสอบอินพุต ล็อก เอาต์พุต และสถานะได้
- ความทนทาน: หากเครื่องหยุดทำงานหรือเกิดผลข้างเคียงจากเหตุผลที่ไม่คาดคิด ต้องสามารถเริ่มเวิร์กโฟลว์ใหม่ได้
- เวิร์กโฟลว์ควรสามารถเริ่มใหม่ได้เร็วที่สุดเมื่อเกิดเหตุการณ์ไม่คาดคิด และวิธีหนึ่งในการทำเช่นนั้นคือ idempotency ซึ่งหมายถึงการที่การทำงานเดิมซ้ำหลายครั้งให้ผลเหมือนทำเพียงครั้งเดียว
- หากไม่แน่ใจ ให้ replay โฟลว์ทั้งหมดโดยไม่ทำให้เกิดผลลัพธ์ซ้ำ โดยทั่วไปจะทำผ่านไฟล์ล็อกและ SDK ที่ข้ามผลข้างเคียงได้ หาก ID เฉพาะที่แนบกับงานเป็นส่วนหนึ่งของล็อก
- อีกวิธีหนึ่งคือสร้าง transactional snapshot ของสถานะโฟลว์และบันทึกสถานะหลังจบแต่ละงาน เมื่อต้องเริ่มใหม่ก็เพียงโหลดสถานะล่าสุดแล้วทำงานต่อจากจุดนั้น
- Windmill ใช้วิธีหลัง และตั้งสมมติฐานว่าสามารถทำ idempotency ได้ในฝั่งพื้นที่ของผู้ใช้เมื่อจำเป็น
- การตอบสนองต่อเหตุการณ์: หยุดโฟลว์ชั่วคราวจนกว่าจะมีเหตุการณ์ เช่น webhook หรือการอนุมัติ แล้วจึงกลับมาทำงานต่อ
เคล็ดลับที่ทำให้ Windmill เร็ว
- Windmill ใช้ Postgresql และ Rust เพื่อเพิ่มประสิทธิภาพสูงสุดผ่านการออกแบบที่เรียบง่ายและการปรับจูน
การออกแบบระบบและคิว
- Windmill ให้มาเป็นไบนารีเดี่ยวที่คอมไพล์ด้วย Rust โดยเวิร์กเกอร์และเซิร์ฟเวอร์เชื่อมต่อกับ Postgresql แต่ไม่ได้เชื่อมต่อถึงกันโดยตรง
- มีการอิมพลีเมนต์คิวไว้ภายใน Postgresql เอง และงานสามารถถูกทริกเกอร์จากภายนอกผ่าน API ได้
สถานะ
- เอนจินเวิร์กโฟลว์แทนงานด้วย finite state machine (FSM) และ Windmill จัดการทั้งโฟลว์เป็น FSM ด้วยตัวมันเอง
การส่งผ่านข้อมูล
- Windmill มีหลายวิธีสำหรับการส่งผ่านข้อมูล เช่น JavaScript expression, การแชร์โฟลเดอร์ชั่วคราว, การผสานรวมกับ S3
ประสิทธิภาพของเวิร์กเกอร์
- เวิร์กเกอร์ของ Windmill ประมวลผลงานครั้งละหนึ่งงาน และรันงานโดยไม่ใช้คอนเทนเนอร์เพื่อเพิ่มประสิทธิภาพ
บทสรุป
- Windmill เป็นโอเพนซอร์สและเป็น serverless runtime กับแพลตฟอร์มที่โฮสต์เองได้ ซึ่งมอบความเร็วสูงมากด้วยการออกแบบที่เรียบง่ายและการปรับจูนบนพื้นฐานของ Postgresql และ Rust
ความเห็นของ GN⁺
ประเด็นสำคัญที่สุดของบทความนี้คือ Windmill รองรับภาษาการเขียนโปรแกรมที่หลากหลาย และมีสภาพแวดล้อมการพัฒนาแบบรวมศูนย์ที่ช่วยให้สร้างและทดสอบเวิร์กโฟลว์ได้อย่างรวดเร็วโดยไม่ต้องมี SDK ที่ซับซ้อนหรือกระบวนการดีพลอยที่ยุ่งยาก คุณสมบัติเหล่านี้มีประโยชน์อย่างมากสำหรับนักพัฒนาซอฟต์แวร์ และประสิทธิภาพกับความเร็วของ Windmill ก็จะช่วยให้นักพัฒนาปล่อยผลิตภัณฑ์ที่ดีกว่าได้เร็วขึ้น บทความนี้มีเนื้อหาที่น่าสนใจสำหรับนักพัฒนา โดยเฉพาะผู้ที่กำลังสร้างเอนจินเวิร์กโฟลว์ของตนเองหรือพยายามปรับแต่งเอนจินที่มีอยู่ให้เหมาะสมยิ่งขึ้น
2 ความคิดเห็น
Windmill - โอเพนซอร์สสำหรับการสร้างแอปภายในองค์กรและแพลตฟอร์มอัตโนมัติบนพื้นฐาน Python
เมื่อเดือนพฤษภาคมปีก่อนมีการเปิดเผยออกมาเล็กน้อย ตอนนั้นผู้พัฒนาบอกว่ายังไม่พร้อมจะเปิดตัวต่อสาธารณะ และบอกว่าอีก 10 นาทีจะเข้าไปสัมภาษณ์กับ YC! แล้วหลังจากนั้นก็มาเขียนคอมเมนต์ว่าผ่าน YC แล้ว
หลังจากผ่าน YC และลุยมา 1 ปีครึ่ง ก็เปิดตัวผลิตภัณฑ์อย่างเป็นทางการเสียทีครับ
ความคิดเห็นบน Hacker News