Iggy.rs - การสตรีมข้อความที่สร้างด้วย Rust
(blog.iggy.rs)ที่มา
- ในเดือนเมษายน 2023 ตัดสินใจเรียนรู้ Rust
- จากประสบการณ์ด้านระบบกระจายและการรับส่งข้อความ จึงตัดสินใจพัฒนาแพลตฟอร์มสตรีมข้อความ
- เป้าหมายคือเพื่อทำความเข้าใจหลักการทำงานภายในของระบบรับส่งข้อความและ trade-off ที่นักพัฒนาต้องเผชิญ
- Iggy.rs จึงถือกำเนิดขึ้น โดยตั้งเป้าเป็นแพลตฟอร์มสตรีมข้อความที่เน้นความเร็วและความเบา
โปรเจกต์
- Iggy รุ่นแรกใช้โปรโตคอล QUIC เพื่อให้ความสามารถพื้นฐานในการแลกเปลี่ยนข้อความ
- ผ่านการทำต้นแบบและปรับปรุงอย่างต่อเนื่อง จนได้เซิร์ฟเวอร์ที่รองรับการเขียน/อ่านแบบขนานและสตรีมที่แยกอิสระ
- เพิ่มการรองรับโปรโตคอล TCP และ HTTP พร้อมปรับปรุงประสิทธิภาพผ่านการเพิ่มประสิทธิภาพกลไกซิงก์ข้อมูล
- จากการทำเบนช์มาร์กพบว่ามี throughput สูงและ latency ต่ำ จึงเปลี่ยนเป็นโปรเจกต์ระยะยาว
ทีม
- Iggy มีทีมราว 10 คนที่ร่วมกันมีส่วนช่วยในหลายด้าน
- มีส่วนร่วมในโปรเจกต์หลากหลาย เช่น คอร์เซิร์ฟเวอร์, SDK, เว็บ UI และ CLI
- นักพัฒนาที่มีประสบการณ์หลากหลายและมีความหลงใหลในการเขียนโปรแกรม เข้าร่วมกันโดยสมัครใจ
- การมีส่วนร่วมของผู้ร่วมพัฒนาภายนอกจากทั่วโลกช่วยเพิ่มความมั่นใจต่อโปรเจกต์นี้
ฟีเจอร์
- เซิร์ฟเวอร์สตรีมข้อความประสิทธิภาพสูงแบบอิง log ที่ยั่งยืน
- throughput สูง, latency ต่ำ และการใช้ทรัพยากรที่คาดการณ์ได้จากภาษาแบบคอมไพล์อย่าง Rust
- รองรับหลายสตรีม, ท็อปปิก, พาร์ทิชัน และรองรับโปรโตคอลขนส่งที่หลากหลาย
- มี RESTful API, client SDK หลายภาษา และทำงานกับข้อมูลไบนารีได้โดยตรง
- ปรับแต่งความสามารถของเซิร์ฟเวอร์ได้, เก็บ consumer offset ไว้ที่เซิร์ฟเวอร์ และรองรับหลายวิธีในการ polling ข้อความ
- มี consumer group เพื่อคงลำดับข้อความและรองรับการขยายแนวนอน รวมถึงฟีเจอร์หมดอายุข้อความและกำจัดข้อความซ้ำ
- รองรับ TLS สำหรับทุกโปรโตคอลขนส่ง พร้อมการเข้ารหัสข้อมูลแบบเลือกใช้และรองรับ message header
- มี CLI ในตัวสำหรับจัดการสตรีมมิงเซิร์ฟเวอร์และแอปเบนช์มาร์ก พร้อมการแจกจ่ายแบบไบนารีเดียว
โรดแมป
- หลังจากไปปรากฏบนหน้า GitHub Trending ก็ได้มีการพูดคุยกับผู้ใช้เกี่ยวกับการเพิ่มฟีเจอร์
- ตั้งเป้ายกระดับประสิทธิภาพและความน่าเชื่อถือผ่าน clustering, low-level I/O และสถาปัตยกรรม thread-per-core
- กำลังทดลองกลไกฉันทามติ Raft, ปรับปรุงงาน I/O ด้วย io_uring และมีแผนใช้ runtime ของ monoio
อนาคต
- ตั้งเป้าเป็นแพลตฟอร์มสตรีมข้อความสำหรับงานทั่วไป และท้าทายขีดจำกัดของ OS กับฮาร์ดแวร์
- วางแผนรองรับภาษาโปรแกรมที่หลากหลาย รวมถึง CLI และเว็บ UI ในรูปแบบแพลตฟอร์มรวมที่ใช้งานง่าย
- ตั้งเป้าพัฒนาต่อผ่านฟีดแบ็กและไอเดียจากชุมชน
GN⁺ ความเห็น
- Iggy.rs เป็นแพลตฟอร์มสตรีมข้อความที่สร้างบน Rust โดยมุ่งเน้นประสิทธิภาพสูงและ latency ต่ำ
- ในฐานะโปรเจกต์โอเพนซอร์ส มันยังคงเติบโตอย่างต่อเนื่องผ่านการเข้าร่วมและการมีส่วนร่วมโดยสมัครใจจากนักพัฒนาทั่วโลก
- เป้าหมายอันทะเยอทะยานในการก้าวข้ามขีดจำกัดด้านประสิทธิภาพของระบบกระจายผ่านเทคโนโลยีน่าสนใจอย่าง clustering, การปรับ low-level I/O และสถาปัตยกรรม thread-per-core ทำให้เป็นโปรเจกต์ที่มีประโยชน์มากสำหรับผู้ที่สนใจด้านนี้
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
แม้แต่ละคนจะมีเหตุผลต่างกัน แต่การได้ทำงานร่วมกันเพื่อมุ่งสู่ เป้าหมายเดียวกัน และไม่ได้มีผลตอบแทนทางการเงินเป็นจุดประสงค์เดียว ดูเป็นภาพในอุดมคติมาก
ขอให้โปรเจกต์ไปได้สวย และถ้ามี การเปรียบเทียบ กับทางเลือกอื่น ๆ ก็น่าจะช่วยให้เข้าใจได้ดีขึ้นว่าโปรเจกต์นี้อยู่ตรงไหน
ผู้เขียนดูถ่อมตัว ตรงไปตรงมา และเหมือนเป็น ผู้นำโปรเจกต์ที่สร้างสรรค์
ทุกคนตัดสินใจมาร่วมความพยายามนี้ด้วยใจที่อยากลองสนุกไปด้วยกัน
มันให้การทำหลายสตรีมพร้อมกันที่มีประโยชน์คล้าย SCTP จึงเป็นจุดเริ่มต้นที่ดี มีไลบรารีดี ๆ ให้ใช้ได้อยู่แล้วมากมาย และมีโอกาสจะดีขึ้นและถูกปรับแต่งให้เหมาะสมยิ่งขึ้นในอนาคต: https://github.com/xileteam/awesome-quic?tab=readme-ov-file#...
เป็นพื้นที่ที่การใช้โปรโตคอลขนส่งที่ดีกว่าเดิมอีกเล็กน้อยก็ให้ประโยชน์ได้มากโดยธรรมชาติ เลยตั้งตารอ QUIC ในอีก 10 ปีข้างหน้า
แต่ โปรโตคอล TCP ที่ใช้งานอยู่ตอนนี้เร็วกว่า QUIC เล็กน้อย ซึ่งอาจเป็นเพราะยังปรับจูนเพิ่มเติมไม่พอ
อีกอย่างคือบน MacOS นั้น QUIC ช้ากว่าเมื่อเทียบกับ Linux
https://docs.nats.io/nats-concepts/jetstream
มันใกล้เคียงกับ message queue อย่าง RabbitMQ มากกว่าหรือเปล่า?
https://www.fluvio.io/
Fluvio เป็นผลิตภัณฑ์จริงและมีบริษัทอยู่เบื้องหลัง จึงสุกงอมกว่า แต่ Iggy ก็มีไอเดียของตัวเองในการทำให้เป็น โซลูชัน message streaming ที่แข่งขันได้
https://github.com/thibauts/styx
สงสัยว่าทำไมถึงไม่ได้ทำต่อแล้ว
อีกอย่างคือชอบ สุนทรียะ ของเว็บไซต์
เป็นทีมเล็ก ๆ ที่มีความสัมพันธ์ยาวนานกับแอปพลิเคชันที่เน้นข้อมูลในหลายโดเมนตลอดหลายทศวรรษที่ผ่านมา และกำลังฝากความหวังกับ data streaming ที่ใช้ Rust และ WebAssembly แทน Java และ JVM
บทความที่ CTO สรุปวิสัยทัศน์ของ Fluvio เมื่อเดือนมิถุนายน 2021 อยู่ที่นี่: https://news.ycombinator.com/item?id=38880743
เห็นมีคำถามเรื่องการเปรียบเทียบออกมาเรื่อย ๆ จึงแชร์ข้อมูลที่ฝั่ง Fluvio มีได้ เป็นงานเอกสารยาว แต่สิ่งที่มีตอนนี้ก็แบ่งปันได้ Iggy ก็เป็นผลงานที่ทำได้ดีมากจริง ๆ
แต่ก่อนจะลองใช้ คิดว่าต้องเข้าใจสองเรื่องก่อน: จะรัน อินสแตนซ์เซิร์ฟเวอร์ มากกว่าหนึ่งตัวได้อย่างไร และเมื่อรันมากกว่าหนึ่งตัว การโต้ตอบของไฟล์ซิสเต็มระหว่างเซิร์ฟเวอร์เป็นอย่างไร
ถ้ารองรับคลัสเตอร์เมื่อไร ก็น่าจะแข่งขันกับ Kafka ได้
เท่าที่รู้ต้องใช้คอมไพเลอร์ nightly ซึ่งผมมองว่าไม่ใช่ตัวเลือกที่ดีสำหรับการดูแลโปรเจกต์
ที่เหลือส่วนใหญ่ก็ไม่ใช่ฟีเจอร์หวือหวารุนแรงอะไร ผมไม่ได้ดูโค้ดลึก ๆ แต่ทั้งหมดดูสมเหตุสมผล เช่น อย่างหนึ่งคือ API ของไลบรารีมาตรฐานสำหรับสร้างคอนเทนเนอร์ที่ยังไม่ถูกกำหนดค่าเริ่มต้น ช่วยให้ตัดการคัดลอกออกได้
ยังไม่ได้ลองเทียบ glommio ซึ่งทำงานบน stable กับ monoio แต่น่าจะน่าสนใจ
เลยเลือกแนวทาง bleeding edge อยู่แล้วกว่าจะใช้งาน io_uring และการปรับแต่งอื่น ๆ ได้ก็คงต้องใช้เวลาอีกหลายเดือน และมีความเป็นไปได้สูงว่าจะย้ายไปใช้โครงสร้างแบบเธรดต่อคอร์ ระหว่างเขียนส่วนสำคัญบางส่วนใหม่