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

时间:2010-03-26 12:30:07

标签: 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

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

1 个答案:

答案 0 :(得分:5)

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

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