Mở rộng quy mô với nhiều cơ sở dữ liệu

Cách tốt nhất để tối ưu hoá hiệu suất và mở rộng quy mô dữ liệu trong Firebase Realtime Database là chia dữ liệu trên nhiều thực thể Realtime Database, còn được gọi là phân mảnh cơ sở dữ liệu. Ngoài việc cân bằng tải và tối ưu hoá hiệu suất, tính năng phân đoạn còn giúp bạn linh hoạt mở rộng quy mô vượt quá các giới hạn áp dụng cho từng thực thể cơ sở dữ liệu.

Thời điểm phân đoạn dữ liệu

Bạn có thể muốn phân đoạn dữ liệu trên nhiều cơ sở dữ liệu nếu đang sử dụng Realtime Database và thuộc bất kỳ trường hợp nào sau đây:

  • Bạn muốn mở rộng quy mô vượt quá giới hạn 200.000 kết nối đồng thời, 1.000 thao tác ghi/giây hoặc bất kỳ giới hạn nào khác cho một thực thể cơ sở dữ liệu.
  • Bạn có nhiều tập dữ liệu riêng biệt và muốn tối ưu hoá hiệu suất (ví dụ: một ứng dụng trò chuyện phục vụ các nhóm người dùng riêng biệt, độc lập).
  • Bạn muốn cân bằng tải trên nhiều cơ sở dữ liệu để cải thiện thời gian hoạt động và giảm nguy cơ quá tải một thực thể cơ sở dữ liệu.

Cách phân mảnh dữ liệu

Để phân mảnh dữ liệu, hãy làm theo các bước sau (được mô tả chi tiết hơn bên dưới):

  1. Ánh xạ dữ liệu của bạn vào nhiều cơ sở dữ liệu theo nhu cầu cụ thể của ứng dụng.
  2. Tạo nhiều thực thể cơ sở dữ liệu.
  3. Định cấu hình ứng dụng để ứng dụng kết nối với thực thể Realtime Database cần thiết cho mỗi tập dữ liệu.

Ánh xạ dữ liệu

Khi ánh xạ dữ liệu vào nhiều cơ sở dữ liệu, hãy cố gắng đáp ứng các điều kiện sau:

  • Mỗi truy vấn chỉ chạy trên một thực thể cơ sở dữ liệu. Realtime Database không hỗ trợ các truy vấn trên nhiều thực thể cơ sở dữ liệu.
  • Không chia sẻ hoặc sao chép dữ liệu trên nhiều thực thể cơ sở dữ liệu (hoặc chia sẻ hoặc sao chép ở mức tối thiểu).
  • Mỗi thực thể ứng dụng chỉ kết nối với một cơ sở dữ liệu tại bất kỳ thời điểm nào.

Khi ánh xạ dữ liệu, hãy cân nhắc áp dụng các chiến lược sau:

Tạo "phân mảnh chính"

Lưu trữ một bản đồ về cách dữ liệu của bạn được lưu trữ trên nhiều thực thể cơ sở dữ liệu. Bằng cách này, bạn có thể tra cứu theo lập trình thực thể cơ sở dữ liệu nào tương ứng với máy khách đang kết nối. Xin lưu ý rằng cách này có thể tốn nhiều chi phí hơn so với việc kết nối trực tiếp với thực thể cơ sở dữ liệu cụ thể mà bạn cần, khi bạn cần.

Phân loại dữ liệu theo danh mục hoặc theo khách hàng

Lưu trữ dữ liệu trong các thực thể cơ sở dữ liệu riêng biệt, được nhóm theo người dùng hoặc loại dữ liệu. Ví dụ: nếu bạn xây dựng một ứng dụng trò chuyện phục vụ nhiều tổ chức, bạn có thể tạo một thực thể cơ sở dữ liệu cho mỗi tổ chức và lưu trữ tất cả dữ liệu trò chuyện trong các thực thể cơ sở dữ liệu riêng biệt.

Trong trường hợp này, tổ chức A và tổ chức B không chia sẻ dữ liệu, không có dữ liệu trùng lặp trong cơ sở dữ liệu của bạn và bạn chỉ thực hiện các truy vấn trên một thực thể cơ sở dữ liệu. Ngoài ra, người dùng trong mỗi tổ chức chỉ kết nối với cơ sở dữ liệu của tổ chức khi họ sử dụng ứng dụng trò chuyện.

