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=/;";
}
これらの設定でうまくできそう