Feature Flipping với Rails và Rollout gem

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