基于IP地址分配A/B测试变体的最佳实践

moj*_*nes 4 grails groovy ip-address abtest

我开始在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
Run Code Online (Sandbox Code Playgroud)

我知道通过IP地址识别用户是不可靠的,我也将使用会话变量/ cookie,但这似乎对我们有新会话,没有设置cookie(或用户有cookie)的情况很有用禁用).

Mr.*_* 安宇 5

您可以简单地取32位数字并执行ip mod number_of_test_scenarios.或者使用ruby中提供的标准散列函数.但我觉得我应该指出这种方法的一些问题:

  1. 如果您的应用程序位于任何代理服务器后面,则该代理服务器的所有用户的IP都是相同的.
  2. 有些用户会比你想象的更频繁地更改IP.也许(正如Joel Spolsky所说)"互联网对这些用户来说是破碎的",但我认为如果你让互联网更加破碎,特别是以微妙的方式破坏互联网,这对你的客户是一种伤害,因为它们可能不是能够做任何事情.
  3. 对于拥有新会话的用户,您可以在第一个请求中分配cookie并将分配保留在内存中; 除非用户的初始请求同时转到多个服务器,否则这应解决该问题(这是我在我维护的应用程序上所做的).
  4. 对于禁用cookie的用户,我会说"互联网已损坏",我不会为支持这种情况而烦恼; 他们被分配到一个默认的测试桶,所有都去那里.如果你计划以非破坏的方式支持许多这样的用户,那么你就是在为自己创造工作,但也许没关系.在这种情况下,您可能需要考虑使用URL重写和302重定向来将这些用户发送到一个或另一个场景.但在我看来,这不值得花时间.
  5. 如果您的用户可以登录该站点,请确保在数据库中记录方案分配并相应地协调cookie/db差异.