Catch up on highlights from Firebase at Google I/O 2023. Learn more

Các phương pháp hay nhất cho Cloud Firestore

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 của mình, hãy chọn vị trí cơ sở dữ liệu gần người dùng nhất của bạn và tính toán tài nguyên. Các bước nhảy mạng xa hơn dễ bị lỗi hơn và tăng độ trễ truy vấn.

Để tối đa hóa tính khả dụng và độ bền của ứng dụng của bạn, hãy chọn một vị trí đa 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í trong khu vực để có chi phí thấp hơn, để có độ trễ ghi thấp hơn nếu ứng dụng của bạn nhạy cảm với độ trễ hoặc để cùng vị trí với các tài nguyên GCP khác .

ID tài liệu

  • Tránh các ID tài liệu ... .
  • Tránh sử dụng / chuyển tiếp dấu gạch chéo trong ID tài liệu.
  • Không sử dụng ID tài liệu tăng dần đơn điệu, chẳng hạn như:

    • Customer1 , Customer2 , Customer3 , ...
    • Product 1 , Product 2 , Product 3 , ...

    Các ID tuần tự như vậy có thể dẫn đến các điểm nóng ảnh hưởng đến độ trễ.

Tên trường

  • Tránh các ký tự sau trong tên trường vì chúng yêu cầu thoát thêm:

    • . Giai đoạn
    • [ dấu ngoặc trái
    • ] dấu ngoặc phải
    • * dấu hoa thị
    • ` đánh dấu ngược

chỉ mục

  • Tránh sử dụng quá nhiều chỉ mục. Quá nhiều chỉ mục có thể làm tăng độ trễ ghi và tăng chi phí lưu trữ cho các mục nhập chỉ mục.

  • Xin lưu ý rằng việc lập chỉ mục các trường có giá trị tăng dần đều, chẳng hạn như dấu thời gian, có thể dẫn đến các điểm nóng ảnh hưởng đến độ trễ đối với các ứng dụng có tốc độ đọc và ghi cao.

miễn trừ chỉ số

Đối với hầu hết các ứng dụng, bạn có thể dựa vào lập chỉ mục tự động cũng như bất kỳ liên kết thông báo lỗi nào để quản lý chỉ mục của mình. Tuy nhiên, bạn có thể muốn thêm các trường hợp miễn trừ cho một trường trong các trường hợp sau:

Trường hợp Sự miêu tả
Trường chuỗi lớn

Nếu bạn có một trường chuỗi thường chứa các giá trị chuỗi dài mà bạn không sử dụng để truy vấn, thì bạn có thể cắt 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 bộ sưu tậ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 bộ sưu tập, chẳng hạn như dấu thời gian, thì tốc độ ghi tối đa cho bộ sưu tập là 500 lần 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 bộ sưu tập chứa tài liệu có trường dấu thời gian có thể đạt đến giới hạn 500 lần 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. 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 ở tốc độ lưu lượng truy cập cao hơn. Cách tốt nhất là thêm các trường hợp miễn trừ một trường cho các trường TTL của bạn.

Mảng lớn hoặc trường bản đồ

Các trường bản đồ hoặc mảng lớn có thể đạt tới giới hạn 40.000 mục nhập chỉ mục trên mỗi tài liệu. Nếu bạn không truy vấn dựa trên mảng lớn hoặc trường bản đồ, bạn nên miễn lập chỉ mục cho nó.

Thao tác đọc 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 nhiều vào khối lượng công việc. Để biết thêm thông tin, hãy xem Cập nhật cho một tài liệu .

  • Sử dụng cuộc gọi không đồng bộ nếu có thay vì cuộc gọi đồng bộ. Các cuộc gọi không đồng bộ 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ả truy vấn trước khi hiển thị phản hồi. Nếu tra cứu và truy vấn không có phần phụ thuộc dữ liệu, thì không cần đợi đồng bộ cho đến khi tra cứu hoàn tất trước khi bắt đầu truy vấn.

  • Không sử dụng offset. Thay vào đó, hãy sử dụng con trỏ . Việc sử dụng phần bù chỉ tránh trả lại tài liệu bị bỏ qua cho ứng dụng của bạn, nhưng những tài liệu này vẫn được truy xuất nội bộ. Các tài liệu bị bỏ qua ảnh hưởng đến độ trễ của truy vấn và ứng dụng của bạn được lập hóa đơn cho các thao tác đọc cần thiết để truy xuất chúng.

Giao dịch thử lại

Thư viện máy khách và SDK Cloud Firestore tự động thử lại các giao dịch không thành công để xử lý các lỗi tạm thời. Nếu ứng dụng của bạn truy cập trực tiếp vào Cloud Firestore thông qua API REST hoặc RPC thay vì thông qua SDK, thì ứng dụng của bạn nên thực hiện các lần thử lại giao dịch để tăng độ tin cậy.

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 cập nhật theo thời gian thực, hãy xem Hiểu các truy vấn thời gian thực trên quy mô lớn .

Thiết kế theo quy mô

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 các vấn đề gây tranh cãi.

Cập nhật cho một tài liệu duy nhất

Khi bạn thiết kế ứng dụng của mình, hãy cân nhắc xem ứng dụng của bạn cập nhật các tài liệu đơn lẻ nhanh như thế nào. Cách tốt nhất để mô tả hiệu suất khối lượng công việc của bạn 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 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 các chỉ mục bị ảnh hưởng.

Một 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 các bản sao. Ở tốc độ ghi đủ cao, cơ sở dữ liệu sẽ bắt đầu gặp phải sự tranh chấp, độ trễ cao hơn hoặc các lỗi khác.

Tỷ lệ đọc, ghi và xóa cao đối với phạm vi tài liệu hẹp

Tránh tốc độ đọc hoặc ghi cao đối với các tài liệu đóng theo thứ tự từ điển, nếu không ứng dụng của bạn sẽ gặp lỗi tranh chấp. Sự cố này được gọi là phát điểm truy cập 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ổ ID tăng dần đơn điệu của riêng nó.

    Cloud Firestore phân bổ ID tài liệu bằng thuật toán phân tán. Bạn sẽ không gặp phải điểm nóng khi ghi nếu bạn tạo tài liệu mới bằng cách sử dụng ID tài liệu tự động.

  • Tạo tài liệu mới với tốc độ cao trong một bộ sưu tập có ít tài liệu.

  • Tạo tài liệu mới với trường tăng dần đều, như dấu thời gian, với tốc độ rất cao.

  • Xóa tài liệu trong bộ sưu tậ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 đã xóa

Tránh các truy vấn bỏ qua dữ liệu đã xóa gần đây. Một truy vấn có thể phải bỏ qua một số lượng lớn các mục nhập chỉ mục nếu các kết quả truy vấn ban đầu gần đây đã bị xóa.

Một ví dụ về khối lượng công việc có thể phải bỏ qua nhiều dữ liệu đã xóa là một khối lượng công việc cố gắng tìm các mục công việc đã xếp hàng cũ nhất. Truy vấn có thể giống như:

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 khi truy vấn này chạy, nó sẽ quét các mục nhập chỉ mục cho trường created trên bất kỳ tài liệu nào đã xóa 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 nơi 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 trường tăng đơn điệu, đây là trường phản mẫu để có tốc độ 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 bộ sưu tập mới hoặc đóng tài liệu 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. Chúng tôi khuyên bạn nên bắt đầu với tối đa 500 thao tác mỗi giây cho bộ sưu tập mới và sau đó tăng lưu lượng truy cập lên 50% cứ sau 5 phút. Bạn có thể tăng lưu lượng ghi của mình theo cách tương tự, nhưng hãy ghi nhớ Giới hạn tiêu chuẩn của Cloud Firestore . Đảm bảo rằng các thao tác được phân bổ tương đối đồng đều trong phạm vi phím. Đây được gọi là quy tắc "500/50/5".

Di chuyển lưu lượng truy cập sang bộ sưu tập mới

Việc tăng dần dần đặc biệt quan trọng nếu bạn di chuyển lưu lượng truy cập ứng dụng từ bộ sưu tập này sang bộ sưu tập khác. Một cách đơn giản để xử lý việc 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 thì hãy đọc từ bộ sưu tập mới. Tuy nhiên, điều này có thể gây ra sự gia tăng đột ngột về lưu lượng truy cập vào các tài liệu đóng theo thứ tự từ điển trong bộ sưu tập mới. Cloud Firestore có thể không chuẩn bị hiệu quả bộ sưu tập mới để tăng lưu lượng truy cập, đặc biệt là khi bộ sưu tập chứa ít tài liệu.

Sự cố tương tự có thể xảy ra nếu bạn thay đổi ID tài liệu của nhiều tài liệu trong cùng một bộ sưu tập.

Chiến lược tốt nhất để di chuyển lưu lượng truy cập sang bộ sưu tập mới tùy thuộc vào mô hình dữ liệu của bạn. Dưới đây là một chiến lược ví dụ được gọi là đọc song song . Bạn sẽ cần xác định xem chiến lược này có hiệu quả 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 bạn di chuyển lưu lượng truy cập sang một bộ sưu tập mới, trước tiên hãy đọc từ bộ sưu tập cũ. Nếu tài liệu bị thiếu, hãy đọc từ bộ sưu tập mới. Tỷ lệ đọc các tài liệu không tồn tại cao có thể dẫn đến việc phát điểm truy cập, vì vậy hãy đảm bảo tăng dần tải cho bộ sưu tập mới. Một chiến lược tốt hơn là sao chép tài liệu cũ vào bộ sưu tập mới, sau đó xóa tài liệu cũ. Tăng dần số lần đọc song song để đảm bảo rằng Cloud Firestore có thể xử lý lưu lượng truy cập vào bộ sưu tập mới.

Một chiến lược khả thi để tăng dần số lần đọc hoặc ghi vào một bộ sưu tập mới là sử dụng hàm băm xác định của ID 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 viết tài liệu mới. Đảm bảo rằng kết quả băm ID người dùng không bị sai lệch bởi chức năng của bạn hoặc bởi hành vi của người dùng.

Trong khi đó, hãy chạy một công việc hàng loạt để sao chép tất cả dữ liệu của bạn từ các tài liệu cũ sang bộ sưu tập mới. Công việc hàng loạt của bạn nên tránh ghi vào ID tài liệu tuần tự để ngăn các điểm phát sóng. Khi công việc hàng loạt kết thúc, bạn chỉ có thể đọc từ bộ sưu tập mới.

Một cải tiến của chiến lược này là di chuyển từng nhóm nhỏ người dùng cùng một lúc. 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 loạt người dùng để di chuyển dựa trên hàm băm của ID người dùng. Sử dụng một công việc theo lô để di chuyển tài liệu cho nhóm người dùng đó và sử dụng các lần đọc song song cho người dùng ở giữa quá trình di chuyển.

Lưu ý rằng bạn không thể dễ dàng khôi phục trừ khi bạn ghi kép cả thực thể cũ và thực thể mới trong giai đoạn di chuyển. Điều này sẽ làm tăng chi phí Cloud Firestore phát sinh.

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 Quy tắc bảo mật của Cloud Firestore. Ví dụ: sử dụng quy tắc có thể tránh được trường hợp người dùng có ác ý tải xuống liên tục toàn bộ cơ sở dữ liệu của bạn.

Tìm hiểu thêm về cách sử dụng Quy tắc bảo mật của Cloud Firestore .