Cập nhật là một phần của mọi phần mềm; bạn cần sửa lỗi, thêm tính năng mới và nói chung là lặp lại để làm cho mọi thứ an toàn hơn, đáng tin cậy hơn hoặc nhanh hơn.
Nhưng việc kết hợp các tính năng mới hoặc những thay đổi nói chung với việc triển khai không phải lúc nào cũng là một ý tưởng hay. Đôi khi bạn tuân theo lịch triển khai định kỳ nhưng nhóm tiếp thị chưa sẵn sàng công bố tính năng mới. Nếu các thay đổi được mã hóa cứng, nhóm tiếp thị có thể cần nhà phát triển kích hoạt hoặc hủy kích hoạt chúng.
Cờ tính năng hoặc chuyển đổi tính năng là một cách để tách các thay đổi của bạn khỏi quá trình triển khai. Bạn thực hiện một thay đổi nhưng lại ẩn nó sau câu lệnh if; miễn là một biến là sai, phần mềm sẽ sử dụng phiên bản trước khi bạn thay đổi; nếu biến là true , nó sẽ là phiên bản mới. Nếu giá trị của biến đến từ cơ sở dữ liệu mà nhóm tiếp thị có thể truy cập, họ có thể chuyển đổi những thay đổi này mà không cần thay đổi mã.
Upstash Redis® là một cơ sở dữ liệu như vậy. Đó là một kho lưu trữ khóa-giá trị đơn giản mà bạn có thể sử dụng để lưu trữ các cờ tính năng của mình. Vì tốc độ này cực kỳ nhanh nên độ trễ không tăng nhiều khi bạn kiểm tra nhiều cờ khác nhau trong ứng dụng của mình.
Hướng dẫn này sẽ hướng dẫn bạn cách xây dựng cơ chế gắn cờ tính năng đơn giản cho ứng dụng Next.js của bạn. Chúng tôi sẽ triển khai trên Vercel và sử dụng Upstash Redis® làm bộ lưu trữ.
Điều kiện tiên quyết
Bạn cần có tài khoản GitHub, tài khoản Vercel và tài khoản Upstash.
Vì chúng tôi sử dụng NPM nên bạn cũng cần cài đặt Node.js hiện tại.
Khởi tạo dự án Next.js
Bước đầu tiên của chúng ta là tạo một dự án Next.js mới. Bạn thực hiện việc này bằng lệnh sau:
$ npx create-next-app upstash-next-feature-flags Tạo kết nối Upstash Redis®
Tiếp theo, chúng ta phải kết nối ứng dụng Next.js của mình với cơ sở dữ liệu Upstash Redis®. Để làm được điều này, chúng ta cần cài đặt @upstash/redis gói và tạo một lớp bao bọc nhỏ xung quanh nó.
$ npm i @upstash/redis
Tạo một tệp tại upstash-next-feature-flags/lib/featureFlags.js với mã này:
import { Redis } from "@upstash/redis";
const { UPSTASH_TOKEN, UPSTASH_URL } = process.env;
const redis = new Redis({
token: UPSTASH_TOKEN,
url: UPSTASH_URL,
});
export async function flagIsActive(flagName) {
const flag = await redis.get(flagName);
return Boolean(flag);
}
Chúng tôi sẽ lấy thông tin xác thực API từ các biến môi trường để thiết lập chúng sau trong hướng dẫn này. flagIsActive hàm sẽ truy vấn Redis® và chuyển đổi giá trị trả về thành boolean . Việc chuyển đổi này là cần thiết vì chúng tôi sẽ lưu cờ dưới dạng số trong Redis.
Tạo lộ trình API
Chúng ta phải tạo lộ trình API bằng hai cách triển khai khác nhau. Chúng tôi sẽ sử dụng cờ tính năng để chuyển đổi giữa chúng.
Để làm điều này, hãy tạo một tệp tại upstash-next-feature-flags/pages/api/sort-numbers.js .
Nó phải có mã này:
import { flagIsActive } from "../../lib/featureFlags";
export default async function handler(request, response) {
let sort = bucketSort;
const newSortingAlgorithm = await flagIsActive("newSortingAlgorithm");
if (newSortingAlgorithm) sort = selectionSort;
const { numbers } = request.body;
const sorted = sort(numbers);
response.status(200).json({
numbers: sorted,
newSortingAlgorithm,
});
}
// old sorting algorithm
const bucketSort = (arr, size = 5) => {
const min = Math.min(...arr);
const max = Math.max(...arr);
const buckets = Array.from(
{ length: Math.floor((max - min) / size) + 1 },
() => [],
);
arr.forEach((val) => {
buckets[Math.floor((val - min) / size)].push(val);
});
return buckets.reduce((acc, b) => [...acc, ...b.sort((a, b) => a - b)], []);
};
// new sorting algorithm
const selectionSort = (arr) => {
const a = [...arr];
for (let i = 0; i < a.length; i++) {
const min = a
.slice(i + 1)
.reduce((acc, val, j) => (val < a[acc] ? j + i + 1 : acc), i);
if (min !== i) [a[i], a[min]] = [a[min], a[i]];
}
return a;
}; Tuyến API này là một trình sắp xếp số đơn giản. Nó lấy một mảng các số chưa được sắp xếp và sẽ sử dụng một trong hai thuật toán sắp xếp để sắp xếp chúng.
Các thuật toán sắp xếp này đại diện cho bất kỳ thay đổi nào bạn muốn “chuyển đổi” trong ứng dụng của mình. Đặt cả hai vào mã của bạn và chuyển đổi giữa chúng thông qua flagIsActive hoạt động bằng cách thay đổi giá trị trong Redis.
Chúng tôi gọi là flagIsActive và đặt cho nó tên của lá cờ mà chúng ta muốn kiểm tra. Nếu cờ được đặt thành 1 trong Redis, hàm này trả về true; nếu không nó sẽ trả về false .
Sau khi sắp xếp, tuyến API sẽ phản hồi với mảng đã sắp xếp.
Đẩy dự án lên GitHub
Sau khi triển khai mọi thứ, chúng tôi cần đẩy dự án vào kho lưu trữ trên GitHub để dịch vụ triển khai của Verce'ls có thể truy cập được. GitHub giải thích cách tạo kho lưu trữ trong tài liệu của họ.
Việc tạo một kho lưu trữ trống sẽ tự động hiển thị cho bạn cách bạn có thể liên kết nó với dự án mà chúng tôi đã tạo.
Tạo cơ sở dữ liệu Upstash Redis®
Bạn có thể tạo cơ sở dữ liệu mới trong bảng điều khiển Upstash. Hình 1 hiển thị cấu hình phù hợp cho hướng dẫn này.

