Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Ruby

Triển khai an toàn các tính năng mới trong Rails với Cờ tính năng Flipper

Hãy tưởng tượng tình huống này:bạn là nhà phát triển Rails và đã dành vài ngày qua để phát triển tính năng tuyệt vời mà mọi người đang chờ đợi. Nó lớn và phức tạp nhưng đã trải qua quá trình kiểm tra nghiêm ngặt nên bạn có thể tự tin rằng mọi thứ đều hoạt động bình thường. Có thời hạn phải đáp ứng, vì vậy bạn hãy triển khai. Ngay lập tức, tất cả địa ngục tan vỡ.

Tính năng của bạn sẽ phá vỡ toàn bộ ứng dụng đối với một số người dùng của bạn. Thật khó để nói tại sao. Không có lỗi nào xuất hiện trong quá trình thử nghiệm. Bạn hoàn nguyên sự thay đổi của mình, nhưng thiệt hại đã được thực hiện. Khách hàng của bạn không hài lòng và bạn sẽ phải dành thời gian trong tương lai gần để kiểm soát thiệt hại và điều tra xem điều gì đã xảy ra.

Vấn đề là việc đưa ra những thay đổi phức tạp vốn có rủi ro, bất kể bạn thực hiện bao nhiêu thử nghiệm. Sẽ thật tuyệt nếu bạn triển khai tính năng này dần dần, trước tiên có thể chỉ cho một số ít người dùng. Sẽ tốt hơn nữa nếu bạn có thể tắt tính năng này ngay khi sự cố đầu tiên xuất hiện.

Đây chính xác là nơi các cờ tính năng xuất hiện. Trong bài đăng này, chúng ta sẽ đi sâu vào chi tiết về các cờ tính năng trong Rails, bao gồm cả cách thiết lập chúng bằng đá quý Flipper. Nhưng trước tiên:chúng là gì?

Cờ tính năng trong Ruby on Rails là gì?

Cờ tính năng là một cách để bật hoặc tắt một tính năng trong ứng dụng của bạn khi nó đang chạy. Nếu cờ được bật, tính năng này sẽ được sử dụng. Nếu không thì không. Hãy tưởng tượng một cái gì đó như thế này trong mã giả.

 

Tên 'cờ tính năng' có phần gây hiểu nhầm. Việc kiểm soát hành vi của ứng dụng trong thời gian chạy không chỉ giới hạn ở các tính năng mà còn áp dụng cho bất kỳ chức năng nào trong chương trình của bạn. Ví dụ:bạn có thể sử dụng cờ tính năng để thử các điều chỉnh hiệu suất và chạy thử nghiệm A/B. Điểm khác biệt đáng kể giữa cờ tính năng và bất kỳ điều kiện cũ nào khác là bạn có thể sửa đổi cờ tính năng trong thời gian chạy.

Để minh họa, hãy tưởng tượng một cơ chế gắn cờ tính năng đơn giản bằng cách sử dụng các biến môi trường.

 

Bằng cách sửa đổi giá trị của biến môi trường, chúng ta có thể bật hoặc tắt các phần của ứng dụng theo ý muốn. Phần nào của một ứng dụng? Bất cứ điều gì bạn muốn!

Bạn có thể ẩn các phần của giao diện người dùng nếu tính năng này bị tắt. Bạn có thể chuyển đổi các phần mã của mình, điều này rất hữu ích nếu bạn không tự tin vào bộ tái cấu trúc mới nhất của mình. Một trong những cách sử dụng cờ tính năng yêu thích của tôi là ẩn toàn bộ tuyến đường bằng cách sử dụng các ràng buộc định tuyến:

 
 

Chúng ta có thể thấy rằng có rất nhiều ứng dụng dành cho cờ tính năng. Tuy nhiên, việc triển khai ngây thơ của chúng tôi có một điểm yếu đáng kể. Mỗi người dùng có thể bật hoặc tắt một tính năng.

Điều gì sẽ xảy ra nếu chúng ta muốn khả năng chỉ kích hoạt các tính năng cho người dùng hoặc nhóm người dùng cụ thể hoặc chỉ trong một thời gian? Hãy xem Flipper.

Sử dụng Đá quý Flipper cho Cờ tính năng

Flipper là một viên ngọc quý cung cấp các cờ tính năng và các cách khác nhau để chuyển đổi chúng trong Rails. Nó có tính mô-đun cao. Ngoài ưu điểm chính, bạn cũng sẽ phải chọn một bộ chuyển đổi lưu trữ — nhưng sẽ nói thêm về điều đó sau. Bây giờ chúng ta hãy sử dụng bộ điều hợp ActiveRecord.

Thêm các dòng sau vào Gemfile của bạn và chạy bundle install :

 

Khi chúng tôi sử dụng bộ điều hợp ActiveRecord, Flipper sẽ lưu cờ tính năng của bạn trong cơ sở dữ liệu và do đó yêu cầu thiết lập các bảng cơ sở dữ liệu mới. Flipper đi kèm với một trình tạo tiện dụng sẽ tạo ra các chuyển đổi cần thiết.

 

Bạn có thể sử dụng Flipper giống như cách triển khai đơn giản mà chúng tôi đã sử dụng trước đây.

 

Sự khác biệt lớn nhất là thay vì sửa đổi các biến môi trường, giờ đây bạn có thể chuyển đổi các tính năng bằng giao diện người dùng của Flipper. Thêm gem Flipper UI và cài đặt nó.

 

Sửa đổi tệp tuyến đường của bạn để gắn Flipper UI.

 

Nếu bạn khởi động ứng dụng của mình và điều hướng đến Flipper UI, bạn sẽ thấy tổng quan về tất cả các tính năng có sẵn và trạng thái của chúng. Hãy tiếp tục và tạo my_awesome_feature tính năng.

Triển khai an toàn các tính năng mới trong Rails với Cờ tính năng Flipper

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

Bạn có thể nhận thấy rằng bạn có thể làm được nhiều việc hơn là chỉ bật hoặc tắt một tính năng trong Flipper UI. Flipper cho phép chúng tôi bật các tính năng cho một nhóm nhỏ người dùng hoặc thậm chí trong một tỷ lệ phần trăm thời gian. Bạn có thể định cấu hình cờ tính năng của mình bằng một trong năm cơ chế khác nhau.

Một trong số đó là chuyển đổi boolean, một công tắc bật tắt toàn cục. Bốn yếu tố còn lại thú vị hơn thế nhiều:nhóm, diễn viên, tỷ lệ diễn viên và tỷ lệ thời gian.

Nhóm

Để chỉ bật một tính năng cho một nhóm người dùng cụ thể, hãy sử dụng nút chuyển đổi nhóm. Nếu nó không tồn tại, hãy tạo tệp config/initializers/flipper.rb và thêm mã sau để đăng ký nhóm mới — ví dụ:người dùng trả phí.

 

Để sử dụng nút chuyển đổi mới này, hãy sửa đổi lời gọi Flipper để chuyển người dùng — hoặc tác nhân, như tài liệu thường gọi họ — và tên tính năng.

 

Flipper sẽ sử dụng khối bạn đã xác định trong trình khởi tạo để quyết định xem tính năng này có được bật cho người dùng này hay không. Trong trường hợp này, nó sẽ gọi paid? phương pháp. Bây giờ bạn có thể sử dụng nhóm này trong Flipper UI. Nhấp vào nút 'Thêm nhóm' và chọn nhóm của bạn.

Triển khai an toàn các tính năng mới trong Rails với Cờ tính năng Flipper

Nhóm của bạn không nhất thiết phải là người dùng trả phí. Đó có thể là thành viên trong nhóm của bạn hoặc người dùng đã đăng ký chương trình beta. Việc sử dụng chuyển đổi nhóm sẽ hữu ích nếu bạn muốn phát hành nội dung nào đó cho một nhóm nhỏ người dùng. Hãy tưởng tượng các bản phát hành beta hoặc bản phát hành nội bộ.

Diễn viên

Đôi khi, bạn có thể muốn phát hành thứ gì đó cho một cá nhân. Trong trường hợp này, việc chuyển đổi diễn viên là điều cần cân nhắc.

Bạn không phải thay đổi bất cứ điều gì trong trình khởi tạo của mình để sử dụng cơ chế này. Tuy nhiên, bạn cần đảm bảo rằng mô hình diễn viên của bạn — thường là mô hình người dùng của bạn — triển khai flipper_id . Bao gồm Flipper::Identifier sẽ lo việc đó.

 
 

Sau đó, bạn có thể sử dụng ID này để bật tính năng cho người dùng cá nhân.

Triển khai an toàn các tính năng mới trong Rails với Cờ tính năng Flipper

Tính năng chuyển đổi này rất hữu ích nếu bạn muốn xem trước chức năng của từng cá nhân cụ thể. Hãy cân nhắc việc kích hoạt các tài khoản thử nghiệm cụ thể cho những đối tác cần quyền truy cập vào một tính năng trước khi phát hành tính năng đó cho nhiều đối tượng hơn.

Tỷ lệ diễn viên

Nếu bạn muốn tăng cường sử dụng tính năng một cách từ từ, tỷ lệ phần trăm diễn viên chuyển đổi là dành cho bạn. Hãy tưởng tượng bạn đã triển khai một số tối ưu hóa hiệu suất và bạn không chắc chắn nó sẽ hoạt động như thế nào trong sản xuất. Trước tiên, bạn sẽ triển khai tính năng này cho một tỷ lệ nhỏ người dùng, sau đó từ từ tăng mức sử dụng trong khi giám sát ứng dụng của mình.

Triển khai an toàn các tính năng mới trong Rails với Cờ tính năng Flipper

Nếu mọi thứ không ổn, bạn luôn có thể đặt lại tỷ lệ phần trăm về 0.

Phần trăm thời gian

Cuối cùng nhưng không kém phần quan trọng, bạn có thể bật một tính năng cho một tỷ lệ phần trăm yêu cầu. Bạn không cần cung cấp diễn viên khi sử dụng nút chuyển đổi này.

 

Tôi thích sử dụng điều này để so sánh hiệu suất của hai cách triển khai khác nhau. Lưu ý rằng việc chuyển đổi tính năng này là ngẫu nhiên. Cùng một người dùng sẽ có hành vi khác nhau đối với mỗi yêu cầu.

Cấu hình nâng cao trong Flipper

Chúng ta đã thấy rằng chúng ta có thể sử dụng bộ điều hợp ActiveRecord để lưu trữ thông tin cờ tính năng trong cơ sở dữ liệu của mình. Tuy nhiên, tùy thuộc vào nhu cầu cụ thể của bạn, bạn có thể muốn sử dụng một bộ chuyển đổi khác.

Trong hầu hết các trường hợp, tất cả những gì bạn cần làm khi hoán đổi bộ điều hợp lưu trữ là cài đặt gem tương ứng và cấu hìnhFlipper tương ứng. Ví dụ:nếu bạn muốn sử dụng bộ chuyển đổi Redis, bạn thêm flipper-redis gem vào yourGemfile và cập nhật trình khởi tạo Flipper.

 
 

Ngoài việc định cấu hình bộ điều hợp lưu trữ, còn có rất nhiều khía cạnh khác của Flipper mà bạn có thể điều chỉnh.

Việc thêm cờ tính năng sẽ bị phạt nhẹ về hiệu suất, vì vậy bạn thường muốn thêm tính năng ghi nhớ và bộ nhớ đệm. Bạn cũng có thể muốn hạn chế quyền truy cập vào Flipper UI đối với những người dùng được ủy quyền. Những chủ đề này nằm ngoài phạm vi của bài đăng này, nhưng tôi khuyên bạn nên xem tài liệu Flipper nếu bạn muốn tìm hiểu sâu hơn.

Cẩn thận với cờ nổi bật trong Rails

Cờ tính năng là tuyệt vời. Nhưng cũng như rất nhiều thứ khác, luôn có những sự cân bằng cần phải cân nhắc.

Việc thêm cờ tính năng và duy trì chúng sẽ bổ sung thêm chi phí tổ chức. Việc phát hành và triển khai các tính năng ẩn bằng cách sử dụng cờ không đơn giản như triển khai mã 'thông thường' — tất nhiên bạn sẽ phải nhớ bật tính năng này! Điều đó thường không quá khó, nhưng việc dọn dẹp các cờ tính năng mà bạn không cần nữa có thể là điều khó khăn.

Mỗi khi bạn thêm cờ tính năng vào mã của mình, bạn sẽ thêm một điều kiện và nếu bạn không chú ý, mã của bạn sẽ nhanh chóng bị vấy bẩn bởi chúng. Việc theo dõi thời điểm và lý do bạn tạo một số cờ tính năng nhất định có thể là một thách thức. Thật đáng buồn, bản thân Flipper UI không cung cấp nhiều tính năng để quản lý các cờ tính năng.

Bạn cũng nên lưu ý rằng việc sử dụng cờ tính năng sẽ bị phạt nhẹ về hiệu suất. Có nhiều cách để giảm thiểu vấn đề này nhưng nó có thể có tác động rõ rệt nếu bạn định cấu hình sai hoặc sử dụng sai Flipper.

Kết thúc:Bắt đầu với Cờ tính năng trong Ruby on Rails

Chúng tôi đã xem xét cách cờ tính năng có thể giúp bạn phát hành một cách tự tin hơn, tìm hiểu cách chúng hoạt động về nguyên tắc và biết cách bạn có thể bắt đầu với cờ tính năng bằng đá quý Flipper.

Có nhiều tình huống mà cờ tính năng rất hữu ích. Tùy thuộc vào trường hợp sử dụng của bạn, bạn có thể sử dụng một trong năm nút chuyển đổi khác nhau — boolean, nhóm, tác nhân, phần trăm tác nhân hoặc phần trăm yêu cầu.

Mặc dù làm việc với các cờ tính năng có một số lưu ý và có thể cần một chút thời gian để làm quen, nhưng chúng vẫn là một công cụ tuyệt vời mà bạn có thể tùy ý sử dụng.

Cho đến lần sau, chúc bạn viết mã vui vẻ!

Tái bút. Nếu bạn muốn đọc các bài đăng của Ruby Magic ngay khi chúng được đăng tải, hãy đăng ký nhận bản tin Ruby Magic của chúng tôi và không bao giờ bỏ lỡ một bài đăng nào!