UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【Fastly】 GAEのトランザクション分割を利用してA/Bテストを行う

GAEのトランザクション分割を利用してA/Bテストを行う方法を考えた

uga-box.hatenablog.com

ただ、間にFastlyがある場合、何も考えずにオリジンサーバーで表示パターンを切り替えると、A/Bのどちらか 1 つが Fastlyにキャッシュされてしまうので、キャッシュ期限が切れるまで固定化されてしまう

そこで、Vary ヘッダーという HTTP ヘッダーを使って、単一 URL に対して複数キャッシュを生成するようにする

この方法のFastlyの設定は以前記事にしていて、今回はこれのオリジンサーバーがGAEの場合で、かつGOOGAPPUIDクッキーの扱い方も考えながら設定を考えてみる

uga-box.hatenablog.com

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=/;";
}

これらの設定でうまくできそう