มาทดสอบความเร็วของ Fiber + GORM ในภาษา Golang กัน… (แบบ Native)
เนื่องจากผมได้ เปลี่ยนจาก Ruby on Rails มา golang เลยลองหา web framework ของ golang ที่เร็วๆ เลยได้มารู้จักกับ Gin และ Fiber และสุดท้ายผมก็เลือก Fiber
ในส่วนของการทดสอบเราจะใช้โปรแกรม wrk ทดสอบความสามารถในการรองรับ โดยใช้คำสั่ง
wrk -c500 -d10 -t10 http://localhost:8080/api/v1/test
โดยสำหรับ URL : http://localhost:8080/api/v1/test เป็นคืนค่า JSON กลับมา
{
"code": 200,
"message": "Go Fiber"
}
โดยผมจะใช้ Fiber V2 ในการทดสอบครั้งนี้
ซึ่งก็จะมี Code ประมาณนี้
หลังจากลองยิงไปประมาณ 3 ครั้งก็ได้ประมาณนี้ครับ

ผลสรุป ได้ประมาณ 58-59Krps นะครับ
ต่อไปเราก็จะมายิงเส้นที่มีการ query กันนะครับ โดยใช้ GORM V2
โดยคำสั่งก็คล้ายๆเดิมเลยครับเปลี่ยนแค่ endpoint
wrk -c300 -d10 -t10 http://localhost:8080/api/v1/sql-query?name=Saharak
โดยสำหรับ URL : http://localhost:8080/api/v1/sql-query เป็นคืนค่า JSON กลับมา เป็น User ตาม name ที่เราใส่เข้าไปนะครับ
ซึ่งก็จะมี Code ประมาณนี้ครับ
หลังจากลองยิงไปประมาณ 3 ครั้งก็ได้ประมาณนี้ครับ

ตกลงไปเยอะเหมือนกันครับ โดยอยู่ที่ประมาณ 11Krps แต่ก็จะมี error บ้างนะครับ เช่นในรอบสุดท้ายมีได้ status ที่ไม่ใช้ 2xx และ 3xx อยู่ 11 ครั้ง
โดยในการทดสอบครั้งนี้ใช้เครื่อง Macbook Pro 2020 2.3 GHz Quad-Core Intel Core i7 Ram 16ในการทดสอบนะครับ
ส่วน Golang ใช้เป็น version
go version go1.15.5 darwin/amd64
Database ใช้เป็น postgres โดยใช้ gorm ต่อและเรียกคำสั่งผ่าน ORM ของ Gorm นะครับ ได้ได้ตั้งค่า Gorm config Connection Pool
dbConfig, err := db.DB()dbConfig.SetMaxIdleConns(1500)dbConfig.SetMaxOpenConns(3500)// คำสั่งปิด
sqlDB.Close()
ทั้งหมดนี้เป็นความอยากรู้ของผม ว่ามันไปได้ถึงขนาดไหน ในการทดสอบแบบเราไม่ได้ต้อง config อะไรเพิ่มเติม ซึ่งถ้าได้ใช้ Redis มาช่วยเรื่อง Cache ก็น่าจะเร็วได้มากกว่านี้ครับ
ถ้าผิดพลาดประการใดขออภัยไว้ ณ ที่นี้ด้วย
ขอบคุณครับ
เพิ่มเติมนะครับ
GORM สามารถ ตั้งค่า Connection Pool ได้นะครับ
sqlDB, err := db.DB()
// SetMaxIdleConns sets the maximum number of connections in the idle connection pool.
sqlDB.SetMaxIdleConns(10)
// SetMaxOpenConns sets the maximum number of open connections to the database.
sqlDB.SetMaxOpenConns(100)
// SetConnMaxLifetime sets the maximum amount of time a connection may be reused.
sqlDB.SetConnMaxLifetime(time.Hour)