Các phương pháp hay nhất để tìm nạp Cấu hình từ xa một cách hiệu quả

Firebase Remote Config cho phép bạn kiểm soát linh hoạt hành vi và giao diện của ứng dụng. Điều này cho phép các chức năng như triển khai tính năng và thử nghiệm A/B trên nhiều nền tảng cho ứng dụng của bạn, tất cả đều không cần triển khai các phiên bản mới hoặc điều hướng nhiều bản cập nhật cửa hàng ứng dụng.

Cho dù bạn đang tạo mẫu, điều hành một công ty khởi nghiệp đang phát triển hay quản lý một ứng dụng doanh nghiệp ở quy mô lớn, thì việc quản lý số lượng tìm nạp mạng là yếu tố then chốt để mang lại trải nghiệm người dùng nhanh chóng và có tính phản hồi. Việc quản lý cấu hình hiệu quả giúp giảm độ trễ khi khởi động nguội, tiết kiệm dữ liệu và mức sử dụng pin của ứng dụng, đồng thời ngăn chặn tình trạng hao tổn mạng không cần thiết. Ngoài ra, nếu cơ sở người dùng của bạn mở rộng nhanh chóng và làm tăng mức sử dụng trong tương lai, thì việc tinh giản quy trình tích hợp Remote Config sẽ giúp đảm bảo mức sử dụng của bạn vẫn hiệu quả.

Bạn có thể giảm đáng kể lưu lượng yêu cầu mạng phía máy khách bằng cách tinh chỉnh cách thức và thời điểm ứng dụng tìm nạp các tham số cũng như thời điểm ứng dụng kích hoạt các tham số đó.

Chuyển sang mẫu "tìm nạp cho phiên tiếp theo"

Một mẫu phổ biến cần tránh là sử dụng lệnh gọi fetchAndActivate (vừa tìm nạp các giá trị mới qua mạng vừa kích hoạt các giá trị đó) trên mọi lần khởi chạy ứng dụng, kết hợp với thời gian hết hạn bộ nhớ đệm ngắn cho các giá trị đã tìm nạp trước đó (ví dụ: 15 phút đến 1 giờ). Mô hình tinh thần đằng sau phương pháp này là mỗi khi người dùng mở ứng dụng, họ luôn có các giá trị mới nhất được tìm nạp và áp dụng. Mặc dù đôi khi bạn cần cập nhật ngay (ví dụ: chạy chiến dịch bán hàng hằng ngày hoặc chương trình khuyến mãi trò chơi), nhưng bạn cần cân bằng mục tiêu đó với tác động đến hiệu suất và mức sử dụng lệnh tìm nạp của ứng dụng.

Phương pháp này buộc các lệnh gọi mạng mới mỗi khi bộ nhớ đệm hết hạn, tạo ra khối lượng tìm nạp cao cho những người dùng mở ứng dụng nhiều lần trong ngày.

Thay vào đó, hãy cân nhắc sử dụng riêng các lệnh gọi fetch và activate với khoảng thời gian tìm nạp tối thiểu cao hơn để áp dụng mô hình "tìm nạp cho phiên tiếp theo". Bạn vẫn có thể sử dụng fetchAndActivate với khoảng thời gian tìm nạp tối thiểu cao hơn vì fetch chỉ thực thi một yêu cầu mạng nếu bộ nhớ đệm không hợp lệ, nhưng việc sử dụng riêng hai lệnh gọi này sẽ giúp củng cố mẫu và thiết lập mẫu này làm phương pháp tiêu chuẩn trong quy trình phát triển ứng dụng của bạn. Ngoài ra, bằng cách kích hoạt riêng biệt, bạn không gặp phải rủi ro khi áp dụng các giá trị cấu hình trong phiên và làm gián đoạn trải nghiệm người dùng.

Cách hoạt động của phương pháp này

  • Kích hoạt ngay khi khởi chạy: Áp dụng ngay các cấu hình được lưu vào bộ nhớ đệm từ phiên trước (độ trễ mạng là 0 mili giây).
  • Tìm nạp ở chế độ nền bằng bộ nhớ đệm có thời gian lưu trữ lâu hơn (ví dụ: hơn 12 hoặc 24 giờ): Yêu cầu các cấu hình đã cập nhật một cách không đồng bộ để làm mới bộ nhớ đệm cục bộ cho phiên tiếp theo.

Cách tính năng này tối ưu hoá số lượng tìm nạp

