Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

ngx_mrubyを用いた柔軟なABテスト基盤

1,269 views

Published on

2017年05月18日に開催されたRCO Study Night #6 - RLS,RCOにおける機械学習応用事例共有会でのLT資料です。
ngx_mrubyを用いて開発している、webサイトのABテストを行う基盤についてです。

Published in: Engineering
  • Be the first to comment

ngx_mrubyを用いた柔軟なABテスト基盤

  1. 1. ngx_mrubyを⽤いた 柔軟なABテスト基盤 Michihisa HIRATSUKA ネットビジネス本部 デベロップメントデザインユニット データエンジニアグループ
  2. 2. • • • • • 2 こんばんは
  3. 3. 3 機械学習をサービスに反映するまで
  4. 4. 4 機械学習をサービスに反映するまで
  5. 5. 5 機械学習をサービスに反映するまで
  6. 6. 6 ABテストとは
  7. 7. 7
  8. 8. パターンA パターンB オリジナル
  9. 9. 9 AB基盤に求められるもの AB 振分 A B C X
  10. 10. 10 AB基盤に求められるもの AB 振分 A B C X
  11. 11. 11 AB基盤に求められるもの AB 振分 A B C X
  12. 12. 12 AB基盤に求められるもの AB 振分 A B C X
  13. 13. 13 AB基盤に求められるもの AB 振分
  14. 14. 14 運⽤開発⾯での理想 AB 振分 A B C X
  15. 15. 15 運⽤開発⾯での理想 AB 振分 A B C X
  16. 16. 16 AB 振分 URLパラメータ制限 Cookie制限 IPやブラウザの制限振分% PC or SP 期間 AB案件毎に異なる条件 簡単に設定したい
  17. 17. 17 ngx_mrubyとは?
  18. 18. 18 処理の流れ AB IP
  19. 19. 19 処理の流れ AB IP
  20. 20. 20 処理の流れ(nginx.conf) http { mruby_init /path/init.rb cache; location / { mruby_set $ab_setting /path/ab_check.rb cache; proxy_pass http://$server/$ab_setting; } }
  21. 21. http { mruby_init /path/init.rb cache; location / { mruby_set $ab_setting /path/ab_check.rb cache; proxy_pass http://$server/$ab_setting; } } 21 処理の流れ(nginx.conf) 設定読み込み AB振分 Upstreamに渡す
  22. 22. 22 ABテスト設定ファイル例 { "allow_sp": "no", "start_date": "2017-05-23 00:00", "end_date": "2017-06-22 00:00", "ab_percent": 10 } スマートフォンを 対象とするか 開始・ 終了日 トラフィック割合
  23. 23. 23 設定ファイルの読み込み anken1 = Config.new('anken1.json') class Config def active?(current_time) @start_time <= current_time && current_time <= @end_time end def allow_sp? @allow_sp == 'yes' end end スマートフォン対象 判定関数など AB該当期間 チェック関数
  24. 24. 24 ABテストの制御部分 ab_setting = split(ab_list) if ! config.active?(time_now) go_to_original If ! user_agent.is_sp? && config.allow_sp? go_to_original ab_setting
  25. 25. ab_setting = split(ab_list) if ! config.active?(time_now) go_to_original If ! user_agent.is_sp? && config.allow_sp? go_to_original ab_setting 25 ABテストの制御部分 ABテスト期間中? No => オリジナルへ スマートフォンか? & スマートフォンは テスト対象? No => オリジナルへ ABテストのどれかに 振分 全部パスしたら Upstreamへ
  26. 26. • – – – • – – 26 感想
  27. 27. 27 nginxあるある① IP制限 location /hoge/ { allow XXX.XXX.XXX.XXX/32; allow YYY.YYY.YYY.YYY/32; allow ZZZ.ZZZ.ZZZ.ZZZ/32; allow WWW.WWW.WWW.WWW/32; (plenty of rows) deny all; }
  28. 28. 28 nginxあるある① IP制限 Nginx.return Nginx::HTTP_FORBIDDEN if (current_ips & allow_ips) == [] "allow_ips": [ip, ip, ...]
  29. 29. 29 Nginxあるある① IP制限 Nginx.return Nginx::HTTP_FORBIDDEN if (current_ips & permitted_ips) == [] "allow_ip": [ip, ip, ...] 設定ファイルにipを切り出し .rbで呼び出し
  30. 30. 30 nginxあるある② user_agent制限 if ($http_user_agent ~* 'DoCoMo') { set $ua '@fp'; } if ($http_user_agent ~* 'Vodafone'){ set $ua '@fp'; } if ($http_user_agent ~* ‘SoftBank’){ set $ua '@fp'; } …
  31. 31. 31 nginxあるある② user_agent制限 @reg_featurephone = Regexp.compile(@data['featurephone']) def is_blockdevice?(user_agent) @reg_featurephone =~ user_agent end "featurephone": "DoCoMo|SoftBank|Vodafone|etc…"
  32. 32. 32 Nginxあるある② user_agent制限 @reg_featurephone = Regexp.compile(@data['featurephone']) def is_blockdevice?(user_agent) @reg_featurephone =~ user_agent end ”featurephone": "DoCoMo|SoftBank|Vodafone|J-PHONE|etc 設定ファイルに正規表現を切り出し .rbで関数化
  33. 33. • • – – – 33 おまけ

×