
วันนี้อ่านบทความเรื่อง Scaling PayPay with Rust
ซึ่งเป็นการทำ Poc (Proof of concept) ของการเปลี่ยนภาษา program ของระบบงาน
จากเดิมที่พัฒนาด้วย Java และ NodeJS ซึ่งทำงานได้ดี
แต่เมื่อระบบใหญ่ขึ้น การใช้งานมากขึ้น
จำเป็นต้องการ scale ระบบมากขึ้นเช่นกัน
แต่ด้วยการ deploy บน Kubernetes cluster นั้น
มีการใช้งาน CPU และ memory มากขึ้นด้วยเช่นกัน
นั่นคือการมาพร้อมด้วยค่าใช้จ่ายที่สูงขึ้นมาก
นี่คือเหตุผลหลัก ๆ ของการเปลี่ยนแปลงนั่นเอง
โดยเริ่มทำการศึกษาและทดลองมาตั้งแต่ปี 2023 แล้ว
มีการศึกษาทั้ง GraalVM, Go, Rust และอื่น ๆ
ซึ่งจาก use case ของทาง PayPay นั้น ได้ทำการเลือก Rust
ที่ตอบโจทย์ ทั้งเรื่องของ performance, type safety และ resource ที่ใช้ทั้ง CPU และ Memory
มาดูแนวทางของทาง PayPay สำหรับนำ Rust มาใช้งาน
แนวทางในการทำ Poc เป็นดังนี้
จะไม่ทำการ replace ทั้งหมดแบบทันที หรือ big bang
แต่จะเริ่มจากการ poc เป็น project เล็ก ๆ ก่อน
เพื่อดูว่ามันเข้ามาช่วยแก้ไขปัญหาของเราหรือไม่
ทั้ง development และ deployment บน production
เมื่อได้ผลที่น่าพอใจแล้ว จึงจะนำผลนี้ขยายผลออกไปในส่วนต่าง ๆ
เป้าหมายของการ Poc มี 3 เรื่อง ประกอบไปด้วย
- ปรับปรุงการใช้งาน resource ได้ดีหรือไม่
- ในการ deploy บนระบบเดิมนั้นทำได้หรือไม่ และทำได้ดีหรือไม่ โดยที่การเปลี่ยนแปลงไม่เยอะ
- ระบบเล็ก ๆ (microservice) ที่พัฒนาด้วย Rust นั้น สามารถรองรับ traffic บน production ได้หรือไม่
โดยในการ Poc จะทำการสร้าง API gateway ขึ้นมาด้วย Rust
ซึ่งจะมี feature ต่าง ๆ ดังนี้
- rate limit
- authentication
- touting request
- aggregate data
เป็นส่วนงานที่ต้องรับ request จำนวนมาก จากทางฝั่งของ frontend
ไม่ว่าจะเป็น web, mobile และช่องทางอื่น ๆ

- Rate limit layer ใช้งาน nginx
- Business logic layer ใช้ Java/NodeJS
ดังนั้นถ้าทำการลดการใช้งาน resource ต่าง ๆ ลงไปได้
รวมทั้งประสิทธิภาพการทำงานยังดี และ มีความน่าเชื่อถือ
น่าจะส่งผลดีต่อบริษัทอย่างมาก
แสดงโครงสร้างดังรูป

ในการทำ Poc นั้นจะต้องไม่กระทบต่อการทำงานของระบบเดิม
แถวต้องรองรับ traffic บน production ให้ได้ด้วย
ด้วยการเขียน plugin ใน nginx ด้วยภาษา Lua เพื่อ route traffic มาให้
ดังนั้นทางทีมจึงเลือกแนวคิดของ Sidecar container มาใช้งาน

โดยจะสร้าง helper sidecar service ขึ้นมาด้วยภาษา Rust
ใช้งาน web framework ชื่อว่า Actix Web
อีกทั้งยังใส่ opentelemetry เข้าไปได้ง่าย
ลองใช้งานง่าย ๆ แถมยิงแล้วแรงใช้ได้เลย
[gist id="112d7edd27846c3024a94f73ab086e15" file="1.txt"]ผลของการ rollout ป็นดังนี้
- ในครั้งแรกนั้น รองรับ traffic น้อย ๆ พบว่า ช่วยลด CPU และ memory จาก Java ลงไป 10 และ 80 เท่าตัว
- จากนั้นจึงทำการเพิ่มไปยัง feature อื่น ๆ และใหญ่ขึ้น พบว่า ช่วยลด CPU และ memory จาก NodeJS ลงไป 16 และ 100 เท่าตัว
ทำให้สามารถ scale down บน Kubernetes cluster ลงไปได้อีก
แต่ไม่ใช่แค่ลด cost/resource อย่างเดียว
แต่ latency ก็ลดลงไปประมาณ 30%
เหตุผลไม่ใช่มาจากการเปลี่ยนภาษาเพียงอย่างเดียว
แต่มาจากการลด service ที่ไม่จำเป็นออกไป ทำให้ลด hop ของ network นั่นเอง
ผลของการ rollout จากระบบ monitoring เรื่อง latency

นี่เป็นเพียงการเริ่มต้นเท่านั้น
ยังไม่ได้ rollout ส่วนการทำงานหลักของระบบที่มีความยากและซับซ้อน
แต่มีแนวโน้มในเชิงบวก ซึ่งน่าสนใจมาก ๆ
หัวใจหลัก ๆ ของการเปลี่ยนแปลง คือ ต้องไม่กระทบต่อระบบการทำงานหลัก