これは何?
Rails で Feature Flags (Feature Toggles) を導入するため、rollout (gem) を使ってみます。
こちらの .gemspec
を見ると redis を使うのが想定されているようです。
確認環境
$ bundle exec ruby --version
ruby 2.7.5p203 (2021-11-24 revision f69aeb8314) [x86_64-darwin19]
$ bundle exec rails --version
Rails 6.0.4.6
インストール
Gemfile
...
gem 'rollout'
$ bundle install
使ってみる
全体
$ rails c
...
irb(main):001:0> Redis.current
irb(main):002:0> rollout = Rollout.new(Redis.current)
irb(main):003:0> rollout.active?(:chat)
=> false
irb(main):012:0> rollout.activate(:chat)
=> "OK"
irb(main):013:0> rollout.active?(:chat)
=> true
特定のユーザーだけ指定
$ rails c
...
irb(main):001:0> Redis.current
irb(main):002:0> rollout = Rollout.new(Redis.current)
...
irb(main):007:0> u = User.last
irb(main):008:0> rollout.active?(:chat, u)
=> false
irb(main):009:0> rollout.activate_user(:chat, u)
=> "OK"
irb(main):010:0> rollout.active?(:chat, u)
=> true
パーセント指定
$ rails c
...
irb(main):001:0> Redis.current
irb(main):002:0> rollout = Rollout.new(Redis.current)
...
irb(main):017:0> rollout.activate_percentage(:chat, 10)
=> "OK"
irb(main):018:0> rollout.active?(:chat, u)
=> false
ドキュメントによれば、この式をもとに計算しているようです。
CRC32(user.id) < (2**32 - 1) / 100.0 * percentage
厳密ではないですが、ID の下2桁で計算するのがいいかもしれません。
おわりに
redis だと揮発した時に困るので、ストレージは、RDBMS の方が良さそうに思いました。