Apple เผย Case Study เบื้องหลังการ Rewrite ระบบหลังบ้าน "Password Monitoring" จาก Java สู่ Swift ผลลัพธ์คือ Performance พุ่ง 40% แถมใช้ RAM ลดลงเป็น 10 เท่า


Apple ออกมาเปิดเผยเบื้องหลังการตัดสินใจครั้งสำคัญในการย้าย (Migrate) ระบบ Backend ของฟีเจอร์ "Password Monitoring" (ระบบที่คอยแจ้งเตือนเราเมื่อ Password ของเรารั่วไหลจาก Data Leaks) จากเดิมที่เขียนด้วยภาษาเจ้าตลาดอย่าง Java มาเป็น Swift ทั้งหมด


ระบบที่ถูกย้าย คือ Backend Service ของฟีเจอร์ Password Monitoring ซึ่งเป็นบริการหลังบ้านที่ทำงานบน Linux Infrastructure, ต้องรองรับ Request จากผู้ใช้ทั่วโลกหลายพันล้านครั้งต่อวัน, และมีความซับซ้อนในการคำนวณทาง Cryptography สูง เพื่อรักษาความเป็นส่วนตัวของผู้ใช้ (ไม่ให้ Apple เห็นรหัสผ่านของเรา)

ทำไมถึงต้องย้ายจาก Java?

แม้ว่า Java จะเป็นภาษาที่เสถียรและมี Performance ที่ดี แต่เมื่อถึงสเกลที่ใหญ่มาก ๆ ทีมงาน Apple ก็พบว่า Memory Management ของ Java (โดยเฉพาะ Garbage Collector - GC) ไม่ตอบโจทย์ด้านประสิทธิภาพอีกต่อไป เช่น

เจอปัญหา GC Pauses นานผิดปกติ เมื่อต้องรับ Load หนัก ๆ ซึ่งส่งผลกระทบต่อ Latency มี Performance Overhead สูง และการจะปรับจูน JVM ให้ได้ประสิทธิภาพสูงสุดสำหรับ Workload ที่หลากหลายก็มีความซับซ้อนมาก

Bootstrap Time ของ JVM ที่ค่อนข้างนาน ทำให้การ Scale-up/Scale-down instance เพื่อรับมือกับ Traffic ที่ผันผวนในแต่ละวัน (ซึ่งต่างกันถึง 50% ระหว่างช่วง Peak กับช่วง Low) ทำได้ไม่คล่องตัวและไม่ประหยัดเท่าที่ควร


ประสบการณ์ในการพัฒนาด้วย Swift


ทีมงานเริ่มต้นโปรเจคท์โดยใช้ Vapor (ซึ่งเป็น Swift Web Framework ยอดนิยม) เป็นฐาน และสร้าง Custom Packages เพิ่มเติมตามความต้องการของเซอร์วิส

ทีม Apple ประทับใจแนวคิดเรื่อง Protocols และ Generics ของ Swift มาก ซึ่งส่งเสริมให้โค้ดเป็น
  • Modular
  • นำกลับมาใช้ใหม่ได้ง่าย (Reusability)
  • และ Clean กว่าการใช้ Inheritance แบบใน Java

อีกทั้งมีการชื่นชม Safety Features ของ Swift เป็นพิเศษ เช่น
  • optional type ที่ช่วยลดปัญหา Null Pointer Exceptions ได้อย่างมหาศาล
  • ระบบจัดการ Memory แบบ Deterministic
  • Copy-on-Write (CoW)
  • และ Value Types ที่ทำให้โค้ดโดยธรรมชาติแล้วมีโอกาสเกิด Runtime Error น้อยลง

async/await ที่มาพร้อมกับภาษา Swift ช่วยให้การจัดการงาน Asynchronous และ Concurrency ในสภาพแวดล้อมที่ต้องรับ Load หนัก ๆ ทำได้ง่าย อ่านเข้าใจง่าย และดูแลรักษาง่ายขึ้นมาก เมื่อเทียบกับ Callback Patterns ที่ซับซ้อนในอดีต

ทีมงานของ Apple เขียนโปรเจคท์ rewrite นี้เสร็จเร็วกว่าที่คาดการณ์ไว้มาก และได้ Codebase ที่มีขนาดเล็กลงถึงเกือบ 85% (โค้ดน้อยลงแต่ทำงานได้เหมือนเดิม)

ผลลัพธ์หลังการย้ายที่ออกมา

  • Performance (Throughput) เพิ่มขึ้นเกือบ 40%
  • Latency ต่ำกว่า 1 ms สำหรับ 99.9% ของ Requests

ใช้ Memory น้อยลงอย่างมหาศาล (นี่คือจุดที่พีคที่สุด)

Swift Service ที่เขียนใหม่ใช้ RAM แค่หลัก ร้อย Megabytes (100s of MB)

ในขณะที่ Java Implementation เดิมต้องใช้ RAM ถึงหลัก สิบ Gigabytes (10s of GB) เพื่อรองรับ Peak Load ในระดับ Performance ที่เท่ากัน! (พูดง่าย ๆ คือ ใช้ RAM น้อยลงเป็น 10 เท่า หรือมากกว่านั้น)

ประหยัดรีซอร์สไปได้เยอะมาก

หลังจากการย้ายไปใช้ Swift ทีมงานสามารถ ลดการใช้ Capacity ของ Kubernetes ลงได้ถึง 50% และนำรีซอร์สที่เหลือไปให้ Workload อื่น ๆ ในทีมใช้ต่อได้

อีกทั้งยังทำให้การดูแลรักษาโค้ดในระยะยาวง่ายขึ้นอีกด้วยครับ

กรณีศึกษาการ rewrite codebase จาก Apple ครั้งนี้ ถือเป็นการตอกย้ำอย่างดีเลยครับว่า Swift ไม่ได้ถูกจำกัดอยู่แค่การทำแอปฯ iOS/macOS อีกต่อไป แต่ยังเป็นตัวเลือกที่ทรงพลังสำหรับงานฝั่ง Server-side ที่ต้องการ Performance สูง ใช้รีซอร์สอย่างมีประสิทธิภาพ และมีความปลอดภัยที่เชื่อถือได้

สรุปและเรียบเรียงโดย Devhub Team
📌🙏 ซัพพอร์ตเราด้วยการกดไลก์ คอมเมนต์ ติดตาม และแชร์ เพื่อที่จะได้ไม่พลาดสาระดี ๆ ด้าน Software Development, Programming และ IT
ติดต่อเรา: 📒 https://devhub.in.th/about-us

ที่มา:
Swift.org Blog: https://www.swift.org/blog/swift-at-apple-migrating-the-password-monitoring-service-from-java/