Sau đó, bạn có thể tạo trước một số thực thể cơ sở dữ liệu và sử dụng mã nhận dạng của tổ chức để ánh xạ một nhóm vào thực thể cơ sở dữ liệu của nhóm đó. Ví dụ: tổ chức A ánh xạ vào Cơ sở dữ liệu theo thời gian thực A.

Cách bạn ánh xạ dữ liệu cho ứng dụng phụ thuộc vào trường hợp sử dụng cụ thể của bạn, nhưng các điều kiện và chiến lược nêu trên có thể giúp bạn xác định điều gì phù hợp với dữ liệu của mình.

Tạo nhiều thực thể Realtime Database

Nếu đang sử dụng gói giá Blaze, bạn có thể tạo tối đa 1.000 thực thể cơ sở dữ liệu trong cùng một dự án Firebase.

tạo cơ sở dữ liệu trong <span class=Bảng điều khiển Firebase có trình đơn theo bối cảnh trong phần cơ sở dữ liệu" />

  1. Trong bảng điều khiển Firebase, hãy chuyển đến thẻ Dữ liệu trong phần Phát triển > Cơ sở dữ liệu.
  2. Chọn Tạo cơ sở dữ liệu mới trong trình đơn ở phần Realtime Database.
  3. Tuỳ chỉnh Tham chiếu cơ sở dữ liệuQuy tắc bảo mật, sau đó nhấp vào Đã hiểu.

Lặp lại quy trình để tạo số thực thể cơ sở dữ liệu mà bạn cần. Mỗi thực thể cơ sở dữ liệu có một tập hợp Firebase Realtime Database Security Rules riêng, vì vậy, bạn có thể tinh chỉnh quyền truy cập vào dữ liệu của mình.

Bạn có thể tạo và quản lý các thực thể cơ sở dữ liệu trong bảng điều khiển Firebase hoặc bằng cách sử dụng API REST Quản lý Cơ sở dữ liệu theo thời gian thực.

Quản lý và tương tác với các thực thể cụ thể bằng CLI

Bạn có thể quản lý và tương tác với các thực thể Realtime Database cụ thể bằng Firebase CLI.

Theo mặc định, các lệnh CLI tương tác với thực thể cơ sở dữ liệu mặc định. Tuy nhiên, bạn có thể tương tác với một thực thể cơ sở dữ liệu không phải mặc định bằng cách sử dụng cờ --instance DATABASE_NAME.

Ví dụ: sử dụng lệnh sau để chạy trình phân tích hiệu suất cho một thực thể cơ sở dữ liệu có tên là my-example-shard.firebaseio.com:

firebase database:profile --instance "my-example-shard"

Các lệnh sau đây hỗ trợ cờ --instance:

  • firebase database:get
  • firebase database:profile
  • firebase database:push
  • firebase database:remove
  • firebase database:set
  • firebase database:update

Chỉnh sửa và triển khai Realtime Database Security Rules cho từng thực thể

Đảm bảo rằng Realtime Database Security Rules cho phép truy cập thích hợp vào từng thực thể cơ sở dữ liệu trong dự án của bạn. Mỗi cơ sở dữ liệu có một tập hợp quy tắc riêng, mà bạn có thể chỉnh sửa và triển khai từ bảng điều khiển Firebase hoặc sử dụng Firebase CLI để triển khai các mục tiêu.

  • Để chỉnh sửa và triển khai các quy tắc từ bảng điều khiển Firebase, hãy làm theo các bước sau:

    1. Chuyển đến thẻ Quy tắc trong phần Phát triển > Cơ sở dữ liệu.
    2. Chọn cơ sở dữ liệu mà bạn muốn chỉnh sửa, sau đó sửa đổi các quy tắc.
  • Để chỉnh sửa và triển khai các quy tắc từ Firebase CLI, hãy làm theo các bước sau:

    1. Sửa đổi các quy tắc trong tệp quy tắc cho các thực thể cơ sở dữ liệu của bạn (ví dụ: foo.rules.json).
    2. Tạo và áp dụng các mục tiêu triển khai để liên kết các cơ sở dữ liệu sử dụng cùng một tệp quy tắc. Ví dụ:
      firebase target:apply database main my-db-1 my-db-2
      firebase target:apply database other my-other-db-3
    3. Cập nhật tệp cấu hình firebase.json bằng các mục tiêu triển khai:

      {
        "database": [
          {"target": "main", "rules": "foo.rules.json"},
          {"target": "other", "rules": "bar.rules.json"}
        ]
      }
      
    4. Chạy lệnh triển khai:

      firebase deploy