Khoảng thời gian tìm nạp tối thiểu càng dài thì số lượng yêu cầu tìm nạp càng ít. Việc tìm nạp các giá trị mới cho phiên tiếp theo và kích hoạt các giá trị được lưu vào bộ nhớ đệm cho phiên hiện tại có nghĩa là ứng dụng của bạn sẽ tải ngay lập tức từ bộ nhớ đệm cục bộ trong một khoảng thời gian xác thực dài hơn, nhờ đó mang lại trải nghiệm tốt hơn cho người dùng.

Ví dụ: nếu bạn đặt minimumFetchInterval thành 24 giờ và người dùng mở ứng dụng của bạn 5 hoặc 10 lần trong một ngày, thì SDK sẽ tự động đáp ứng các lần khởi chạy từ 2 đến 10 ngay từ bộ nhớ đệm cục bộ, giảm số lượng yêu cầu mạng hằng ngày của người dùng đó từ 10 hoặc nhiều lần tìm nạp xuống còn 1.

Các ví dụ sau đây cho thấy cách triển khai này đối với Android, các nền tảng của Apple và ứng dụng web:

Android

val remoteConfig = Firebase.remoteConfig

// Set a 24-hour minimum fetch interval (86,400 seconds)
val configSettings = remoteConfigSettings {
    minimumFetchIntervalInSeconds = 86400
}
remoteConfig.setConfigSettingsAsync(configSettings)

// 1. Instantly activate values cached from the LAST session
remoteConfig.activate().addOnCompleteListener {
    applyAppConfigurations()
}

// 2. Fetch new values in the background for the NEXT session
remoteConfig.fetch().addOnCompleteListener { task ->
    if (task.isSuccessful) {
        // Optional: Activate values if needed
    }
}

iOS+

let remoteConfig = RemoteConfig.remoteConfig()

// Set a 24-hour minimum fetch interval (86,400 seconds)
let settings = RemoteConfigSettings()
settings.minimumFetchInterval = 86400
remoteConfig.configSettings = settings

// 1. Instantly activate values cached from the LAST session
remoteConfig.activate { changed, error in
    guard error == nil else { return }
    DispatchQueue.main.async {
        self.applyAppConfigurations()
    }
}

// 2. Fetch new values in the background for the NEXT session
remoteConfig.fetch { status, error in
    if status == .success {
        // Optional: Activate values if needed
    }
}

Web

import { getRemoteConfig, fetchConfig, activate } from "firebase/remote-config";

const remoteConfig = getRemoteConfig(app);

// Set a 24-hour minimum fetch interval (86,400,000 ms)
remoteConfig.settings.minimumFetchIntervalMillis = 86400000;

// 1. Instantly activate values cached from the LAST session
activate(remoteConfig).then(() => {
    applyAppConfigurations();
});

// 2. Fetch new values in the background for the NEXT session
fetchConfig(remoteConfig).then(() => {
    // Optional: Activate values if needed
});

Triển khai tính năng tìm nạp "thông minh" có điều kiện

Nếu mẫu "tìm nạp cho phiên tiếp theo" gây ra quá nhiều độ trễ giữa thời điểm bạn cần cập nhật các giá trị Remote Config và thời điểm các giá trị đó có sẵn trong ứng dụng khách của bạn, hãy cân nhắc việc áp dụng tính năng tìm nạp "thông minh" có điều kiện.

Để triển khai hiệu quả, hãy tránh đính kèm các trình kích hoạt fetch vào các lệnh gọi lại vòng đời giao diện người dùng diện rộng, chẳng hạn như mỗi khi màn hình tải, thẻ chuyển đổi hoặc chế độ xem lấy tiêu điểm.

Thay vào đó, hãy kích hoạt các yêu cầu tìm nạp một cách chọn lọc dựa trên các hành động hoặc trạng thái rõ ràng của ứng dụng, chẳng hạn như:

  • Sự kiện đăng nhập của người dùng
  • Chuyển sang các luồng người dùng cụ thể nơi các tham số của bạn được sử dụng (ví dụ: tham gia phễu quy trình thanh toán hoặc tăng cấp trong trò chơi)

Ngược lại, hãy tránh kích hoạt các yêu cầu tìm nạp cho các thao tác thường xuyên như:

  • Khi người dùng mở ứng dụng hoặc bắt đầu một phiên hoạt động mới
  • Khi ứng dụng chuyển đổi giữa trạng thái nền và trạng thái nền trước

Các bước tiếp theo