-
แนะนำ
- Hydro เป็นเฟรมเวิร์กการเขียนโปรแกรมแบบกระจายระดับสูงสำหรับ Rust
- Hydro ช่วยให้เขียนบริการแบบกระจายที่ขยายขนาดได้อย่างรวดเร็ว และรับประกันความปลอดภัยของระบบแบบกระจาย เช่นเดียวกับที่ Rust รับประกันความปลอดภัยของหน่วยความจำ
- รองรับการรันโปรแกรมแบบกระจายได้อย่างง่ายดายในโหมดทดสอบหรือโหมดดีพลอย
-
คุณสมบัติของ Hydro
- Hydro เป็นภาษาการไหลของข้อมูลแบบกระจายที่ขับเคลื่อนด้วยรันไทม์ DFIR แบบเธรดเดี่ยวประสิทธิภาพสูง
- ต่างจากสถาปัตยกรรมดั้งเดิมอย่าง actor หรือ RPC โดยมี API แบบ choreographic ที่สามารถอธิบายการคำนวณข้ามหลายตำแหน่งได้
- ทำงานร่วมกับ Hydro Deploy เพื่อให้สามารถดีพลอยและรันโปรแกรม Hydro แบบกระจายได้อย่างง่ายดายทั้งบนเครื่องโลคัลหรือบนคลาวด์
-
การคอมไพล์และการดีพลอย
- Hydro ใช้แนวทางการคอมไพล์แบบสองขั้นตอน
- โปรแกรม Hydro เป็นโปรแกรม Rust มาตรฐานที่สร้าง แผนการดีพลอย บนแล็ปท็อปของนักพัฒนา
- แผนนี้จะถูกคอมไพล์เป็น DFIR เพื่อสร้างไบนารีแยกสำหรับแต่ละเครื่องในระบบแบบกระจาย
- จากนั้นจึงดีพลอยขึ้นคลาวด์โดยใช้แผนที่สร้างขึ้นและสเปกทรัพยากรคลาวด์
-
กรณีการใช้งาน
- Hydro ถูกใช้ในการพัฒนาระบบแบบกระจายประสิทธิภาพสูง เช่น 2-phase commit และ Paxos
- กำลังพัฒนาไลบรารีมาตรฐานสำหรับระบบแบบกระจายที่ให้โปรโตคอลเหล่านี้เป็นคอมโพเนนต์ที่นำกลับมาใช้ซ้ำได้
-
ข้อควรทราบ
- เอกสารของ Hydro ยังอยู่ระหว่างการจัดทำ และหากมีคำถามหรือพบบั๊ก แนะนำให้เปิด issue ใน GitHub repository ของ Hydro
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
มีการนำเสนอใน YouTube ที่อธิบายโปรเจกต์ Hydro ได้ดี โดยเน้นไปที่ DFIR เป็นหลัก
https://www.youtube.com/watch?v=YpMKUQKlak0&ab_channel=ACMSI...
ดูเหมือนว่ายังต้องมี ตัวอย่างการใช้งานจริง เพิ่มเติม เพื่อให้เข้าใจว่าควรนำไปใช้กับอะไรจึงจะเหมาะ
ตอนนี้กำลังสร้างแอปพลิเคชันที่ซับซ้อนขึ้นอย่างที่เก็บคีย์-ค่าอยู่ด้วย
ถ้ามีภาษากลางพร้อม runtime ของตัวเองอยู่ตรงกลาง ก็สงสัยว่าจะเสียข้อดีที่ Rust ให้มาหรือไม่
ตอนแรกคิดว่าจะเป็นภาษาที่คอยประสานไบนารี Rust แยกหลายตัวให้รวมกันเป็นระบบกระจายที่สอดคล้องและทำงานได้ แต่ดูเหมือนว่าจะเขียนด้วย DFIR ตั้งแต่ต้นจนจบ ไม่ใช่แค่ระดับกาวเชื่อม
ตัวดำเนินการของ DFIR (map, filter ฯลฯ) รับ Rust closure ดังนั้นจึงสามารถส่งต่อจากภาษาระดับสูงไปจนถึงไบนารี Rust ขั้นสุดท้ายได้ตามเดิม จากมุมมองผู้ใช้ จึงไม่ต้องจัดการ DFIR โดยตรง
น่าสนใจมาก ถ้ามีใครรู้จักสาขานี้ อยากให้ช่วยบอกงานวิจัยก่อนหน้าหรือเฟรมเวิร์กคล้าย ๆ กันที่เคยมีในภาษาอื่นด้วย
ฝั่ง dataflow มีหลายคนทำงานกันมา และผมคิดว่า Materialize ค่อนข้างเจ๋ง อีกทั้งเคยใช้ Kafka Streams ในงานด้วย ผมมองว่าเฟรมเวิร์กที่รวมสิ่งเหล่านี้เข้าด้วยกันน่าจะมีความหมาย
โดยเฉพาะการที่มีพื้นฐานเป็น Rust จึงอาจมีพลังตรงที่เข้ากับภาษาอื่นได้ดี Spark เลือก JVM ได้ดีในแง่ portability แต่ก็พาความซับซ้อนเข้ามามาก ส่วน Dask รันบน Python จึงเป็น dependency ที่ค่อนข้างหนักถ้าไม่ได้อยู่ในบริบทที่ใช้ Python อยู่แล้ว
ฝั่ง distributed Rust ผมเคยดู Lunatic ด้วย และก็ดูใช้ได้ แต่ดูเหมือนจะอยู่ในระดับต่ำกว่าที่ Hydro มุ่งไปเล็กน้อย
ดังนั้น https://doc.akka.io/libraries/akka-core/current/stream/index... อาจเป็นตัวเปรียบเทียบที่ใกล้เคียงที่สุด
https://rise.cs.berkeley.edu/projects/
การประมวลผลข้อมูลและระบบกระจายส่วนใหญ่มีจุดเชื่อมโยงกับงานวิจัยที่แล็บนี้ทำมาในระดับหนึ่ง
ชอบความพยายามนี้นะ แต่หวังว่าสักวันระบบนิเวศ Rust จะมีอะไรอย่าง akka.rs เข้ามา
สงสัยว่าเมื่อมองจากมุม dataflow แล้วเทียบกับ timely [0] อย่างไร และสงสัยด้วยว่าสามารถแสดง control flow อย่าง loop ใน intermediate representation ได้หรือไม่
[0] https://github.com/TimelyDataflow/timely-dataflow
ใกล้เคียงกับ functional reactive programming, composition, flow of flows, ตัวดำเนินการเชิงพีชคณิต และแนวทางที่เน้นการพิสูจน์ มีแนวคิดเรื่อง “progress” ที่ต่างจาก Timely มาก และเน้นการรับประกันว่า composition จะเป็นแบบ productive แม้กับอินพุต streaming ที่อาจไม่มีที่สิ้นสุด
จริง ๆ แล้ว Flo แทบไม่มีแนวคิดเรื่อง “timeliness” และไม่มี timestamp ด้วย รองรับ nested iteration เหมือน Timely แต่กลไกต่างกันมาก พีชคณิตพื้นฐานมีลักษณะ acyclic อย่างยิ่ง แต่การทำให้ nested stream/graph เป็นรูปแบบทางการทำให้รองรับ iteration ได้
เปเปอร์ยังเปรียบเทียบโดยตรงกับ DBSP ด้วย ซึ่งเท่าที่ผมเข้าใจ DBSP ก็อยู่ในสาย Timely/Naiad เช่นกัน ผู้เขียนมองว่า Flo อาจเป็นกรอบความหมายรวมสำหรับระบบคล้ายกันหลายตัว เช่น Flink, LVars, DBSP
ดังนั้นผู้เขียน Flo จึงรู้จัก Naiad/Timely ดีและได้รับแรงบันดาลใจจากกราฟ nested iteration แต่ในด้านอื่น ๆ ผมมองว่าต่างกันมาก
[0] https://hydro.run/papers/flo.pdf
ถ้าแต่ละ “โปรเซส” ถูกดีพลอยเป็นไบนารีแยกกัน ก็น่าจะหมายความว่ามันรันเป็นโปรเซสแยกกันด้วย ซึ่งดูเหมือนจะมีปัญหาในแง่ โอเวอร์เฮดที่เพิ่มขึ้น
อยากรู้ว่าทำให้สื่อสารได้เร็วได้อย่างไร ใช้กลไกอย่าง shared memory IPC ที่เร็ว ๆ หรือเปล่า?
อีกอย่างก็ไม่เห็นเนื้อหาเกี่ยวกับการผสานกับ async ด้วย ไม่ว่าจะชอบหรือไม่ โค้ดส่วนใหญ่ท่วมท้นที่จัดการ networking ก็ย้ายไปใช้ async แล้ว และในหลายพื้นที่ที่ต้องใช้ networking ก็หาไลบรารีที่ไม่ใช่ asynchronous ดี ๆ ได้ยาก
ดังนั้นถ้าต้องการ parallelism บนเครื่องเดียว ก็จะมีโอเวอร์เฮดเพิ่มเติมอยู่บ้าง อย่างที่คุณพูดไว้ นี่เป็นส่วนที่เราอยากแก้ให้ได้ในอนาคตผ่าน shared memory
เมื่อสัปดาห์ที่แล้วที่ POPL 2025 นักศึกษาปริญญาตรีที่ร่วมทำ Hydro ได้นำเสนอคอมไพเลอร์ที่คอมไพล์บล็อกโค้ด async-await เป็น data flow ของ Hydro โดยอัตโนมัติ ยังอยู่ระหว่างพัฒนาและยังไม่มีเอกสาร แต่ดูได้ที่นี่: https://github.com/hydro-project/HydraulicLift
ดูเจ๋งมาก และนึกวิธีใช้งานได้หลายแบบ โดยเฉพาะ ส่วนการดีพลอย ที่ดูไม่เหมือนใคร
รอให้เอกสารสมบูรณ์ขึ้น และอยากรู้เป็นพิเศษเกี่ยวกับ Streams, Singletons, Optionals ซึ่งดูเหมือนจะเป็นส่วนหลัก
ชอบโมเดลการเขียนโปรแกรมนี้ อยากรู้ว่าตอน rewrite แอปพลิเคชัน มีการทำ การปรับแต่งเครือข่ายให้เหมาะสม ด้วยหรือไม่
อยากรู้ว่ารองรับการจัดการคอขวดของเครือข่ายหรือ congestion หรือเปล่า
อยากรู้ว่าเทียบกับกรณีที่ใช้ของอย่าง Ballista สำหรับ data pipeline แล้วเป็นอย่างไร
Ballista ได้ประโยชน์มากจากการสร้างอยู่บน Apache Arrow และ Apache Datafusion
เป้าหมายไม่ใช่การรันคิวรี SQL แต่เป็นการปฏิบัติกับโค้ดระบบแบบกระจาย (เช่น การสร้างไมโครเซอร์วิส) ให้เหมือนคิวรี SQL การผสานกับ Arrow และ Parquet ก็อยู่ในโรดแมปด้วย