Có một vài cách để cải thiện Firebase Realtime Database hiệu suất trong ứng dụng của bạn. Để tìm hiểu những việc bạn có thể làm nhằm tối ưu hoá Realtime Database hiệu suất, hãy thu thập dữ liệu thông qua các công cụ giám sát Realtime Database khác nhau, sau đó thực hiện các thay đổi đối với ứng dụng hoặc Realtime Database việc sử dụng cho phù hợp.
Giám sát hiệu suất của Realtime Database
Bạn có thể thu thập dữ liệu về hiệu suất của Realtime Database's thông qua một vài công cụ khác nhau, tuỳ thuộc vào mức độ chi tiết mà bạn cần:
- Thông tin tổng quan cấp cao: Sử dụng công cụ trình phân tích tài nguyên để xem danh sách các truy vấn chưa được lập chỉ mục và thông tin tổng quan theo thời gian thực về các thao tác đọc/ghi.
- Ước tính mức sử dụng được tính phí: Sử dụng các chỉ số về mức sử dụng có trong Firebase bảng điều khiển để xem mức sử dụng được tính phí và các chỉ số hiệu suất cấp cao.
- Phân tích chi tiết: Sử dụng Cloud Monitoring để xem thông tin chi tiết hơn về hiệu suất của cơ sở dữ liệu theo thời gian.
Cải thiện hiệu suất theo chỉ số
Sau khi thu thập dữ liệu, hãy khám phá các phương pháp hay nhất và chiến lược sau đây dựa trên lĩnh vực hiệu suất mà bạn muốn cải thiện.
| Chiến lược cải thiện hiệu suất trong nháy mắt | ||
|---|---|---|
| Chỉ số | Nội dung mô tả | Các phương pháp hay nhất |
| Tải/Sử dụng | Tối ưu hoá mức sử dụng dung lượng của cơ sở dữ liệu để xử lý các yêu cầu tại bất kỳ thời điểm nào (được phản ánh trong các chỉ số **Tải** hoặc **io/database_load**). |
Tối ưu hoá cấu trúc dữ liệu Phân mảnh dữ liệu trên các cơ sở dữ liệu Cải thiện hiệu quả của trình nghe Giới hạn số lượt tải xuống bằng các quy tắc dựa trên truy vấn Tối ưu hoá kết nối |
| Đường kết nối đang hoạt động | Cân bằng số lượng kết nối đồng thời, đang hoạt động đến cơ sở dữ liệu để duy trì dưới giới hạn 200.000 kết nối. |
Phân mảnh dữ liệu trên các cơ sở dữ liệu Giảm số lượng kết nối mới |
| Băng thông đi | Nếu số lượt tải xuống từ cơ sở dữ liệu của bạn có vẻ cao hơn mức bạn muốn, bạn có thể cải thiện hiệu quả của các thao tác đọc và giảm chi phí mã hoá. |
Tối ưu hoá kết nối Tối ưu hoá cấu trúc dữ liệu Giới hạn số lượt tải xuống bằng các quy tắc dựa trên truy vấn Sử dụng lại các phiên SSL Cải thiện hiệu quả của trình nghe Hạn chế quyền truy cập vào dữ liệu |
| Bộ nhớ | Đảm bảo bạn không lưu trữ dữ liệu không dùng đến hoặc cân bằng dữ liệu được lưu trữ trên các cơ sở dữ liệu và/hoặc sản phẩm khác của Firebase để duy trì dưới hạn mức. |
Dọn dẹp dữ liệu không dùng đến Tối ưu hoá cấu trúc dữ liệu Phân mảnh dữ liệu trên các cơ sở dữ liệu Sử dụng Cloud Storage for Firebase |
Tối ưu hoá kết nối
Các yêu cầu RESTful như GET và PUT vẫn cần có kết nối, mặc dù kết nối đó chỉ tồn tại trong thời gian ngắn. Những kết nối ngắn hạn, thường xuyên này thực sự có thể làm tăng đáng kể chi phí kết nối, tải cơ sở dữ liệu và băng thông đi so với các kết nối đang hoạt động, theo thời gian thực đến cơ sở dữ liệu của bạn.
Bất cứ khi nào có thể, hãy sử dụng các SDK gốc cho nền tảng của ứng dụng thay vì API REST. Các SDK duy trì kết nối mở, giảm chi phí mã hoá SSL và tải cơ sở dữ liệu có thể tăng lên khi sử dụng API REST.
Nếu bạn sử dụng API REST, hãy cân nhắc sử dụng tính năng HTTP keep-alive để duy trì kết nối mở hoặc sử dụng các sự kiện do máy chủ gửi, có thể giảm chi phí từ quá trình bắt tay SSL.
Phân mảnh dữ liệu trên nhiều cơ sở dữ liệu
Việc chia dữ liệu trên nhiều thực thể Realtime Database (còn gọi là phân mảnh cơ sở dữ liệu) mang lại 3 lợi ích:
- Tăng tổng số kết nối đồng thời, đang hoạt động được phép trên ứng dụng bằng cách chia các kết nối này trên các thực thể cơ sở dữ liệu.
- Cân bằng tải trên các thực thể cơ sở dữ liệu.
- Nếu bạn có các nhóm người dùng độc lập chỉ cần truy cập vào các tập dữ liệu riêng biệt, hãy sử dụng các thực thể cơ sở dữ liệu khác nhau để có thông lượng cao hơn và độ trễ thấp hơn.
Nếu đang sử dụng gói giá Blaze, bạn có thể tạo nhiều thực thể cơ sở dữ liệu trong cùng một dự án Firebase, tận dụng phương thức xác thực người dùng chung trên các thực thể cơ sở dữ liệu.
Tìm hiểu thêm về cách và thời điểm phân mảnh dữ liệu.
Xây dựng cấu trúc dữ liệu hiệu quả
Vì Realtime Database truy xuất dữ liệu từ các nút con của một đường dẫn cũng như đường dẫn đó, nên bạn cần giữ cho cấu trúc dữ liệu càng phẳng càng tốt. Bằng cách này, bạn có thể truy xuất có chọn lọc dữ liệu cần thiết mà không cần tải dữ liệu không cần thiết xuống máy khách.
Cụ thể, hãy cân nhắc các thao tác ghi và xoá khi bạn cấu trúc dữ liệu. Ví dụ: các đường dẫn có hàng nghìn nút lá có thể tốn kém khi xoá. Việc chia các đường dẫn này thành các đường dẫn có nhiều cây con và ít nút lá hơn trên mỗi nút có thể giúp tăng tốc quá trình xoá.
Ngoài ra, mỗi thao tác ghi có thể chiếm 0,1% tổng mức sử dụng cơ sở dữ liệu.
Cấu trúc dữ liệu theo cách cho phép bạn ghi hàng loạt vào một thao tác duy nhất dưới dạng cập nhật nhiều đường dẫn thông qua các phương thức update() trong SDK hoặc các yêu cầu PATCH RESTful.
Để tối ưu hoá cấu trúc dữ liệu và cải thiện hiệu suất, hãy làm theo các phương pháp hay nhất về cấu trúc dữ liệu.
Ngăn chặn hành vi truy cập trái phép
Ngăn chặn các thao tác trái phép trên cơ sở dữ liệu bằng Realtime Database Security Rules. Ví dụ: việc sử dụng các quy tắc có thể tránh trường hợp người dùng độc hại liên tục tải toàn bộ cơ sở dữ liệu của bạn xuống.
Tìm hiểu thêm về cách sử dụng Quy tắc của Cơ sở dữ liệu theo thời gian thực của Firebase.
Sử dụng các quy tắc dựa trên truy vấn để giới hạn số lượt tải xuống
Realtime Database Security Rules hạn chế quyền truy cập vào dữ liệu trong cơ sở dữ liệu của bạn, nhưng cũng có thể
đóng vai trò là giới hạn đối với dữ liệu được trả về thông qua các thao tác đọc. Khi bạn sử dụng
các quy tắc dựa trên truy vấn, như được xác định bởi các biểu thức query. như query.limitToFirst,
các truy vấn chỉ truy xuất dữ liệu bị ràng buộc bởi quy tắc.
Ví dụ: quy tắc sau đây giới hạn quyền truy cập đọc chỉ đối với 1000 kết quả đầu tiên của một truy vấn, theo thứ tự ưu tiên:
messages: {
".read": "query.orderByKey &&
query.limitToFirst <= 1000"
}
// Example query:
db.ref("messages").limitToFirst(1000)
.orderByKey("value")
Tìm hiểu thêm về Realtime Database Security Rules.
Truy vấn chỉ mục
Việc lập chỉ mục dữ liệu sẽ làm giảm tổng băng thông bạn sử dụng cho mỗi truy vấn mà ứng dụng chạy.
Sử dụng lại các phiên SSL
Giảm chi phí mã hoá SSL trên các kết nối được tiếp tục bằng cách phát hành vé phiên TLS. Điều này đặc biệt hữu ích nếu bạn cần có các kết nối thường xuyên, an toàn đến cơ sở dữ liệu.
Cải thiện hiệu quả của trình nghe
Đặt trình nghe càng xa đường dẫn càng tốt để giới hạn lượng dữ liệu mà chúng đồng bộ hoá. Trình nghe phải ở gần dữ liệu mà bạn muốn chúng nhận được. Không nghe ở gốc cơ sở dữ liệu, vì điều đó sẽ dẫn đến việc tải xuống toàn bộ cơ sở dữ liệu.
Thêm các truy vấn để giới hạn dữ liệu mà các thao tác nghe trả về và sử dụng
các trình nghe chỉ tải các bản cập nhật xuống dữ liệu – ví dụ: on() thay vì
once(). Dành .once() cho các thao tác thực sự không yêu cầu cập nhật dữ liệu.
Ngoài ra, hãy sắp xếp các truy vấn bằng orderByKey() bất cứ khi nào có thể để có hiệu suất tốt nhất. Việc sắp xếp bằng orderByChild() có thể chậm hơn từ 6 đến 8 lần và việc sắp xếp bằng orderByValue() có thể rất chậm đối với các tập dữ liệu lớn, vì thao tác này yêu cầu đọc toàn bộ vị trí từ lớp duy trì.
Đừng quên thêm trình nghe một cách linh hoạt và xoá chúng khi không cần thiết nữa.
Dọn dẹp dữ liệu không dùng đến
Định kỳ xoá mọi dữ liệu không dùng đến hoặc trùng lặp trong cơ sở dữ liệu. Bạn có thể chạy bản sao lưu để kiểm tra dữ liệu theo cách thủ công hoặc định kỳ sao lưu dữ liệu vào một vùng chứa Google Cloud Storage. Bạn cũng nên cân nhắc việc lưu trữ dữ liệu được lưu trữ thông qua Cloud Storage for Firebase.
Gửi mã có thể mở rộng mà bạn có thể cập nhật
Các ứng dụng được tích hợp vào thiết bị IoT phải có mã có thể mở rộng mà bạn có thể dễ dàng cập nhật. Đừng quên kiểm thử kỹ lưỡng các trường hợp sử dụng, tính đến các trường hợp bạn có thể tăng cơ sở người dùng theo cấp số nhân và tích hợp khả năng triển khai các bản cập nhật cho mã của bạn. Hãy cân nhắc kỹ lưỡng những thay đổi lớn mà bạn có thể cần thực hiện sau này, ví dụ: nếu bạn quyết định phân mảnh dữ liệu.