mipengine / mip2

MIP (移动网页加速器)通过优化网页JS、控制资源加载顺序,达到加速网页的效果。
https://www.mipengine.org/
MIT License
184 stars 49 forks source link

新增 mip 前端小流量机制 #559

Closed zoumiaojiang closed 5 years ago

zoumiaojiang commented 5 years ago

要解决什么问题 由于 mip 无法在 cdn 层面做小流量实验,并且 mip 一旦升级就会对全部的 mip 站点产生影响,但是在 mip 核心的升级过程中,经常会发现有些 feature 对性能的收益不好评估,需要做实验进行数据对比后才确认需不需要应用到整体的 mip 站点,为了将影响面降低,需要有一种机制在前端进行一些可控的小流量 abTest 实验

描述一下你理想中的解决方案

维护一份实验配置表,这个配置表能够映射到 mip 核心的任何地方,当 mip 核心需要进行实验的时候,让即将实验的代码块运行在实验命中判断的 if 语句中(这类的方式适合较小代码改动的实验),提供两种实验方式:

基于站点粒度的实验:assertSite() 基于流量控制的实验:assertAbtest()

如下代码所示:

import {assertAbTest, assertSite} from 'src/experiment/index'

// .... 正常的代码逻辑
if (assertSite('test1')) {
  // 需要进行 test1 站点粒度实验的代码块
}
if (assertAbTest('test1')) {
  // 需要进行 test1 abTest 流量实验的代码块
}
// ... 正常的代码逻辑

实验的配置只需要在 /src/experiment/config.js 文件中进行配置:

export default {
  site: {
    /**
     * 如果有实验需求就按照如下的格式配置
     */
    test1: {
      description: 'Test1 实验的描述',
      startTime: '2019-02-13 00:00:00',
      endTime: '2019-04-10 23:59:59',
      sites: [
        'baobao.baidu.com',
        'muzhi.baidu.com',
        'm.120ask.com'
      ]
    }
  },

  abTest: {
    test1: {
      description: 'abTest1 实验描述',
      startTime: '2019-02-14 00:00:00',
      endTime: '2019-03-25 17:08:00',
      // 所开的流量的百分比
      ratio: 100
    },
    test2: {
      description: 'abTest1 实验描述',
      startTime: '2019-03-21 00:00:00',
      endTime: '2019-03-27 23:59:59',
      // 所开的流量的百分比
      ratio: 50
    }
  }
}

当然,这个实验机制的方案对代码维护的要求较高,mip 核心团队应该仔细权衡每次的改动是否需要走实验机制,最好每次只进行一个实验。