我开始在 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,比您想象的更频繁。也许(正如乔尔·斯波尔斯基(Joel Spolsky)所说)“互联网对这些用户来说已经被破坏了”,但我想说,如果你让互联网对他们来说更加破坏,那么这对你的客户来说是一种伤害,特别是以一种微妙的方式,因为他们可能没有能够对此采取任何行动。
  3. 对于有新会话的用户,您可以在第一次请求时分配 cookie,并将分配保留在内存中;除非用户的初始请求同时发送到多个服务器,否则这应该可以解决该问题(这就是我在我维护的应用程序上所做的)。
  4. 对于禁用 cookie 的用户,我会说“互联网坏了”,而且我不会费太多力气来支持这种情况;他们会被分配到一个默认的测试桶,然后全部都去那里。如果您计划以不间断的方式支持许多此类用户,那么您就是在为自己创造工作,但这也许没关系。在这种情况下,您可能需要考虑使用 URL 重写和 302 重定向来将这些用户发送到一种或另一种情况。但在我看来,这不值得花时间。
  5. 如果您的用户可以登录该站点,请确保您在数据库中记录了场景分配,并相应地协调了 cookie/db 差异。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top