npm เป็นแพลตฟอร์มจัดการ JavaScript packages ที่ใหญ่ที่สุดในโลก มีมากกว่า 836,000 packages และให้บริการมากกว่า 30 หมื่นล้าน downloads ต่อเดือน ซึ่งทำให้ต้องเจอกับปัญหาด้าน performance และ scalability อยู่ตลอดเวลา

ในการแก้ไขปัญหาด้านประสิทธิภาพ ทีมงานของ npm ได้เลือกใช้ Rust แทนที่ JavaScript สำหรับ CPU-bound services เพื่อทำให้ระบบเร็วขึ้น ปลอดภัยขึ้น และลดภาระของเซิร์ฟเวอร์

ทำไมต้องเปลี่ยนจาก JavaScript?

ปัญหาของระบบเดิม ก่อนหน้านี้ npm ใช้ Nodejs เป็นหลัก ซึ่งทำงานได้ดีสำหรับงานที่ต้องพึ่งพา network operations แต่ไม่เหมาะกับงานที่ต้องใช้ CPU-intensive processing เช่น authorization service ที่ต้องตรวจสอบสิทธิ์ของผู้ใช้ก่อนเผยแพร่ package

ทีมวิศวกรรมของ npm มองว่า Nodejs อาจเป็นคอขวดของระบบในอนาคต จึงตัดสินใจมองหา ทางเลือกใหม่ ที่สามารถเพิ่มประสิทธิภาพให้กับงานที่ใช้ CPU หนัก ๆ ได้

เปรียบเทียบ Rust กับภาษาอื่น ๆ

ในการเลือกภาษาใหม่ ทีมพิจารณาภาษาอื่น ๆ เช่น C, C++, Java, Go และ Rust ซึ่งมีข้อดีข้อเสียที่แตกต่างกัน

❌ C / C++

  • มีปัญหาเรื่อง memory management
  • เสี่ยงต่อปัญหา security vulnerabilities และ memory leaks
  • ไม่ใช่ตัวเลือกที่ทีม npm ไว้วางใจ

❌ Java

  • ต้องใช้ JVM (Java Virtual Machine) ซึ่งเพิ่ม overhead และความซับซ้อนในการ deploy

✅ Go

  • ง่ายต่อการเขียนและ deploy
  • แต่มีปัญหาเรื่อง dependency management ซึ่งเป็นจุดสำคัญที่ npm ให้ความสำคัญ

✅ Rust

  • มี memory safety โดยไม่ต้องใช้ garbage collector
  • performance สูง กว่า JavaScript
  • มี Cargo ซึ่งเป็น dependency management system ที่ดีเยี่ยม

จากการทดลอง ทีมงานพบว่า Rust เป็นตัวเลือกที่ดีที่สุด สำหรับงานที่ต้องใช้ CPU สูง

ประสบการณ์ของ npm กับ Rust

ทีมงานได้ทดลองเขียน authorization service ใหม่ใน Nodejs, Go และ Rust

🟢 Nodejs ✅ ใช้เวลา 1 ชั่วโมง → แต่ performance ไม่ต่างจากของเดิม

🟠 Go ✅ ใช้เวลา 2 วัน → performance ดีขึ้น แต่ปัญหาเรื่อง dependency management ทำให้ไม่เหมาะสม

🔴 Rust 🚀 ใช้เวลา 1 สัปดาห์ → ต้องใช้เวลาเรียนรู้มากขึ้น แต่ผลลัพธ์ออกมาดีกว่าทุกภาษา

ทีมงานยอมรับว่า Rust มี learning curve สูง เพราะต้องคิดเรื่อง memory safety ตั้งแต่แรก แต่ก็ช่วยลดปัญหาต่าง ๆ ได้ในระยะยาว

ผลลัพธ์หลังใช้ Rust

  • ระบบ authorization service ทำงานได้ เร็วขึ้น
  • ไม่มีปัญหาด้าน memory leak หรือ security vulnerabilities
  • ลดภาระของทีม DevOps เพราะ Rust service แทบไม่ต้องดูแล
  • คำชมจากทีมงาน: "Rust น่าเบื่อสุด ๆ และนี่คือคำชมที่ดีที่สุด!" (เพราะไม่มีปัญหาอะไรให้ต้องมานั่งแก้ไข)

ข้อเสียของ Rust?

แม้ว่า Rust จะมีข้อดีหลายอย่าง แต่ก็มีข้อเสียบางอย่างที่ทีม npm ต้องเผชิญ เช่น

  • ต้องมีระบบ monitoring และ logging แยกต่างหาก จาก JavaScript
  • เครื่องมือและ best practices ใน Rust ยังต้องพัฒนาเพิ่มเติม

อย่างไรก็ตาม ทีม npm เชื่อว่า Rust community เป็นชุมชนที่แข็งแกร่ง และ Rust จะพัฒนาไปในทางที่ดีขึ้นเรื่อย ๆ

สรุป: ทำไม npm ถึงเลือก Rust?

  • 1️⃣ Rust มี memory safety → ลดปัญหา security vulnerabilities
  • 2️⃣ Performance สูง → เร็วกว่า JavaScript ในงานที่ใช้ CPU หนัก ๆ
  • 3️⃣ Cargo ทำให้ dependency management ง่าย
  • 4️⃣ ลดภาระของ DevOps → Deploy แล้วแทบไม่ต้องดูแล

Rust อาจจะต้องใช้เวลาเรียนรู้ แต่ถ้าระบบของคุณมี CPU-bound services หรือมีปัญหากับ Nodejs performance Rust ก็เป็นตัวเลือกที่ควรพิจารณา! 🚀

References: