Feature Flipping với Rails và Rollout gem
Bài đăng này đã không được cập nhật trong 4 năm
Giới thiệu
Đôi lúc bạn muốn có khả năng bật/tắt một feature nào đó ở trên môi trường production, hoặc chỉ cho phép một số người dùng có quyền sử dụng feature mới trong ứng dụng của bạn
- Có thể bạn muốn nhận feedback từ người dùng trước khi đưa ra bản release cuối cùng?
- Bạn muốn có khả năng revert lại feature trước chỉ với một dòng lệnh?
Điều đó hoàn toàn có thể và thực hiện dễ dàng hơn với gem Rollout để setup trong ứng dụng Rails của bạn.
Rollout cho phép bạn enable/disable feature mà không cần revert code hoặc sử dụng branch khác trên môi trường production. Điều này được thực hiện bởi Rollout bằng cách lưu một "feature flag" trong Redis. Đây là một To-do app demo nho nhỏ về cách mà Rollout hoạt động. User có thể tạo mới, xoá to-do, và đánh dấu chúng là đã hoàn thành.
Thực hiện
1. Cài đặt Redis
Thêm redis-rails
vào Gemfile
gem 'redis', '~> 4.1', '>= 4.1.3'
Chạy bundle install
và thêm 1 biến env vào file .env
REDIS_URL=redis://localhost:6379
Tiếp theo, hãy tạo 1 file initializers cho Redis để tự động khởi tạo Redis khi Rails được boot
# config/initializers/redis.rb
require "redis"
Redis.current = Redis.new(url: ENV['REDIS_URL'])
Thử mở rails console
lên check xem Redis đã hoạt động chưa
=> #<Redis client v4.1.3 for redis://localhost:6379/0>
Redis đã hoạt động!
2. Cài đặt Rollout
Thêm Rollout vào Gemfile
của bạn
gem 'rollout', '~> 2.4', '>= 2.4.5'
Thêm vào file redis.rb
chúng ta vừa tạo lúc nãy
# config/initializers/redis.rb
require "redis"
Redis.current = Redis.new(url: ENV['REDIS_URL'])
$rollout = Rollout.new(Redis.current)
Restart lại server và kiểm tra $rollout
trong rails console
=> #<Rollout:0x00007fee86119578........>
Rollout đã sẵn sàng để sử dụng rồi!
3. Đóng gói feature
Mình đã thêm một cột important
vào bảng todos
, cập nhật lại view và controller.
Các bạn có thể thấy mình đã đóng gói lại important
vào trong câu lệnh if
if $rollout.active? :important_todos
Phương thức active
kiểm tra Redis xem feature important_todos
đã được active hay chưa. Nếu chưa, nó sẽ return false và không render ra gì cả.
Nếu chúng ta muốn active feature này, điều chúng ta cần làm là mở rails console
và chạy
$rollout.activate :important_todos
Điều tuyệt nhất ở đấy chính là mọi thứ đều diễn ra trong môi trường thực tế mà không cần down server. Chúng ta không cần push một branch khác lên để enable/disable nó đi, hoặc restart server để thấy được sự thay đổi.
Nếu chúng ta muốn tắt nó đi? Lại mở rails console
lên và chạy $rollout.deactivate :important_todos
. Xong, mất tiêu luôn.
Rollout không chỉ đơn giản là enable/disable một feature nào đó. Bạn có thể enable feature cho user hoặc một nhóm user nhất định trải nghiệm trước và enable cho tất cả user sau. Hãy xem qua document của Rollout để biết thêm chi tiết hơn.
4. Tham khảo
Document chính thức của Rollout: https://github.com/fetlife/rollout
https://blog.echobind.com/feature-flipping-with-rails-and-rollout-5282b8d4fb1c
All rights reserved