Hãy sử dụng các phương pháp hay nhất được liệt kê ở đây làm tài liệu tham khảo nhanh khi xây dựng ứng dụng sử dụng Cloud Firestore.
Vị trí cơ sở dữ liệu
Khi bạn tạo phiên bản cơ sở dữ liệu, hãy chọn vị trí cơ sở dữ liệu gần nhất với người dùng và tài nguyên điện toán của bạn. Các bước nhảy mạng xa dễ xảy ra lỗi hơn và làm tăng độ trễ của truy vấn.
Để tối đa hoá khả năng hoạt động và độ bền của ứng dụng, hãy chọn một vị trí nhiều khu vực và đặt các tài nguyên điện toán quan trọng ở ít nhất hai khu vực.
Chọn một vị trí theo khu vực để có chi phí thấp hơn, độ trễ ghi thấp hơn nếu ứng dụng của bạn nhạy cảm với độ trễ hoặc để đồng vị trí với các tài nguyên GCP khác.
Mã nhận dạng tài liệu
- Tránh sử dụng mã nhận dạng tài liệu
.và... - Tránh sử dụng dấu gạch chéo
/trong mã tài liệu. Không sử dụng mã nhận dạng tài liệu tăng đơn điệu, chẳng hạn như:
Customer1,Customer2,Customer3, ...Product 1,Product 2,Product 3, ...
Những mã nhận dạng tuần tự như vậy có thể dẫn đến điểm nóng ảnh hưởng đến độ trễ.
Tên trường
Tránh sử dụng các ký tự sau trong tên trường vì chúng yêu cầu thêm ký tự thoát:
.dấu chấm[dấu ngoặc vuông trái]dấu ngoặc vuông phải*dấu hoa thị`dấu phẩy ngược
Chỉ số
Giảm độ trễ ghi
Yếu tố chính gây ra độ trễ ghi là phân nhánh chỉ mục. Các phương pháp hay nhất để giảm mức độ phân tán chỉ mục là:
Đặt quyền miễn trừ lập chỉ mục ở cấp tập hợp. Một cách dễ dàng là tắt tính năng lập chỉ mục mảng và giảm dần. Việc xoá các giá trị được lập chỉ mục không dùng đến cũng sẽ giúp giảm chi phí lưu trữ.
Giảm số lượng tài liệu trong một giao dịch. Để ghi một số lượng lớn tài liệu, hãy cân nhắc sử dụng trình ghi hàng loạt thay vì trình ghi theo lô nguyên tử.
Miễn trừ lập chỉ mục
Đối với hầu hết các ứng dụng, bạn có thể dựa vào tính năng lập chỉ mục tự động cũng như mọi đường liên kết đến thông báo lỗi để quản lý chỉ mục của mình. Tuy nhiên, bạn có thể thêm trường hợp miễn trừ một trường trong các trường hợp sau:
| Cách | Mô tả |
|---|---|
| Trường chuỗi lớn | Nếu có một trường chuỗi thường chứa các giá trị chuỗi dài mà bạn không dùng để truy vấn, thì bạn có thể giảm chi phí lưu trữ bằng cách miễn lập chỉ mục cho trường đó. |
| Tỷ lệ ghi cao vào một tập hợp chứa các tài liệu có giá trị tuần tự | Nếu bạn lập chỉ mục một trường tăng hoặc giảm tuần tự giữa các tài liệu trong một tập hợp (chẳng hạn như dấu thời gian), thì tốc độ ghi tối đa vào tập hợp đó là 500 lượt ghi mỗi giây. Nếu không truy vấn dựa trên trường có giá trị tuần tự, bạn có thể miễn lập chỉ mục cho trường đó để bỏ qua giới hạn này. Ví dụ: trong trường hợp sử dụng IoT có tốc độ ghi cao, một tập hợp chứa các tài liệu có trường dấu thời gian có thể đạt đến giới hạn 500 lượt ghi mỗi giây. |
| Trường TTL |
Nếu bạn sử dụng chính sách TTL (thời gian tồn tại), hãy lưu ý rằng trường TTL phải là dấu thời gian. Tính năng lập chỉ mục trên các trường TTL được bật theo mặc định và có thể ảnh hưởng đến hiệu suất khi lưu lượng truy cập cao hơn. Phương pháp hay nhất là thêm các trường hợp miễn lập chỉ mục tự động cho các trường TTL. |
| Các trường mảng hoặc bản đồ lớn | Các trường mảng hoặc bản đồ lớn có thể đạt đến giới hạn 40.000 mục nhập chỉ mục cho mỗi tài liệu. Nếu không truy vấn dựa trên một trường mảng hoặc bản đồ lớn, bạn nên miễn lập chỉ mục cho trường đó. |
Thao tác đọc và ghi
Tốc độ tối đa chính xác mà một ứng dụng có thể cập nhật một tài liệu phụ thuộc rất nhiều vào khối lượng công việc. Để biết thêm thông tin, hãy xem phần Nội dung cập nhật cho một tài liệu.
Sử dụng lệnh gọi không đồng bộ (nếu có) thay vì lệnh gọi đồng bộ. Lệnh gọi không đồng bộ giúp giảm thiểu tác động của độ trễ. Ví dụ: hãy xem xét một ứng dụng cần kết quả tra cứu tài liệu và kết quả của một truy vấn trước khi hiển thị phản hồi. Nếu hoạt động tra cứu và truy vấn không có phần phụ thuộc dữ liệu, thì bạn không cần phải đợi đồng bộ cho đến khi hoạt động tra cứu hoàn tất trước khi bắt đầu truy vấn.
Không sử dụng độ lệch. Thay vào đó, hãy sử dụng con trỏ. Việc sử dụng độ lệch chỉ giúp tránh trả về các tài liệu bị bỏ qua cho ứng dụng của bạn, nhưng các tài liệu này vẫn được truy xuất nội bộ. Các tài liệu bị bỏ qua sẽ ảnh hưởng đến độ trễ của truy vấn và ứng dụng của bạn sẽ bị tính phí cho các thao tác đọc cần thiết để truy xuất các tài liệu đó.
Thử lại giao dịch
Cloud Firestore SDK và thư viện ứng dụng tự động thử lại các giao dịch không thành công để xử lý lỗi tạm thời. Nếu ứng dụng của bạn truy cập vào Cloud Firestore trực tiếp thông qua API REST hoặc RPC thay vì thông qua SDK, thì ứng dụng của bạn nên triển khai cơ chế thử lại giao dịch để tăng độ tin cậy.
Thông tin cập nhật theo thời gian thực
Để biết các phương pháp hay nhất liên quan đến thông tin cập nhật theo thời gian thực, hãy xem bài viết Tìm hiểu về truy vấn theo thời gian thực trên quy mô lớn.
Thiết kế để điều chỉnh theo tỷ lệ
Các phương pháp hay nhất sau đây mô tả cách tránh các tình huống tạo ra vấn đề tranh chấp.
Nội dung cập nhật cho một tài liệu
Khi thiết kế ứng dụng, hãy cân nhắc tốc độ cập nhật từng tài liệu của ứng dụng. Cách tốt nhất để mô tả hiệu suất của khối lượng công việc là thực hiện kiểm thử tải. Tốc độ tối đa chính xác mà một ứng dụng có thể cập nhật một tài liệu phụ thuộc rất nhiều vào khối lượng công việc. Các yếu tố bao gồm tốc độ ghi, sự tranh chấp giữa các yêu cầu và số lượng chỉ mục bị ảnh hưởng.
Thao tác ghi tài liệu sẽ cập nhật tài liệu và mọi chỉ mục liên quan, đồng thời Cloud Firestore áp dụng đồng bộ thao tác ghi trên một nhóm bản sao. Ở tốc độ ghi đủ cao, cơ sở dữ liệu sẽ bắt đầu gặp phải tình trạng tranh chấp, độ trễ cao hơn hoặc các lỗi khác.
Tỷ lệ đọc, ghi và xoá cao đối với một phạm vi tài liệu hẹp
Tránh tỷ lệ đọc hoặc ghi cao đối với các tài liệu gần nhau về mặt từ vựng, nếu không ứng dụng của bạn sẽ gặp lỗi tranh chấp. Vấn đề này được gọi là điểm phát sóng và ứng dụng của bạn có thể gặp phải điểm phát sóng nếu thực hiện bất kỳ thao tác nào sau đây:
Tạo tài liệu mới với tốc độ rất cao và phân bổ mã nhận dạng tăng dần đơn điệu của riêng tài liệu đó.
Cloud Firestore phân bổ mã tài liệu bằng thuật toán phân tán. Bạn không nên gặp phải tình trạng điểm truy cập khi ghi nếu tạo tài liệu mới bằng mã tài liệu tự động.
Tạo tài liệu mới với tốc độ cao trong một tập hợp có ít tài liệu.
Tạo tài liệu mới bằng một trường tăng dần đơn điệu, chẳng hạn như dấu thời gian, với tốc độ rất cao.
Xoá tài liệu trong một tập hợp với tốc độ cao.
Ghi vào cơ sở dữ liệu với tốc độ rất cao mà không tăng dần lưu lượng truy cập.
Tránh bỏ qua dữ liệu đã xoá
Tránh các truy vấn bỏ qua dữ liệu đã xoá gần đây. Một truy vấn có thể phải bỏ qua một số lượng lớn mục nhập chỉ mục nếu kết quả truy vấn ban đầu mới bị xoá gần đây.
Một ví dụ về khối lượng công việc có thể phải bỏ qua nhiều dữ liệu đã xoá là khối lượng công việc cố gắng tìm các mục công việc cũ nhất trong hàng đợi. Truy vấn có thể có dạng như sau:
docs = db.collection('WorkItems').order_by('created').limit(100)
delete_batch = db.batch()
for doc in docs.stream():
finish_work(doc)
delete_batch.delete(doc.reference)
delete_batch.commit()
Mỗi lần chạy, truy vấn này sẽ quét các mục nhập chỉ mục cho trường created trên mọi tài liệu đã xoá gần đây. Điều này làm chậm các truy vấn.
Để cải thiện hiệu suất, hãy sử dụng phương thức start_at để tìm vị trí tốt nhất để bắt đầu. Ví dụ:
completed_items = db.collection('CompletionStats').document('all stats').get()
docs = db.collection('WorkItems').start_at(
{'created': completed_items.get('last_completed')}).order_by(
'created').limit(100)
delete_batch = db.batch()
last_completed = None
for doc in docs.stream():
finish_work(doc)
delete_batch.delete(doc.reference)
last_completed = doc.get('created')
if last_completed:
delete_batch.update(completed_items.reference,
{'last_completed': last_completed})
delete_batch.commit()
LƯU Ý: Ví dụ trên sử dụng một trường tăng đơn điệu, đây là một mẫu phản thiết kế cho tỷ lệ ghi cao.
Tăng lưu lượng truy cập
Bạn nên tăng dần lưu lượng truy cập vào các tập hợp mới hoặc các tài liệu gần nhau theo thứ tự từ điển để Cloud Firestore có đủ thời gian chuẩn bị tài liệu cho lưu lượng truy cập tăng lên. Bạn nên bắt đầu với tối đa 500 thao tác mỗi giây cho một tập hợp mới, sau đó tăng lưu lượng truy cập thêm 50% sau mỗi 5 phút. Bạn cũng có thể tăng lưu lượng ghi theo cách tương tự, nhưng hãy lưu ý đến Cloud Firestore Giới hạn tiêu chuẩn. Hãy đảm bảo rằng các thao tác được phân phối tương đối đồng đều trong phạm vi khoá. Đây được gọi là quy tắc "500/50/5".
Di chuyển lưu lượng truy cập sang một bộ sưu tập mới
Việc tăng dần lưu lượng truy cập đặc biệt quan trọng nếu bạn di chuyển lưu lượng truy cập ứng dụng từ một tập hợp sang một tập hợp khác. Một cách đơn giản để xử lý quá trình di chuyển này là đọc từ bộ sưu tập cũ và nếu tài liệu không tồn tại, hãy đọc từ bộ sưu tập mới. Tuy nhiên, việc này có thể khiến lưu lượng truy cập tăng đột ngột đối với các tài liệu gần nhau theo thứ tự từ điển trong tập hợp mới. Cloud Firestore có thể không chuẩn bị hiệu quả cho tập hợp mới để tăng lưu lượng truy cập, đặc biệt là khi tập hợp đó chứa ít tài liệu.
Vấn đề tương tự có thể xảy ra nếu bạn thay đổi mã tài liệu của nhiều tài liệu trong cùng một tập hợp.
Chiến lược tốt nhất để di chuyển lưu lượng truy cập sang một tập hợp mới phụ thuộc vào mô hình dữ liệu của bạn. Dưới đây là ví dụ về một chiến lược được gọi là đọc song song. Bạn cần xác định xem chiến lược này có hiệu quả đối với dữ liệu của mình hay không và một yếu tố quan trọng cần cân nhắc là tác động về chi phí của các hoạt động song song trong quá trình di chuyển.
Đọc song song
Để triển khai các lượt đọc song song khi di chuyển lưu lượng truy cập sang một tập hợp mới, hãy đọc từ tập hợp cũ trước. Nếu thiếu tài liệu, hãy đọc từ bộ sưu tập mới. Tỷ lệ đọc cao đối với các tài liệu không tồn tại có thể dẫn đến tình trạng điểm phát sóng, vì vậy, hãy nhớ tăng dần tải cho tập hợp mới. Chiến lược tốt hơn là sao chép tài liệu cũ sang bộ sưu tập mới, sau đó xoá tài liệu cũ. Tăng dần số lượt đọc song song để đảm bảo rằng Cloud Firestore có thể xử lý lưu lượng truy cập vào tập hợp mới.
Một chiến lược khả thi để tăng dần số lượt đọc hoặc ghi vào một tập hợp mới là sử dụng hàm băm tất định của mã nhận dạng người dùng để chọn một tỷ lệ phần trăm ngẫu nhiên người dùng đang cố gắng ghi tài liệu mới. Đảm bảo rằng kết quả của hàm băm mã nhận dạng người dùng không bị sai lệch do hàm của bạn hoặc do hành vi của người dùng.
Trong khi đó, hãy chạy một công việc theo lô để sao chép tất cả dữ liệu từ tài liệu cũ sang tập hợp mới. Công việc theo lô của bạn nên tránh ghi vào mã tài liệu tuần tự để ngăn chặn các điểm truy cập. Khi công việc theo lô kết thúc, bạn chỉ có thể đọc từ tập hợp mới.
Một cách tinh chỉnh chiến lược này là di chuyển từng nhóm nhỏ người dùng. Thêm một trường vào tài liệu người dùng để theo dõi trạng thái di chuyển của người dùng đó. Chọn một nhóm người dùng để di chuyển dựa trên hàm băm của mã nhận dạng người dùng. Sử dụng một công việc theo lô để di chuyển tài liệu cho lô người dùng đó và sử dụng các lượt đọc song song cho người dùng đang trong quá trình di chuyển.
Xin lưu ý rằng bạn không thể dễ dàng khôi phục trừ phi bạn ghi kép cả thực thể cũ và mới trong giai đoạn di chuyển. Điều này sẽ làm tăng Cloud Firestore chi phí phát sinh.
Quyền riêng tư
- Tránh lưu trữ thông tin nhạy cảm trong Mã dự án trên đám mây. Mã dự án trên đám mây có thể được giữ lại sau khi dự án của bạn kết thúc.
- Để tuân thủ quy định về dữ liệu, bạn không nên lưu trữ thông tin nhạy cảm trong tên tài liệu và tên trường tài 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 của bạn bằng Cloud Firestore Security Rules. Ví dụ: việc sử dụng các quy tắc có thể tránh được 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 Cloud Firestore Security Rules.