Như Hình 1 cho biết, một cơ sở dữ liệu là miễn phí nên bạn sẽ không phải trả bất kỳ khoản nào cho hướng dẫn này.
Giữ tab trình duyệt với bảng điều khiển Upstash mở vì sau này chúng ta cần nó để thu thập thông tin xác thực cơ sở dữ liệu.
Liên kết Kho lưu trữ GitHub với Vercel
Nếu bạn sử dụng tài khoản GitHub của mình để đăng nhập vào Vercel, việc thêm kho lưu trữ GitHub chỉ mất vài cú nhấp chuột. Trong Hình 2, bạn thấy phía trên bên trái của bảng điều khiển Vercel; nhấp vào “Thêm mới…” và chọn “Dự án”.

Chọn “Tiếp tục với GitHub” và một trong các nút “nhập” thuộc về kho lưu trữ bạn đã tạo ở bước trước.

Cuối cùng, bước cấu hình dự án sẽ bật lên, nơi bạn phải thêm các biến môi trường của mình. Đối với phần còn lại của cấu hình đó, bạn có thể giữ mặc định. Hình 4 hiển thị nơi bạn phải nhập các biến này.

Họ được gọi là UPSTASH_TOKEN và UPSTASH_URL và bạn tìm thấy chúng trong bảng điều khiển Upstash, nơi chúng tôi đã tạo cơ sở dữ liệu trước đó. Hình 5 cho thấy những nút nào bạn cần sao chép các giá trị bắt buộc cho các biến của chúng tôi.

Khi bạn nhấn nút lớn “Triển khai”, Vercel sẽ sao chép kho lưu trữ GitHub của bạn và triển khai nó trên cơ sở hạ tầng của nó.
Chuyển đổi giữa các lần triển khai bằng Redis
Bây giờ, chúng ta có thể gọi điểm cuối API của mình và có thể chuyển đổi giữa các triển khai bằng cách đặt giá trị trong Redis. Redis CLI trong bảng điều khiển Upstash là cách đơn giản nhất để đạt được điều này.
Hình 6 minh họa nơi tìm CLI và lệnh chúng ta cần thực thi để đặt giá trị.
đặt Thuật toán sắp xếp mới 1

Nếu chúng ta xóa newSortingAlgorithm hoặc đặt thành 0 , nó sẽ chuyển cờ trở lại false, và lộ trình API của chúng tôi sẽ sử dụng thuật toán cũ.
Sử dụng lộ trình API
Điều cuối cùng còn thiếu là việc sử dụng tuyến API thực tế. Chúng ta phải gửi một đối tượng JSON thông qua yêu cầu POST tới tuyến đường. Một cách dễ dàng để thực hiện việc này là sử dụng cURL.
Lệnh sau sẽ gửi một đối tượng như vậy:
$ curl --header "Content-Type: application/json" \
--request POST \
--data '{"numbers":[1, 100, 10, 1000, 100000, 10000]}' \
API_ROUTE_URL
Bạn phải tìm đúng API_ROUTE_URL trong Vercel. Bạn sẽ thấy danh mục “Miền” trong dự án của mình trên trang tổng quan Vercel, như trong Hình 7.

Phản hồi phải là một đối tượng JSON bao gồm numbers được sắp xếp và một newSortingAlgorithm trường cho biết thuật toán nào đã được sử dụng để sắp xếp này.
Tóm tắt
Cờ tính năng là một cách tuyệt vời để tách việc triển khai khỏi các bản phát hành tính năng. Chúng biến một thay đổi được mã hóa cứng thành việc đặt một giá trị đơn giản trong cơ sở dữ liệu, mang lại sự linh hoạt hơn cho nhóm của bạn và trao nhiều quyền lực hơn cho những người không rành về kỹ thuật.
Với cơ sở dữ liệu nhanh như Upstash Redis, bạn có thể dễ dàng triển khai mẫu cờ tính năng cho ứng dụng của mình mà không làm giảm nhiều hiệu suất. Upstash Redis có thời gian truy cập dưới giây và bạn có thể triển khai nó gần FaaS của mình nếu cần. Tất cả điều đó đều được định giá theo yêu cầu, vì vậy bạn không bao giờ phải trả tiền cho những tài nguyên mà bạn không sử dụng.