Đảm bảo bạn chỉnh sửa và triển khai các quy tắc một cách nhất quán từ cùng một vị trí. Việc triển khai các quy tắc từ Firebase CLI sẽ ghi đè mọi chỉnh sửa mà bạn đã thực hiện trong Firebase bảng điều khiển và việc chỉnh sửa các quy tắc trực tiếp trong bảng điều khiển Firebase sẽ ghi đè mọi thay đổi gần đây mà bạn đã triển khai thông qua Firebase CLI.

Kết nối ứng dụng với nhiều thực thể cơ sở dữ liệu

Sử dụng tham chiếu cơ sở dữ liệu để truy cập vào dữ liệu được lưu trữ trong các thực thể cơ sở dữ liệu thứ cấp. Bạn có thể lấy tham chiếu cho một thực thể cơ sở dữ liệu cụ thể theo URL hoặc ứng dụng. Nếu không chỉ định URL, bạn sẽ nhận được tham chiếu cho thực thể cơ sở dữ liệu mặc định của ứng dụng.

Web

import { initializeApp } from "firebase/app";
import { getDatabase } from "firebase/database";

const app1 = initializeApp({
  databaseURL: "https://testapp-1234-1.firebaseio.com"
});

const app2 = initializeApp({
  databaseURL: "https://testapp-1234-2.firebaseio.com"
}, 'app2');

// Get the default database instance for an app1
const database1 = getDatabase(app1);

// Get a database instance for app2
const database2 = getDatabase(app2);

Web

const app1 = firebase.initializeApp({
  databaseURL: "https://testapp-1234-1.firebaseio.com"
});

const app2 = firebase.initializeApp({
  databaseURL: "https://testapp-1234-2.firebaseio.com"
}, 'app2');

// Get the default database instance for an app1
var database1 = firebase.database();

// Get a database instance for app2
var database2 = firebase.database(app2);
Swift
Lưu ý: Sản phẩm Firebase này không có trên mục tiêu App Clip.
// Get the default database instance for an app
var ref: DatabaseReference!

ref = Database.database().reference()
// Get a secondary database instance by URL var ref: DatabaseReference! ref = Database.database("https://testapp-1234.firebaseio.com").reference()
Objective-C
Lưu ý: Sản phẩm Firebase này không có trên mục tiêu App Clip.
// Get the default database instance for an app
@property (strong, nonatomic) FIRDatabaseReference *ref;

self.ref = [[FIRDatabase database] reference];
// Get a secondary database instance by URL @property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase databaseWithURL:@"https://testapp-1234.firebaseio.com"] reference];

Kotlin

// Get the default database instance for an app
val primary = Firebase.database.reference

// Get a secondary database instance by URL
val secondary = Firebase.database("https://testapp-1234.firebaseio.com").reference

Java

// Get the default database instance for an app
DatabaseReference primary = FirebaseDatabase.getInstance()
        .getReference();

// Get a secondary database instance by URL
DatabaseReference secondary = FirebaseDatabase.getInstance("https://testapp-1234.firebaseio.com")
        .getReference();

Tối ưu hoá các kết nối trên mỗi cơ sở dữ liệu

Nếu mỗi máy khách cần kết nối với nhiều cơ sở dữ liệu trong một phiên, bạn có thể giảm số lượng kết nối đồng thời đến mỗi thực thể cơ sở dữ liệu bằng cách chỉ kết nối với mỗi thực thể cơ sở dữ liệu trong thời gian cần thiết.

Xem thêm lời khuyên

Nếu bạn cần thêm trợ giúp để phân đoạn dữ liệu trên nhiều thực thể cơ sở dữ liệu, hãy liên hệ với các chuyên gia Firebase trên kênh Slack hoặc trên Stack Overflow.