A / B测试。在网关API中路由客户端

时间:2017-08-08 23:34:40

标签: microservices ab-testing api-gateway canary-deployment

我正在开发一个基于微服务的新项目。它是一个内部应用程序,只有大约10个微服务。我们将使用网关API进行身份验证,并可能使用一些微服务聚合。 (可能是Netflix zuul和Spring Boot)

我不清楚的是我们如何进行A / B测试和Canary测试的路由。假设我有100个客户端,我们希望A / B测试新版本的微服务。客户端应用程序不需要更改,它只是微服务提供的功能的内部更改。

我知道我们会站起来一个新的微服务,比如说(v2)。我感到困惑的是如何将客户端1-10指向新版本。我们需要能够集中配置,而不是在客户端上进行任何更改。

我们知道他们的mac地址(以及其他识别属性),并且可以插入我们想要识别其消息的任何类型的标头。

那么我如何将这些指向用于A / B测试或Canary部署的API的v2?

3 个答案:

答案 0 :(得分:1)

如果描述高级通用方法,您可以执行以下操作:

  1. 您的客户需要有一些参数,以便唯一地识别它们。看起来你已经有了这个。
  2. 实施其他API服务(我们称之为实验API)。此服务应至少有一个端点接收客户端标识属性,并说明客户端是否参与A / B测试。
  3. 在每个传入请求中,Gateway API需要使用该Experiment API端点来决定哪个微服务版本(v1或v2)用于重定向/调用。
  4. 每次在Gateway API中引入一些缓存层时,为避免调用Experiment API。作为另一种选择,您可以使用一些自定义cookie(其中包含“实验”下的客户端),仅在未指定该cookie时才调用Experiment API,并将cookie返回给客户端并附上响应。

答案 1 :(得分:0)

详细阐述@Set的回答。您需要在网关API中引入一些检测代码,以决定要调用的下游端点。如果且仅当您的分布式后端的唯一组件是与网关API相关时,上述解决方案就过度设计:您可以只使用一个库。但很可能您很快就会发现一个或多个其他服务需要了解实验,在这种情况下您需要一个独立的服务。

一般来说,构建强大的实验框架是一项艰巨的任务。您将很快遇到意外问题,例如:体验稳定性(如何保证返回访问者的相同体验)或如何更改分配比例(或者可能完全关闭新代码)而无需重新启动主机应用程序。您应该研究那里的开源框架,甚至商业服务器端仪器。 (我们在Variant有一个。)

答案 2 :(得分:0)

我在Github上发布了一个原型,展示了如何使用Zuul Gateway实现路由。此原型只显示如何基于cookie将流量路由到同一应用程序的不同实例。您可以根据任何其他条件进行路由。 您还应该查看Spring Cloud Gateway作为Zuul的替代方案。似乎很有希望。 https://github.com/adiesner/spring-boot-sample-ci-gateway

更简单的设置是在服务前添加nginx并使用split_clients方法。

http {
    # ...
    # application version 1a
    upstream version_1a {
        server 10.0.0.100:3001;
        server 10.0.0.101:3001;
    }

    # application version 1b
    upstream version_1b {
        server 10.0.0.104:6002;
        server 10.0.0.105:6002;
    }

    split_clients "${arg_token}" $appversion {
        95%     version_1a;
        *       version_1b;
    }

    server {
        # ...
        listen 80;
        location / {
            proxy_set_header Host $host;
            proxy_pass http://$appversion;
        }
    }
}

https://www.nginx.com/blog/performing-a-b-testing-nginx-plus/