Chuyển đổi tính năng

Tram Ho

Giới thiệu :

  • Hiện tại hầu hết các phần mềm đều chạy ổn định nhưng người dùng muốn nâng cấp một số chức năng hoặc phát triển tính năng mới. Sau khi quyết định làm một chức năng mới, quá trình cài đặt và thử nghiệm diễn ra khá lâu để đảm bảo chức năng mới hoạt động tốt và phù hợp với nhu cầu của người dùng, không phải thay đổi quá nhiều. Sau khi phát triển tính năng mới, chúng tôi sẽ cho phép một số người dùng sử dụng chức năng này, những người khác vẫn sẽ sử dụng phiên bản hiện tại của ứng dụng.
  • Trong quá trình phát triển các tính năng mới, vẫn đảm bảo phát triển và nâng cấp các chức năng cũ

Cách làm đơn giản là tạo 1 nhánh sản phẩm đi từ nhánh hiện tại và phát triển song song thành 2 sản phẩm khác nhau nhưng khi đó việc quản lý và gộp code sẽ phức tạp và cũng rất khó khăn. để quản lý cũng như chi phí để phát triển 2 phiên bản cùng lúc. Do đó chúng ta nảy sinh ra yêu cầu cho phép lập trình viên có thể thay đổi hoạt động của ứng dụng, luồng, giao diện hay các tính năng xử lý mà không cần phải sửa code. Để các bạn dễ hình dung giống như việc bạn sử dụng facebook với nhiều tính năng chỉ phù hợp với một số lượng người dùng nhất định, hay các phiên bản phần mềm có tính năng nâng cao dành cho người dùng trả phí… Vấn đề nghe có vẻ phức tạp như cách xác định người dùng là ai? được sử dụng, chức năng nào được sử dụng hay không, dữ liệu được lưu trữ và trả về như thế nào để đảm bảo tính bảo mật và không ảnh hưởng đến dữ liệu. Chức năng hiện tại… Tuy nhiên chúng ta có thể chia thành nhiều cấp độ để thực hiện chức năng này như cài đặt ở giao diện ứng dụng, cài đặt ở lớp api, cài đặt ở lớp cơ sở dữ liệu và sâu hơn ở cấp độ phần cứng.

Vậy để lưu trữ những thông tin này thì chúng ta sẽ lưu trữ ở đâu và nó như thế nào, giải pháp nào:

  • Giải pháp 1: Các flags được lưu trữ trong code, mỗi lần thay đổi cần phải build lại mã nguồn và triển khai cho người dùng cuối, cách này sẽ tốn tiền và công sức triển khai
  • Cách 2: Các flags được lưu trong config của ứng dụng, ví dụ config trên web server, web hosting, app config, env trong node js code… cách này sẽ yêu cầu user tải lại ứng dụng và sẽ hơi khó để quản lý
  • Giải pháp 3: Tự xây dựng hệ thống tính năng cờ, xây dựng cổng quản trị cờ và các dịch vụ cần thiết để vận hành trang quản lý cờ
  • Giải pháp 4: Sử dụng dịch vụ gắn cờ tính năng từ dịch vụ bên ngoài.

Dung dịch

Giải pháp 1

Đối với các chức năng cơ bản hoặc không cần tắt mở thường xuyên, không áp dụng cho các tập khách hàng khác nhau nên việc thiết lập ở đây khá đơn giản. Bạn có thể tạo một cờ trong mã nguồn để bật và tắt nó.

Giải pháp 2

Đối với các chức năng có khả năng thay đổi định kỳ hoặc trong các điều kiện nhất định mà bạn có thể quản lý hoặc lập kế hoạch, bạn có thể lưu các cài đặt đó trong một biến môi trường. Trong các nền tảng mã nguồn ngày nay, tất cả đều cho phép bạn định cấu hình các biến môi trường một cách linh hoạt và cho phép khởi chạy lại hoặc tải lại các biến môi trường một cách linh hoạt. Ngoài ra, cách này phù hợp với các hệ thống nhỏ, người vận hành có khả năng quản trị hệ thống tốt. Tuy nhiên, cần chú ý đến các yêu cầu bảo mật khi đặt cờ cũng như kiểm tra lại

  • Thuận lợi
    • Đơn giản, dễ triển khai với hầu hết các nền tảng
    • Thời gian triển khai nhanh chóng
    • Chi phí triển khai thấp
  • Khuyết điểm
    • Tính năng hạn chế, Chỉ đáp ứng các chức năng tắt mở một cách cơ bản
    • Không đảm bảo yêu cầu bảo mật

Hướng dẫn thực hiện:

Tạo cấu hình trong env một cái gì đó như thế:

Giải pháp 3

