RailsでFeature Flags (rollout)を使ってみる

September 06, 2022

これは何?

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 の方が良さそうに思いました。


SHARE

Profile picture

Written by tamesuu