IP アドレスに基づいて A/B テストのバリエーションを割り当てるためのベスト プラクティス

StackOverflow https://stackoverflow.com/questions/2523192

質問

Grails Web アプリケーションで A/B テスト用のコードを書き始めています。同じ IP アドレスからのリクエストが常に同じバリエーションを参照できるようにしたいと考えています。IP->バリアントのマップを保存するのではなく、単純にドットを削除して IP アドレスを整数に変換し、それを乱数ジェネレーターのシードとして使用しても問題ありませんか?Grails フィルターでは次のことが行われます。

def ip = request.remoteAddr
def random = new Random(ip.replaceAll(/\./, '').toInteger())
def value = random.nextBoolean()
session.assignment = value
// value should always be the same for a given IP address

IP アドレスによるユーザーの識別が信頼できないことはわかっており、セッション変数/Cookie も使用する予定ですが、これは新しいセッションがあり、Cookie が設定されていない場合 (またはユーザーが Cookie を持っている場合) に役立つようです。無効)。

役に立ちましたか?

解決

単純に 32 ビットの数値を取得して、ip mod number_of_test_scenarios を実行することもできます。または、Ruby で提供されている標準のハッシュ関数を使用します。しかし、このアプローチにはいくつかの問題があることを指摘しておく必要があると思います。

  1. アプリがプロキシの背後にある場合、IP はそのプロキシのすべてのユーザーで同じになります。
  2. 一部のユーザーは、あなたが思っているよりもかなり頻繁に IP を変更します。おそらく(ジョエル・スポルスキーが言うように)「それらのユーザーにとってインターネットは壊れている」かもしれませんが、特に微妙な方法でインターネットをさらに壊れさせるのは、顧客にとって不利益であると私は言います、彼らはおそらくそうではないことを考えるとそれに関して何でもできる立場にある。
  3. 新しいセッションを持つユーザーの場合は、最初のリクエストで Cookie を割り当て、その割り当てをメモリ内に保持するだけです。ユーザーの最初のリクエストが同時に複数のサーバーに送信されない限り、これで問題は解決されるはずです (私が管理しているアプリでそうしています)。
  4. Cookie が無効になっているユーザーに対しては、「インターネットが壊れています」と言うでしょうし、そのケースをサポートするのに苦労はしません。それらはデフォルトのテストバケットに割り当てられ、全員がそこに移動します。多くのそのようなユーザーを途切れることのない方法でサポートすることを計画している場合は、自分のための仕事を作成することになりますが、おそらくそれは問題ありません。この場合、URL 書き換えと 302 リダイレクトを使用して、これらのユーザーを何らかのシナリオに誘導することを検討するとよいでしょう。しかし、私の意見では、これには時間をかける価値はありません。
  5. ユーザーがサイトにログインできる場合は、シナリオの割り当てをデータベースに記録し、それに応じて cookie/db の不一致を調整してください。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top