Đối với các dự án vừa và lớn có đội ngũ phát triển tốt mong muốn xây dựng chức năng cờ tính năng để sử dụng lâu dài với các sản phẩm và dịch vụ của mình thì nên triển khai phương án tự phát triển. Để phát triển một mô-đun như thế này, nhóm sẽ cần xác định rất rõ ràng nhu cầu của dịch vụ và phân tích thiết kế đầy đủ chức năng.

  • Thuận lợi
    • Chủ động phát triển theo nhu cầu
    • Dễ dàng nâng cấp theo thiết kế của dự án
    • Hệ thống của chúng tôi có thể mở rộng quy mô và bảo trì dễ dàng hơn
    • Chi phí sẽ không tăng quá nhanh sau khi ứng dụng của chúng tôi được mở rộng quy mô
    • Các nhà phát triển có thể hợp nhất và phát hành mã tính năng mới của họ mà không phải đợi quá lâu để được hợp nhất và các thử nghiệm của người dùng sẽ không bị ảnh hưởng sau khi phát hành ⇒ CI/CD
  • Khuyết điểm
    • Chi phí phát triển
    • Chức năng chưa phong phú
    • Thời gian phát triển dài
    • Chi phí nhân sự vận hành hệ thống hạ tầng, tự động mở rộng quy mô

Hướng dẫn thực hiện:

phương pháp tiếp cận

  • Triển khai hệ thống ủy quyền với Mô-đun dựa trên ứng dụng không xác thực
  • Triển khai hệ thống ủy quyền dựa trên Mô-đun cộng với vai trò người dùng nếu cần cho ứng dụng xác thực

ưu

  • Chúng ta có thể dễ dàng tùy chỉnh với các yêu cầu phức tạp hơn sau này
  • Dễ dàng mở rộng quy mô và giảm chi phí khi so sánh với bên thứ 3

Nhược điểm

  • Dành thời gian khởi tạo và triển khai trong DevOps, Backend, Frontend và Admin để quản lý
  • Với quy mô nhỏ, chúng tôi không thể hoàn thành thời hạn hoặc chúng tôi phải chấp nhận nợ công nghệ sau này

Điều gì có thể đi sai?

  • Chúng ta có thể mất quá nhiều thời gian để tự triển khai hệ thống của mình và nhận được kết quả không như mong đợi khi thiếu nguồn lực và thời gian

Thiết kế hệ thống riêng

cơ sở dữ liệu

Tên cơ sở dữ liệu: Ủy quyền Danh sách các bảng

Sơ đồ cho cờ tính năng Sơ đồ cho cờ tính năng

Kiến Trúc Hệ Thống

Sơ đồ hệ thốngcơ sở hạ tầng

phụ trợ

Di chuyển cơ sở dữ liệu

Thực hiện theo sơ đồ trên để viết điểm cuối API di chuyển

  • CRUD dành cho quản trị viên
    • Cần phát tới kênh ổ cắm trên mỗi hành động
  • điểm cuối get-enabled-feature-flags để trả lại danh sách cho Ứng dụng FE dựa trên xác thực

Ổ cắm

  • Kích hoạt socket để giúp FE tham gia kênh và nghe chủ đề
  • Gửi sự kiện ổ cắm tới FE sau khi thay đổi bất kỳ hiệu ứng nào thành cờ tính năng

Phần mềm trung gian

Đầu vào cho phần mềm trung gian là danh sách các điều kiện có khóa và giá trị điều kiện, chúng tôi sẽ triển khai để lấy danh sách các cờ tính năng được bật cho các điều kiện này

Quy trình lấy cờ tính năng dựa trên đầu vào điều kiện

Luồng kiểm tra điều kiện đúng sai chi tiết

Thí dụ

Người già, trẻ em và phụ nữ HOẶC nam giới từ 20 → 40 tuổi có thể xem tính năng cờ A

  1. Tạo cờ tính năng: Tên + Khóa
  2. Liệt kê và chọn các trình kích hoạt hiện có nếu không
  3. Tạo trình kích hoạt đầu tiên
    1. Liệt kê các biến
      TênKhóa biếnLoại biến
      Tuổi táctuổi táccon số
      giới tínhtình dụcliệt kê
    2. Danh sách điều kiện
    TênKhóa biếnLoại điều kiệnGiá trị
    Bọn trẻtuổi tácless_than_to_equal16
    tuổi táclớn hơn_hơn_to_bằng60
    Người đàn bàtình dụcbình đẳngngười đàn bà

    c. Tạo trigger: Tên + Mô tả + liệt kê điều kiện

  4. Tạo trình kích hoạt thứ hai
    1. Liệt kê các biến
      TênKhóa biếnLoại biến
      Tuổi táctuổi táccon số
      giới tínhtình dụcliệt kê
    2. Danh sách điều kiện
    TênKhóa biếnLoại điều kiệnGiá trị
    Mẫn Mẫntuổi tácless_than_to_equal40
    người đàn ông tối đatuổi táclớn hơn_hơn_to_bằng20
    Người đàn bàtình dụcbình đẳngĐàn ông

    c. Tạo trigger: Tên + Mô tả + liệt kê điều kiện

  5. Thêm các trình kích hoạt này vào cờ tính năng A

