ลดเวลาตอบสนองของ REST API ด้วย Oj
- rails
- api
- json
- oj
- jbuilder
เอาง่ายๆ เลยว่า ถ้าใครกำลังมองหาวิธีการลดเวลาตอบสนอง (Response Time) เมื่อมีการเรียกใช้ REST API บน Rails ลองมาใช้ gem ที่ชื่อว่า oj
ในการสร้างหรือแปลง JSON แล้วกัน
วิธีติดตั้ง
- เพิ่ม
gem "oj"
เข้าไปในไฟล์ Gemfile - รันคำสั่งติดตั้ง
bundle install
- ใส่คำสั่ง
Oj.optimize_rails()
เข้าไปในไฟล์config/application.rb
เพื่อเปลี่ยนให้ Rails เรียกใช้ gemoj
แทนjson
ย้อนกลับไปที่โปรเจ็คระบบสารสนเทศเพื่อส่งต่อผู้ป่วย สำหรับหน่วยบริการในระบบหลักประกันสุขภาพถ้วนหน้า เขตพื้นที่กทม. (EHHC) เราได้พัฒนาเป็น REST API ไว้ให้แอพพลิเคชันหน้าบ้านเรียกใช้งาน ในตัวโปรเจ็คจะใช้ gem json
ซึ่งเป็น stdlib ที่มากับ Ruby ในการจัดการ JSON ไม่ว่าจะสร้างหรือแปลงข้อมูลให้อยู่ในรูป JSON และดูเหมือนว่าเวลาตอบสนองที่ได้ออกมาค่อนข้างจะช้าไปหน่อย ประกอบกับเราต้องเตรียม REST API ไว้ให้ 3rd party ที่จะเข้ามาเรียกใช้เพิ่มอีก ด้วยโหลดที่จะเพิ่มขึ้นเราคงต้องหาวิธีเพิ่มประสิทธิภาพการทำงานของ server การเปลี่ยนตัวจัดการ JSON จึงเป็นจุดแรกที่น่าจะช่วยลดเวลาตอบสนองได้ดีที่สุด
แต่จากที่ได้อ่านหลายบทความ เช่น 1, 2 ก็พบว่า oj
น่าจะเป็นตัวเลือกที่ดีสำหรับเรา ดังนั้นเราจึงได้สร้าง API อย่างง่ายขึ้นมาทดสอบโดยให้มีการดึงข้อมูลคนจำนวน 1000 คน ซึ่งแต่ละคนจะมีข้อมูลชื่อ นามสกุล และเลขประชาชนจำลอง
Migration
Create dummy data
จากนั้นเราวัดประสิทธิภาพของ server ด้วย Apache Benchmark (AB) ซึ่งเราแบ่งการทดสอบเป็น 2 ชุด โดยแต่ละชุดเรากำหนดค่าคงที่ในของจำนวน request การดึงข้อมูลเท่ากับ 100 requests แต่มี concurrent ที่แตกต่างกันคือ 10 และ 5
Concurrent เท่ากับ 10
Using oj N=100, C=10
Using json N=100, C=10
Concurrent เท่ากับ 5
Using oj N=100, C=5
Using json N=100, C=5
เครื่องที่ใช้สำหรับทำเป็น Server คือ Macbook Pro (2019), CPU 2.6 GHz 6-Core Intel Core i7, RAM 32GB โดยผลลัพท์ที่ได้จะให้ผลแตกต่างกันขึ้นอยู่กับสเปคของ Server แต่จากผลลัพท์ที่ได้ก็พอจะสรุปได้ว่าการใช้งาน oj
แทน json
นั้นให้ผลที่ดีกว่าทั้งเรื่องของ RPM, เวลา และภาพรวมทั้งหมด