Có một số cách để cải thiện hiệu suất Firebase Realtime Database trong ứng dụng. Để tìm hiểu những việc bạn có thể làm để tối ưu hoá hiệu suất Realtime Database, 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 đó điều chỉnh ứng dụng hoặc cách sử dụng Realtime Database cho phù hợp.
Theo dõi hiệu suất Realtime Database
Bạn có thể thu thập dữ liệu về hiệu suất của Realtime Database thông qua một số công cụ, tuỳ thuộc vào mức độ chi tiết mà bạn cần:
- Tổng quan cấp cao: Sử dụng công cụ 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.
- Mức sử dụng được tính phí ước tính: Sử dụng các chỉ số về mức sử dụng có trong bảng điều khiển Firebase để xem mức sử dụng được tính phí và các chỉ số hiệu suất cấp cao.
- Xem chi tiết chi tiết: Sử dụng Cloud Monitoring để hiểu rõ 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 bạn đã thu thập dữ liệu, hãy khám phá các chiến lược và phương pháp hay nhất sau đây dựa trên khía cạnh hiệu suất mà bạn muốn cải thiện.
Tổng quan về các chiến lược cải thiện hiệu suất | ||
---|---|---|
Chỉ số | Nội dung mô tả | Các phương pháp hay nhất |
Tải/Mức sử dụng | Tối ưu hoá dung lượng cơ sở dữ liệu đang được sử dụng để xử lý các yêu cầu tại một thời điểm bất kỳ (được phản ánh trong chỉ số **Load** (Tải) hoặc **io/database_load** (io/database_load)). |
Tối ưu hoá cấu trúc dữ liệu Phân đoạn 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 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 |
Kết nối đang hoạt động | Cân bằng số lượng kết nối đang hoạt động đồng thời vào cơ sở dữ liệu của bạn để không vượt quá giới hạn 200.000 kết nối. |
Phân đoạn 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 mong muốn, thì bạn có thể cải thiện hiệu quả của các thao tác đọc và giảm mức hao tổn 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 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 sử dụng 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 Firebase khác để vẫn nằm trong 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 đoạn dữ liệu trên các cơ sở dữ liệu Sử dụng Cloud Storage for Firebase |
Tối ưu hoá mối 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. Các kết nối thường xuyên, ngắn hạ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 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úp giảm chi phí mã hoá SSL và tải cơ sở dữ liệu có thể bổ sung bằ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 duy trì kết nối HTTP để duy trì kết nối mở hoặc sử dụng các sự kiện do máy chủ gửi. Điều này có thể làm giảm chi phí từ các lượt bắt tay SSL.
Phân đoạn dữ liệu trên nhiều cơ sở dữ liệu
Việc phân tách dữ liệu trên nhiều thực thể Realtime Database (còn gọi là phân đoạn 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 của bạn bằng cách phân tách các kết nối đó trên các phiên bản 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 quyền truy cập vào các tập dữ liệu riêng biệt, hãy sử dụng các phiên bản cơ sở dữ liệu khác nhau để có đượ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 phiên bản 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 phổ biến trên các phiên bản cơ sở dữ liệu.
Tìm hiểu thêm về cách thức và thời điểm phân đoạn 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 nên giữ cho cấu trúc dữ liệu của mình 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 cho ứng dụng.
Cụ thể, hãy cân nhắc việc ghi và xoá khi bạn đang định cấu trúc dữ liệu. Ví dụ: các đường dẫn có hàng nghìn lá có thể tốn kém khi xoá. Việc chia tách chúng thành các đường dẫn có nhiều cây con và ít lá hơn trên mỗi nút có thể giúp tăng tốc độ xoá.
Ngoài ra, mỗi lượt ghi có thể chiếm 0,1% tổng mức sử dụng cơ sở dữ liệu.
Sắp xếp 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 bản cập nhật nhiều đường dẫn thông qua các phương thức update()
trong SDK hoặ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 dành cho cấu trúc dữ liệu.
Ngăn chặn truy cập trái phép
Ngăn chặn các hoạt động trái phép trên cơ sở dữ liệu của bạn bằng Realtime Database Security Rules. Ví dụ: việc sử dụng quy tắc có thể tránh được trường hợp người dùng độc hại tải toàn bộ cơ sở dữ liệu của bạn xuống nhiều lần.
Tìm hiểu thêm về cách sử dụng Quy tắc cơ sở dữ liệu thời gian thực 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ể 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ằng biểu thức query.
như query.limitToFirst
, các truy vấn chỉ truy xuất dữ liệu được giới hạn theo quy tắc.
Ví dụ: quy tắc sau đây chỉ giới hạn quyền đọc đối với 1.000 kết quả đầu tiên của một truy vấn, được sắp xếp theo mức độ ư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 lập chỉ mục
Việc lập chỉ mục dữ liệu sẽ làm giảm tổng băng thông mà bạn sử dụng cho mỗi truy vấn mà ứng dụng của bạn chạy.
Sử dụng lại các phiên SSL
Giảm chi phí hao tổn khi mã hoá SSL trên các kết nối tiếp tục bằng cách phát vé phiên TLS. Điều này đặc biệt hữu ích nếu bạn cần kết nối thường xuyên và an toàn với cơ sở dữ liệu.
Cải thiện hiệu quả của trình nghe
Đặt trình nghe vào cuối đường dẫn càng tốt để giới hạn lượng dữ liệu mà chúng đồng bộ hoá. Người nghe phải ở gần dữ liệu mà bạn muốn họ nhận được. Đừng nghe ở thư mục gốc của 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 truy vấn để giới hạn dữ liệu mà các thao tác nghe trả về và sử dụng 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()
. Đặt trước .once()
cho những hành động 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ể để đạt đượ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ì bạn phải đọc toàn bộ vị trí từ lớp cố định.
Hãy nhớ thêm trình nghe một cách linh động và xoá trình nghe khi không còn 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 sử dụng hoặc trùng lặp trong cơ sở dữ liệu của bạn. 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 sao lưu định kỳ dữ liệu vào một bộ chứa Google Cloud Storage. Ngoài ra, hãy cân nhắc lưu trữ dữ liệu được lưu trữ thông qua Cloud Storage for Firebase.
Phân phố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. Hãy nhớ kiểm thử kỹ các trường hợp sử dụng, tính đến các tình huống mà bạn có thể tăng cơ sở người dùng theo cấp số nhân và tăng khả năng triển khai các bản cập nhật cho mã của mình. Hãy cân nhắc kỹ những thay đổi lớn mà bạn có thể cần thực hiện trong tương lai, chẳng hạn như nếu bạn quyết định phân đoạn dữ liệu.