มีหลายวิธีในการปรับปรุงFirebase Realtime Databaseประสิทธิภาพในแอป หากต้องการดูสิ่งที่คุณทำได้เพื่อเพิ่มประสิทธิภาพRealtime Database ให้รวบรวมข้อมูลผ่านเครื่องมือตรวจสอบRealtime Databaseต่างๆ จากนั้นทําการเปลี่ยนแปลงแอปหรือRealtime Databaseการใช้งานตามความเหมาะสม
ตรวจสอบประสิทธิภาพ Realtime Database
คุณสามารถรวบรวมข้อมูลเกี่ยวกับประสิทธิภาพของ Realtime Database ผ่านเครื่องมือต่างๆ ได้ 2-3 อย่าง โดยขึ้นอยู่กับระดับความละเอียดที่ต้องการ
- ภาพรวมระดับสูง: ใช้เครื่องมือโปรไฟล์เพื่อดูรายการการค้นหาที่ไม่ได้จัดทำดัชนีและภาพรวมแบบเรียลไทม์ของการดำเนินการอ่าน/เขียน
- การใช้งานโดยประมาณที่เรียกเก็บเงิน: ใช้เมตริกการใช้งานที่มีอยู่ในคอนโซล Firebase เพื่อดูการใช้งานที่เรียกเก็บเงินและเมตริกประสิทธิภาพระดับสูง
- รายละเอียดแบบเจาะลึก: ใช้ Cloud Monitoring เพื่อดูประสิทธิภาพของฐานข้อมูลอย่างละเอียดมากขึ้นเมื่อเวลาผ่านไป
ปรับปรุงประสิทธิภาพตามเมตริก
เมื่อรวบรวมข้อมูลแล้ว ให้ดูแนวทางปฏิบัติแนะนำและกลยุทธ์ต่อไปนี้โดยอิงตามด้านประสิทธิภาพที่ต้องการปรับปรุง
กลยุทธ์การปรับปรุงประสิทธิภาพโดยย่อ | ||
---|---|---|
เมตริก | คำอธิบาย | แนวทางปฏิบัติแนะนำ |
ภาระงาน/การใช้งาน | เพิ่มประสิทธิภาพปริมาณความจุของฐานข้อมูลที่ใช้ในการประมวลผลคำขอ ณ เวลาหนึ่งๆ (แสดงในเมตริก **Load** หรือ **io/database_load**) |
เพิ่มประสิทธิภาพโครงสร้างข้อมูล แยกข้อมูลในฐานข้อมูล ปรับปรุงประสิทธิภาพของผู้ฟัง จำกัดการดาวน์โหลดด้วยกฎที่อิงตามการค้นหา เพิ่มประสิทธิภาพการเชื่อมต่อ |
การเชื่อมต่อที่ใช้งานอยู่ | ปรับจำนวนการเชื่อมต่อที่ใช้งานอยู่พร้อมกันไปยังฐานข้อมูลให้ไม่เกินขีดจํากัดการเชื่อมต่อ 200,000 ครั้ง |
แยกข้อมูลในฐานข้อมูล ลดการเชื่อมต่อใหม่ |
แบนด์วิดท์ขาออก | หากการดาวน์โหลดจากฐานข้อมูลสูงกว่าที่คุณต้องการ คุณก็สามารถปรับปรุงประสิทธิภาพของการดำเนินการอ่านและลดค่าใช้จ่ายเพิ่มเติมในการเข้ารหัสได้ |
เพิ่มประสิทธิภาพการเชื่อมต่อ เพิ่มประสิทธิภาพโครงสร้างข้อมูล จำกัดการดาวน์โหลดด้วยกฎที่อิงตามการค้นหา ใช้เซสชัน SSL ซ้ำ ปรับปรุงประสิทธิภาพของผู้ฟัง จำกัดการเข้าถึงข้อมูล |
พื้นที่เก็บข้อมูล | ตรวจสอบว่าคุณไม่ได้จัดเก็บข้อมูลที่ไม่ได้ใช้ หรือปรับสมดุลข้อมูลที่จัดเก็บไว้ในฐานข้อมูลอื่นๆ และ/หรือผลิตภัณฑ์ Firebase ให้อยู่ภายใต้โควต้า |
ล้างข้อมูลที่ไม่ได้ใช้ เพิ่มประสิทธิภาพโครงสร้างข้อมูล แยกข้อมูลในฐานข้อมูล ใช้ Cloud Storage for Firebase |
เพิ่มประสิทธิภาพการเชื่อมต่อ
คำขอ RESTful เช่น GET
และ PUT
ยังต้องใช้การเชื่อมต่อ แม้ว่าการเชื่อมต่อนั้นจะไม่นานก็ตาม การเชื่อมต่อที่ใช้งานอยู่บ่อยครั้งแต่มีอายุสั้นเหล่านี้อาจเพิ่มค่าใช้จ่ายในการเชื่อมต่อ ภาระของฐานข้อมูล และแบนด์วิดท์ขาออกได้มากกว่าการเชื่อมต่อที่ใช้งานอยู่แบบเรียลไทม์กับฐานข้อมูล
ใช้ SDK เนทีฟสําหรับแพลตฟอร์มของแอปแทน REST API ทุกครั้งที่เป็นไปได้ SDK จะรักษาการเชื่อมต่อที่เปิดอยู่ ซึ่งจะช่วยลดค่าใช้จ่ายในการเข้ารหัส SSL และภาระของฐานข้อมูลที่อาจเพิ่มขึ้นเมื่อใช้ REST API
หากคุณใช้ REST API ให้พิจารณาใช้ HTTP Keep-Alive เพื่อรักษาการเชื่อมต่อที่เปิดอยู่ หรือใช้เหตุการณ์ที่เซิร์ฟเวอร์ส่ง ซึ่งจะช่วยลดค่าใช้จ่ายจาก SSL Handshake ได้
แยกข้อมูลในฐานข้อมูลหลายแห่ง
การแยกข้อมูลของคุณในอินสแตนซ์ Realtime Database หลายรายการ หรือที่เรียกว่าการแยกข้อมูลฐานข้อมูล มีประโยชน์ 3 ข้อดังนี้
- เพิ่มจำนวนการเชื่อมต่อที่ใช้งานอยู่พร้อมกันทั้งหมดที่อนุญาตในแอปโดยแบ่งการเชื่อมต่อไปยังอินสแตนซ์ฐานข้อมูลต่างๆ
- ปรับสมดุลภาระงานในอินสแตนซ์ฐานข้อมูล
- หากคุณมีกลุ่มผู้ใช้อิสระที่ต้องการเข้าถึงเฉพาะชุดข้อมูลแบบแยกต่างหาก ให้ใช้อินสแตนซ์ฐานข้อมูลที่ต่างกันเพื่อให้มีอัตราผ่านข้อมูลสูงขึ้นและเวลาในการตอบสนองต่ำลง
หากใช้แพ็กเกจราคา Blaze คุณสามารถสร้างอินสแตนซ์ฐานข้อมูลหลายรายการภายในโปรเจ็กต์ Firebase เดียวกันได้ โดยใช้วิธีการตรวจสอบสิทธิ์ผู้ใช้ทั่วไปในอินสแตนซ์ฐานข้อมูลต่างๆ
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีและเวลาที่ควรแยกข้อมูล
สร้างโครงสร้างข้อมูลที่มีประสิทธิภาพ
เนื่องจาก Realtime Database จะดึงข้อมูลจากโหนดย่อยของเส้นทาง รวมถึงเส้นทางด้วย คุณจึงควรทำให้โครงสร้างข้อมูลเป็นโครงสร้างแบบแบนที่สุด วิธีนี้ช่วยให้คุณเลือกเรียกข้อมูลที่ต้องการได้โดยไม่ต้องดาวน์โหลดข้อมูลที่ไม่จำเป็นไปยังไคลเอ็นต์
โดยเฉพาะอย่างยิ่ง ให้พิจารณาการเขียนและการลบเมื่อจัดโครงสร้างข้อมูล เช่น เส้นทางที่มีใบไม้หลายพันใบอาจใช้เวลานานในการลบ การแยกออกเป็นเส้นทางที่มีซับต้นไม้หลายต้นและมีใบต่อโหนดน้อยลงจะช่วยเร่งการลบได้
นอกจากนี้ การเขียนแต่ละครั้งอาจใช้พื้นที่ 0.1% ของการใช้งานฐานข้อมูลทั้งหมด
จัดโครงสร้างข้อมูลในลักษณะที่ช่วยให้คุณสามารถเขียนข้อมูลหลายรายการเป็นการดำเนินการเดียวได้ โดยการอัปเดตหลายเส้นทางผ่านเมธอด update()
ใน SDK หรือคำขอ PATCH
แบบ RESTful
ทําตามแนวทางปฏิบัติแนะนําสําหรับโครงสร้างข้อมูลเพื่อเพิ่มประสิทธิภาพและเพิ่มประสิทธิภาพโครงสร้างข้อมูล
ป้องกันการเข้าถึงที่ไม่ได้รับอนุญาต
ป้องกันการดำเนินการที่ไม่ได้รับอนุญาตในฐานข้อมูลด้วย Realtime Database Security Rules เช่น การใช้กฎอาจช่วยป้องกันไม่ให้ผู้ใช้ที่เป็นอันตรายดาวน์โหลดฐานข้อมูลทั้งหมดของคุณซ้ำๆ
ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้กฎ Firebase Realtime Database
ใช้กฎที่อิงตามคำค้นหาเพื่อจำกัดการดาวน์โหลด
Realtime Database Security Rules จำกัดการเข้าถึงข้อมูลในฐานข้อมูล แต่ยังสามารถใช้เป็นขีดจำกัดของข้อมูลที่แสดงผลผ่านการดำเนินการอ่านได้อีกด้วย เมื่อคุณใช้กฎที่อิงตามข้อความค้นหาตามที่นิยามโดยนิพจน์ query.
เช่น query.limitToFirst
ข้อความค้นหาจะดึงเฉพาะข้อมูลที่อยู่ภายใต้กฎเท่านั้น
ตัวอย่างเช่น กฎต่อไปนี้จะจำกัดสิทธิ์การอ่านไว้ที่ผลลัพธ์ 1,000 รายการแรกของการค้นหา โดยจัดเรียงตามลําดับความสําคัญ
messages: {
".read": "query.orderByKey &&
query.limitToFirst <= 1000"
}
// Example query:
db.ref("messages").limitToFirst(1000)
.orderByKey("value")
เรียนรู้เพิ่มเติมเกี่ยวกับ Realtime Database Security Rules
การค้นหาดัชนี
การจัดทําดัชนีข้อมูลจะช่วยลดแบนด์วิดท์ทั้งหมดที่คุณใช้สําหรับคําค้นหาแต่ละรายการที่แอปเรียกใช้
ใช้เซสชัน SSL ซ้ำ
ลดค่าใช้จ่ายในการเข้ารหัส SSL ที่ไม่จำเป็นในการเชื่อมต่อที่กลับมาทำงานอีกครั้งด้วยการกำหนดตั๋วเซสชัน TLS ซึ่งจะเป็นประโยชน์อย่างยิ่งหากคุณต้องการการเชื่อมต่อที่ปลอดภัยกับฐานข้อมูลเป็นประจำ
ปรับปรุงประสิทธิภาพของผู้ฟัง
วางตัวรับไว้ที่ด้านล่างสุดของเส้นทางเท่าที่จะทำได้เพื่อจำกัดปริมาณข้อมูลที่ซิงค์ ผู้ฟังควรอยู่ใกล้กับข้อมูลที่คุณต้องการให้ได้รับ อย่าฟังที่รูทฐานข้อมูล เนื่องจากจะเป็นการดาวน์โหลดทั้งฐานข้อมูล
เพิ่มการค้นหาเพื่อจํากัดข้อมูลที่การดำเนินการฟังจะแสดงและใช้เครื่องมือฟังที่ดาวน์โหลดเฉพาะข้อมูลอัปเดต เช่น on()
แทน once()
สงวน .once()
ไว้สําหรับการดําเนินการที่ไม่จำเป็นต้องอัปเดตข้อมูลจริงๆ
นอกจากนี้ ให้จัดเรียงคําค้นหาโดยใช้ orderByKey()
ทุกครั้งที่เป็นไปได้เพื่อให้ได้ประสิทธิภาพที่ดีที่สุด การเรียงลําดับด้วย orderByChild()
อาจช้าลง 6-8 เท่า และการเรียงลําดับด้วย orderByValue()
อาจช้ามากสําหรับชุดข้อมูลขนาดใหญ่ เนื่องจากต้องอ่านตําแหน่งทั้งหมดจากเลเยอร์การคงข้อมูล
อย่าลืมเพิ่ม Listener แบบไดนามิกและนำออกเมื่อไม่จำเป็นแล้ว
ล้างข้อมูลที่ไม่ได้ใช้
นําข้อมูลที่ไม่ได้ใช้หรือซ้ำกันออกจากฐานข้อมูลเป็นระยะๆ คุณสามารถเรียกใช้การสำรองข้อมูลเพื่อตรวจสอบข้อมูลด้วยตนเอง หรือสำรองข้อมูลไปยังที่เก็บข้อมูล Google Cloud Storage เป็นระยะๆ นอกจากนี้ ให้พิจารณาโฮสต์ข้อมูลที่จัดเก็บไว้ผ่าน Cloud Storage for Firebase ด้วย
จัดส่งโค้ดที่ปรับขนาดได้ซึ่งคุณอัปเดตได้
แอปที่ฝังอยู่ในอุปกรณ์ IoT ควรมีโค้ดที่ปรับขนาดได้ซึ่งคุณอัปเดตได้ง่ายๆ อย่าลืมทดสอบกรณีการใช้งานอย่างละเอียด พิจารณาสถานการณ์ที่ผู้ใช้อาจเพิ่มขึ้นอย่างรวดเร็ว และสร้างความสามารถในการทําให้โค้ดอัปเดตได้ พิจารณาการเปลี่ยนแปลงที่สำคัญที่อาจต้องทำในอนาคตอย่างรอบคอบ เช่น ในกรณีที่คุณตัดสินใจที่จะแบ่งข้อมูล