GAEのトランザクション分割を利用してA/Bテストを行う方法を考えた
ただ、間にFastlyがある場合、何も考えずにオリジンサーバーで表示パターンを切り替えると、A/Bのどちらか 1 つが Fastlyにキャッシュされてしまうので、キャッシュ期限が切れるまで固定化されてしまう
そこで、Vary ヘッダーという HTTP ヘッダーを使って、単一 URL に対して複数キャッシュを生成するようにする
この方法のFastlyの設定は以前記事にしていて、今回はこれのオリジンサーバーがGAEの場合で、かつGOOGAPPUID
クッキーの扱い方も考えながら設定を考えてみる
IN RECV
やりたいこと
AB_TEST
クッキーがない場合- 50:50でA/Bを振り分ける
- 振り分けたパターンをFastlyからGAEへのリクエストヘッダーに
X-ABTest = "A"
のようにセットする GOOGAPPUID
クッキーにAパターンの場合は0
、Bの場合は500
をセットする
AB_TEST
クッキーがある場合X-ABTest
にクッキーの値をセットするGOOGAPPUID
クッキーにAパターンの場合は0
、Bの場合は500
をセットする
if (!req.http.Cookie:AB_TEST) { if (randombool(50,100)) { set req.http.X-ABTest = "A"; set req.http.Cookie:GOOGAPPUID = "0"; } else { set req.http.X-ABTest = "B"; set req.http.Cookie:GOOGAPPUID = "500"; } } else { set req.http.X-ABTest = req.http.Cookie:AB_TEST; if (req.http.Cookie:AB_TEST == "A") { set req.http.Cookie:GOOGAPPUID = "0"; } else { set req.http.Cookie:GOOGAPPUID = "500"; } }
IN FETCH
やりたいこと
- Varyヘッダーに
X-ABTest
をセットする
if (beresp.http.Vary) { set beresp.http.Vary = beresp.http.Vary ", X-ABTest"; } else { set beresp.http.Vary = "X-ABTest"; }
IN DELIVER
やりたいこと
- クッキーがない場合はクッキーをセットする
if (!req.http.Cookie:AB_TEST){ add resp.http.Set-Cookie = "AB_TEST=" req.http.X-ABTest + "; Max-Age=2592; Path=/;"; }
これらの設定でうまくできそう