4

我开始为 Grails Web 应用程序中的 A/B 测试编写一些代码。我想确保来自同一个 IP 地址的请求总是看到相同的变化。与其存储 IP->variant 的映射,不如通过删除点简单地将 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)的情况似乎很有用禁用)。

4

1 回答 1

5

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

  1. 如果您的应用在任何代理之后,则该代理的所有用户的 ip 将是相同的。
  2. 有些用户会相当频繁地更改 IP,比您想象的更频繁。也许(正如乔尔·斯波尔斯基所说)“互联网对那些用户来说已经坏了”,但我想说,如果你让互联网对他们来说更坏,尤其是在一种微妙的方式下,这对你的客户是一种伤害,因为他们可能不是有能力对此做任何事情。
  3. 对于有新会话的用户,您可以在第一次请求时分配 cookie 并将分配保存在内存中;除非用户的初始请求同时发送到多个服务器,否则这应该可以解决该问题(这是我在我维护的应用程序上所做的)。
  4. 对于禁用 cookie 的用户,我会说“互联网坏了”,我不会费力支持这种情况;他们会被分配到一个默认的测试桶,然后都去那里。如果您计划以一种完整的方式支持许多此类用户,那么您就是在为自己创造工作,但也许没关系。在这种情况下,您可能需要考虑使用 URL 重写和 302 重定向来将这些用户发送到一种或另一种情况。但是在我看来,这不值得花时间。
  5. 如果您的用户可以登录该站点,请确保您在数据库中记录场景分配并相应地协调 cookie/db 差异。
于 2010-03-26T12:54:12.637 回答