kakakakakku blog

Weekly Tech Blog: Keep on Learning!

高機能な Feature Flag サービス「Unleash」の Ruby SDK を試した

引き続き Feature Flag を実現するサービス「Unleash」を試していく.今回は Unleash server を構築して,実際に Unleash SDKs を使ってコードを書いていく.前回デモを試した記事は以下にある.

kakakakakku.hatenablog.com

Unleash server を構築する

「Unleash」には大きく「計3種類 (Open Source / Pro / Enterprise)」のプランがある.今回は Open Source として使うため,Unleash server を構築する必要がある.ドキュメントには Hosted by you と書いてある.

www.getunleash.io

Unleash server は Node.js と PostgreSQL を中心に実装されている.以下のドキュメントを確認して,今回は Docker Compose を使って macOS 上に構築することにした.

docs.getunleash.io

docker-compose.yml は GitHub に公開されているため,手順通りに実行すれば,簡単に構築できる.

$ docker-compose build
$ docker-compose up

github.com

http://localhost:4242/ にアクセスをしたら管理画面にアクセスできた!デフォルトで設定されている usernamepassword はドキュメントに載っている.

f:id:kakku22:20220113105713p:plain

Unleash SDKs を使う前に

SDK を使う前に「フラグ」「API token」を設定しておく必要がある.今回はサンプルとして「ピザデリバリーサービス🍕を使って注文をしたときに "次回使えるクーポンを発行する新機能"」というシナリオでフラグ管理をすることにする.よって coupon というフラグを Release タイプとして設定しておく.そして管理画面から「API token」も発行しておく.今回はキャプチャ以外にプロジェクト設定で default 環境を有効化してある.

f:id:kakku22:20220113110823p:plain

f:id:kakku22:20220113110832p:plain

Unleash SDKs

やっと Unleash SDKs を使う.ドキュメントに載っている通り,Unleash は多くの SDK をサポートしている.今回は Ruby SDK を試す.

  • Official SDKs
    • Server-side SDKs
      • .Net SDK
      • Go SDK
      • Java SDK
      • Node.js SDK
      • PHP SDK
      • Python SDK
      • Ruby SDK
      • Rust SDK
    • Front-end SDKs
      • Android SDK
      • iOS Proxy SDK
      • JavaScript SDK
      • React Proxy SDK

docs.getunleash.io

Ruby SDK の仕様はドキュメントや GitHub に載っている.サンプルコードを参考に書いていく.

docs.getunleash.io

1. フラグを有効化する

まず,以下のコードを書いた.Unleash ClientUnleash Context を設定している.Unleash Context はフラグリクエストを制御するときに使えるオブジェクトとなり,user_id や任意の値などを設定できる.

docs.getunleash.io

require 'unleash'

@unleash = Unleash::Client.new(
  url: 'http://localhost:4242/api',
  app_name: 'kakakakakku-blog',
  custom_http_headers: {'Authorization': 'xxxxx'}
)

def order
  unleash_context = Unleash::Context.new
  unleash_context.user_id = ENV['USER_ID']

  puts '1. 注文を受け付けました'
  if @unleash.is_enabled? 'coupon', unleash_context
    puts '2. クーポンを発行しました'
  end
end

order

実行すると,以下のようにフラグによって機能を有効化できている.

# フラグ OFF(無効化)
$ USER_ID=100 ruby 1-unleash.rb
1. 注文を受け付けました

# フラグ ON(有効化)
$ USER_ID=100 ruby 1-unleash.rb
1. 注文を受け付けました
2. クーポンを発行しました

2. Variant を使う

次に Variant を使って,機能を有効化しつつ,ユーザーによって異なる挙動を返す.まず,以下のように coupon-code-a (50%)coupon-code-b (50%) を追加した.Payload として,実際のクーポンコードを設定している.

f:id:kakku22:20220113112711p:plain

そして,使った以下のコードを書いた.フラグを確認した後に get_variant() を使って Payload を取得している.

require 'unleash'

@unleash = Unleash::Client.new(
  url: 'http://localhost:4242/api',
  app_name: 'kakakakakku-blog',
  custom_http_headers: {'Authorization': 'xxxxx'}
)

def order
  unleash_context = Unleash::Context.new
  unleash_context.user_id = ENV['USER_ID']

  puts '1. 注文を受け付けました'
  if @unleash.is_enabled? 'coupon', unleash_context
    variant = @unleash.get_variant 'coupon', unleash_context
    puts '2. クーポン ' + variant.payload.fetch('value') + ' を発行しました'
  end
end

order

実行すると,以下のようにフラグによって機能を有効化できている.

# フラグ ON(有効化)
# ユーザー ID : 100
$ USER_ID=100 ruby 2-unleash.rb
1. 注文を受け付けました
2. クーポン a0001 を発行しました

# フラグ ON(有効化)
# ユーザー ID : 200
$ USER_ID=200 ruby 2-unleash.rb
1. 注文を受け付けました
2. クーポン b0001 を発行しました

まとめ

引き続き Feature Flag を実現するサービス「Unleash」を試している.今回は Docker Compose を使って Unleash server を構築したり,実際に Unleash Ruby SDK を使ってコードを書いた.次回はフロントエンド側の Unleash SDKs を使ってコードを書いていく!続く〜