マイクロサービスと
ABテスト
Gunosy データ分析部
⼤曽根 圭輔
3/10 Gunosy DM Meetup 〜ユーザーローカル×Gunosy
ながれ
⾃⼰紹介
マイクロサービスとサービス紹介
ABテストとは
クライアントのABテスト
サーバーサイドのABテスト
まとめ
⾃⼰紹介
⼤
茨城県出⾝です
⿅島アントラーズが好きです
最近ケトルベルはじめました
大曽根 圭輔 @dr_paradi 博士 (工学)
ニュースパス担当
データ分析部
ブログやってます http://data.gunosy.io
ながれ
⾃⼰紹介
マイクロサービスとサービス紹介
ABテストとは
クライアントのABテスト
サーバーサイドのABテスト
まとめ
マイクロサービスとは
マイクロサービスとは
ニュースパスでの例
リソース単位でスタックが分かれている
スタックをまたぐ通信はすべてAPI経由で疎結合
https://www.slideshare.net/mosa_siru/ss-64839846
https://www.slideshare.net/mosa_siru/ss-64839846
詳しくは
ながれ
⾃⼰紹介
マイクロサービスとサービス紹介
ABテストとは
クライアントのABテスト
サーバーサイドのABテスト
まとめ
ABテストとは
ABテストとは
特定の機能(やUI)を2種類⽤意してどちらがいいか検証す
る
メリット
時間変化などノイズが⼊らない
最適化すべきメトリクスが決まってさえいれば単純なク
ロス集計で済む
ABテストとは
A B
Metrics I 5% 6%
Metrics II 30 35
ABテストとは
A B
Metrics I 5% 6%
Metrics II 30 35
こっちがいいよね!
詳しくは
https://www.slideshare.net/keisukeosone/gunosy-97
ABテストの実施⽅法
user_idをNで割った余りでユーザをN分割する
分割されたユーザのそれぞれA, Bのテストを割り当てる
ちょっと問題
user_idを割った値だと、いつも同じテストが当たってし
まい、バイアスがかかる可能性がある
対象の選定が⾯倒
ある程度ランダム化して出したい
ハッシュ関数を利⽤した割り当て
詳しくは
http://data.gunosy.io/entry/ab_testing_assignment
ながれ
⾃⼰紹介
マイクロサービスとサービス紹介
ABテストとは
クライアントのABテスト
サーバーサイドのABテスト
まとめ
クライアントサイド
起動時にサーバを叩いたときにユーザがどのABか割り当
てる
UIなどを変更
ab_id
user_idから
どのABに割り当てるか決める
記事配信サーバ
(Go)
AB API
ab_id
user_id
user_id
あれ、集計は?
user_idを割る⽅法では、user_idさえ分かれば、
簡単なSQLで集計できる
ハッシュ関数を利⽤してるので計算が⾯倒
集計においてはDBで管理した⽅が楽なのだがそもそもマイ
クロサービスなので(?)集計側のリソースが管理していない。
(AB管理のAPIはただuser_idが来た時のどのABに割当たって
いるか返すだけ)
集計のたびにAPIたたくのもなんかあれ
あれ、集計は?
起動ログに混ぜ、起動ログがあるユーザ群をそのテスト
のvariantとして扱う
```
{
“test_a":1,
“test_b":0,
“test_c":1}
```
※1がtreatment, 0がcontrol
あれ、集計は?
これで集計可能に!
A B
Metrics I 5% 6%
Metrics II 30 35
こっちがいいよね!
⼀件落着
ながれ
⾃⼰紹介
マイクロサービスとサービス紹介
ABテストとは
クライアントのABテスト
サーバーサイドのABテスト
まとめ
サーバサイド(配信ロジック)
ニュースパスでは記事配信側と
記事リストをDynamo DBに保存する
それをユーザに記事を配信するAPI(Go製)がユーザに返
す
記事リスト⽣成バッチ
(Python)
記事配信サーバ
(Go)
サーバサイド(配信ロジック)
記事リスト⽣成バッチ
(Python)
記事配信サーバ
(Go)
AB API
サーバサイド(配信ロジック)
記事リスト⽣成バッチ
(Python)
記事配信サーバ
(Go)
AB API ここを繋ぐか
悩みどころ
だれが知ってるんだ問題
どのABが今⾛っているかを誰が管理してるんだろう問題
記事リスト⽣成のバッチがどのリストを⽣成するかはど
こが管理する??
AB APIのDBで直接管理?
結果
DynamoDBのkey名を {ABtest_name}:{logic_id}のよ
うな形で保存
タブ呼び出しAPIはそれをAB APIからユーザがどのABに
割当たるかを受け取ってあっている
そもそも役割分担として
AB APIはあくまでどのユーザに何が割り当てられてい
るか管理。リスト⽣成に関してはノータッチ
リスト⽣成は別の⽅法でABを管理
サーバサイド(配信ロジック)
記事リスト⽣成バッチ
(Python)
記事配信サーバ
(Go)
AB API ここを繋ぐか
悩みどころ
サーバサイド(配信ロジック)
記事リスト⽣成バッチ
(Python)
記事配信サーバ
(Go)
AB API
リスト⽣成
ユーザ側のAB
管理
リスト側のAB管
理
サーバサイド(配信ロジック)
記事リスト⽣成バッチ
(Python)
記事配信サーバ
(Go)
AB API
ユーザ側のAB
管理
リスト側のAB管
理
管理画⾯
リスト⽣成
⼀件落着
ながれ
⾃⼰紹介
マイクロサービスとサービス紹介
ABテストとは
クライアントのABテスト
サーバーサイドのABテスト
まとめ
まとめ
マイクロサービスは集計が大変
=> とりあえずログ⼊れた。だいたいログ⼊れれば解決する気がする
=> そもそもABに関する機能を切り出すのは分けすぎた感
=> 新規のメンバー加⼊がしやすい、
クライアントABしやすいとかのメリットはある
ABでのリストの生成の役割分担
=> ルールを決めてDynamoに⼊れた
分析チームとAPIチームで役割の分割ができている点は良かった
共通の管理画⾯で⼀括管理で⼤きな問題もなし
今後の課題
ABの⾃動集計
ABユーザ割り当ての⾃動化、拡⼤の⾃動化
おしまい
Gunosyでは(泥臭く)課題解決をしてくれるエンジニア
を募集しています!
https://hrmos.co/pages/1009778707507720193/jobs

マイクロサービスとABテスト