Phần mềm trung gian

  1. Nhận thông tin
  2. Tạo danh sách điều kiện nhập muốn lấy cờ tính năng: [{key: “age”, value: 35}, {key: “sex”, value: “man}]
  3. CHỌN * TỪ các biến v WHERE v.key trong [”tuổi”, “giới tính”]
  4. CHỌN * từ điều kiện c WHERE c.variable_id trong [biến_id]
  5. Lấy danh sách các điều kiện thực
  6. CHỌN * từ trigger_conditions tc WHERE tc.condition_id trong [true_condition_ids]
  7. Trình kích hoạt vòng lặp → trình kích hoạt bộ lọc có tất cả các điều kiện trong trình kích hoạt là một tập hợp con trong true_condition_ids
  8. CHỌN * from triggers_flags tf WHERE tt.trigger_id trong [enabled_trigger_ids]
  9. Trả về danh sách các cờ tính năng duy nhất đã bật

hệ thống quản trị

Đối với Trang chủ

Để tạo cờ tính năng

Để tạo trình kích hoạt

Ứng dụng giao diện người dùng

điều kiện tiên quyết

  • Phần phụ trợ và Frontend cần xác định danh sách khóa cờ tính năng trước đó. Nếu chúng ta xác định trước chúng ta có thể thực hiện độc lập

Thực hiện

  • FE Gọi tới BE để nhận danh sách các cờ tính năng khả dụng
  • Lưu danh sách các cờ tính năng khả dụng vào trạng thái ngữ cảnh hoặc bộ nhớ cục bộ
  • Tạo hàm sử dụng isAllowFeature(‘feature_key’) → điều kiện hiển thị

Giải pháp 4

Đối với các dự án vừa và nhỏ hoặc các sản phẩm MVP đang trong quá trình thử nghiệm, nên sử dụng các giải pháp hỗ trợ từ các nhà cung cấp dịch vụ phù hợp để tối ưu hóa thời gian phát triển và chi phí vận hành. cũng như có thể sử dụng nhanh chóng nhiều tính năng vượt trội so với việc tự cài đặt

  • Thuận lợi
    • Chi phí dịch vụ thấp nếu có ít người sử dụng dịch vụ
    • Nhiều chức năng cao cấp
    • Triển khai nhanh chóng
    • Hỗ trợ đa nền tảng với SDK
    • Tính năng chuyển đổi thời gian thực
    • Hỗ trợ phân cấp quản lý
  • Khuyết điểm
    • Chi phí dịch vụ có thể cao khi quy mô nhiều người dùng sử dụng dịch vụ
    • Không thể thiết kế các yêu cầu cụ thể của dự án
    • Không thể giải quyết một số yêu cầu đặc biệt khi cải thiện tính năng

Hướng dẫn thực hiện:

Thiết lập mã trên giao diện người dùng cho từng tính năng

  • Tạo cờ tính năng mới, Chọn

  • Xác định tên cờ tính năng

  • Thêm điều kiện cho cờ đặc trưng

Giải pháp 1: Cờ cấu hình trong mã nguồnGiải pháp 2: Thiết lập cấu hình trong môi trườngGiải pháp 3: Xây dựng hệ thống quản lý cờ tính năngGiải pháp 4: Dịch vụ cờ tính năng 3party
Khi thực hiện giải pháp này– Cả team muốn bật cờ tính năng mới và để developer tắt nếu cần– Khi nhóm có thể dễ dàng thay đổi env trên ứng dụng để chúng tôi có thể chuyển đổi cờ tính năng mà không cần xây dựng lại và chạm vào mã – Một mã nguồn và trạng thái cờ tính năng khác nhau với nhiều máy chủ– Muốn động các cờ đặc trưng với nhiều biến – Các quy tắc và trạng thái cờ đặc trưng thay đổi thường xuyên – Nhóm có đủ thời gian và nguồn lực để thực hiện nó– Muốn cờ tính năng động với nhiều biến – Quy tắc và trạng thái cờ tính năng thay đổi thường xuyên – Nhóm sẵn sàng trả tiền để tiết kiệm thời gian phát triển
Không yêu cầu DevOps (khó đối phó với một nhóm lớn)☑️☑️☑️
Các đội khác có thể chuyển cờ tính năng☑️☑️
Không mất chi phí khi nhân rộng☑️☑️☑️
Tiết kiệm thời gian và nguồn lực thực hiện☑️☑️☑️
Điều kiện cờ tính năng động và phức tạp tùy chỉnh☑️☑️
Trường hợp sử dụng– Hiển thị biểu ngữ hoặc biểu mẫu mới cho đến khi nhóm tiếp thị muốn tắt nó– Bật cờ tính năng dựa trên các môi trường như gửi email đăng nhập khi sản xuất nhưng tắt khi phát triển và dàn dựng– Muốn cờ đặc trưng động nhiều biến
Chia sẻ bài viết ngay

Nguồn bài viết : Viblo