我开源了一个 A/B 实验、功能发布管理平台项目 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
FeatureProbe
V2EX    程序员

我开源了一个 A/B 实验、功能发布管理平台项目

  FeatureProbe
FeatureProbe 2023-02-16 17:14:09 +08:00 8541 次点击
这是一个创建于 999 天前的主题,其中的信息可能已经有所发展或是发生改变。

A/B 实验、以功能粒度发布的管理平台

主要使用场景如下:

1. 『功能粒度』灰度发布: 每个功能独立灰度发布给用户。可迅速关闭受 BUG 影响的功能,同时不影响其他正常功能的使用。

2. 降低测试环境搭建成本: 节约测试环境搭建和线下测试时间成本。利用线上环境小流量测试,环境真实同时影响可控。

3. 降低故障恢复时间:故障发生时通过降级策略调整服务行为,保障用户主路径不受影响。

4. 简化研发协同方式: 用功能开关替代传统分支开发的团队协同模式。真正实现主干开发、持续部署。减少分支合并冲突,显著加快迭代速度。

5. 统一的配置管理中心: 通过用户友好的操作页面,统一操作线上配置,实时修改功能参数,让运营活动生效更简单。

GitHub 地址: https://github.com/FeatureProbe/FeatureProbe

文档地址: http://docs.featureprobe.io

体验环境地址: https://featureprobe.io/

欢迎 star 和提 issue/pr,如果能得到大家小小的鼓励和认可,是我的荣幸!

37 条回复    2024-11-20 10:01:47 +08:00
ryan4yin
    1
ryan4yin  
   2023-02-17 10:14:01 +08:00   1
看着不错,企业会比较需要这种
FeatureProbe
    2
FeatureProbe  
OP
   2023-02-17 11:54:52 +08:00
@ryan4yin 欢迎使用,如有任何建议或问题的话,可以提 issue/pr ,也可以找我哦。
gangbinfo123
    3
gangbinfo123  
   2023-02-17 11:56:04 +08:00
感觉发现了新大陆,使用一段时间,上线风险降低好多啊
shibo501c
    4
shibo501c  
   2023-02-17 11:58:01 +08:00 via Android
紧急情况关闭一些功能还挺好用,配置系统还是太偏向研发人员了,这种平台其他角色也可以用,国外还有 launchdarkly, growthbook 什么的,国内少一点
millken
    5
millken  
   2023-02-17 12:38:27 +08:00
带侵入的方案企业一般不敢用,A/B testing 大多数 gateway 已经支持了,当然你这个属于定制行非常强,在非常熟悉 SDK 的情况下且有复杂场景需求的可以考虑使用。
shibo501c
    6
shibo501c  
   2023-02-17 17:41:18 +08:00
@millken 是的,后端其实方案比较多,主要还是移动端要发版,上应用商店,能够快速关闭个功能,还是挺有用的
gohaian
    7
gohaian  
   2023-02-24 11:47:45 +08:00
体验了,非常不错,期待开源更多功能。
lessMonologue
    8
lessMonologue  
   2023-03-01 17:23:49 +08:00
DIDI 的 apollo ?
FeatureProbe
    9
FeatureProbe  
OP
   2023-03-01 17:24:41 +08:00
@gohaian 这周上线了指标分析功能,欢迎使用,有任何问题和建议欢迎提 issue
zhaoyta
    10
zhaoyta  
   2023-03-01 17:39:37 +08:00
携程的 apollo ?
dnsjia
    11
dnsjia  
   2023-03-01 18:17:21 +08:00
FeatureProbe
    12
FeatureProbe  
OP
   2023-03-02 10:22:37 +08:00
@zhaoyta 携程的 apollo 是配置中心,FeatureProbe 主要是功能粒度去管理和发布功能,之前写了一篇文章讲了二者的区别,有兴趣可以看一下 https://juejin.cn/post/7187598169730416701
FeatureProbe
    13
FeatureProbe  
OP
   2023-03-02 10:33:21 +08:00
@lessMonologue 欢迎使用
shibo501c
    14
shibo501c  
   2023-03-02 11:34:46 +08:00
@lessMonologue 难道是老橘子
OpenSea
    15
OpenSea  
   2023-03-02 13:54:53 +08:00
呀,在 V 站看到了,之前提了不少 issue
opentrade
    16
opentrade  
   2023-03-02 13:55:28 +08:00
有米置顶
99yuying
    17
99yuying  
   2023-03-02 14:19:32 +08:00
文档写的很全面
kingterrors
    18
kingterrors  
   2023-03-02 14:41:16 +08:00
看起来就很厉害,向大佬学习!
jiangzm
    19
jiangzm  
   2023-03-02 14:47:17 +08:00
跟 DIDI 有个开源项目很像, 另外字体是不是有点小感觉不太协调。
jiangzm /td>
    20
jiangzm  
   2023-03-02 15:00:13 +08:00
@zhaoyta
@lessMonologue
@FeatureProbe
对的配置中心一般给开发人员用的,A/B 实验一般是产品基于用户画像来实验新功能的。
daguozi
    21
daguozi  
   2023-03-02 15:33:53 +08:00 via iPhone
小白看了非常感兴趣,想请教楼主对于 AB 测试如何做的 randomization? 在有 gradularity 时,如何确定用户 A 在 10%的 roll out 呢?每次 rollout 时,A 永远在 10%还是每次都不一样呢?
shibo501c
    22
shibo501c  
   2023-03-02 16:16:54 +08:00   2
@daguozi 好像比较常见的做法是不同的 AB 实验,用不同的 salt 进行 hash ,也有提前分不同的 zone 的。10% 的 roll out 也分稳定的还是不稳定的,只要用户有唯一的 key ,hash 出来就可以是稳定的。
daguozi
    23
daguozi  
   2023-03-02 16:53:32 +08:00
@shibo501c 谢谢解释!我比较感兴趣的是 如果 10% rollout 然后 roll back 10%,再 rollout 10% 以后是否是稳定的。还没有仔细看 doc ,也许我说的是错的,但感觉看起来 hash 是根据 project 的 unique identifier 进行 salt 的?那只要是一个 project 下的 rollout ,就是稳定的。但如果 new 了一个 project ,那新的 project 下的 10%可能应该就是 reshuffle 了
jiangzm
    24
jiangzm  
   2023-03-02 17:09:41 +08:00   1
@daguozi 是的,灰度流量不能总是让同一批人当小白鼠。用 user_id 加上 exp_no hash 算出流量区间,或者基于 session_id 来计算,这样能保证实验的独立性。
shibo501c
    25
shibo501c  
   2023-03-02 17:18:18 +08:00   1
@daguozi 是的,所以如果是想让全新用户进组的话,有很多办法,比如可以让业务代码上记录下属性,FeatureProbe 目前支持用户代码传入一个 user 的属性,初始化时候,传入用户时候看过上一个版本,在 toggle 的规则中排除掉,比如过滤掉 user["feature_v1_viewed"] == true 的用户。
daguozi
    26
daguozi  
   2023-03-02 18:06:07 +08:00
@shibo501c @jiangzm 啊是这个是个好方法哈哈!有意思,感觉应该是灰度到了每个 variant 了。感觉是 project 下有 concurrent toggles ,然后 每个 toggle map 100% user base 。突然有这么个问题。。。如果有其中 toggle 里 1 ,2 ,3 三个 enum flag rollout 。rollout 20% 1 ,40% 2 ,40% 3. 那么 stable 情况下,第二次 rollout 30% 1 ,30% 2 ,40% 3. 那么这次 1 多出来的 10% 是从 2 拿的呢还是说 2 + 3 里拿的。。。想请教这里的顺序问题。。。
shibo501c
    27
shibo501c  
   2023-03-02 18:38:42 +08:00
@daguozi 好问题,目前我们开源的版本是会出现 2 和 3 组都会有一部分用户进入组 1 ,是有方案做到只从 2 组拿用户出来的,但是实现要复杂一些。

比如目前是分 100 个桶,第一次按照流量分前 20 是组 1 ,中间 40 是组 2 ,最后 40 是组 3 ,调整后,找减少最多的组中多余桶,再进行 hash 分给增加的组,直到桶分完。
shibo501c
    28
shibo501c  
   2023-03-02 19:15:18 +08:00   1
补充下,因为 3 组 40%没变,所以目前的一层 hash 实现只会从 2 组挪动 10%到 1 组。
如果是变成 30%,40%,30%,则会让 组 2 的一部分去组 1 , 组 3 一部分去组 2 。
两层 hash 的话,可以只让 3 组的进入组 1 ,组 2 不动。
daguozi
    29
daguozi  
   2023-03-02 19:22:26 +08:00
@shibo501c 谢谢作者的解释,明白了,看来这种 edge case 应该不是 best practice 的 use case 。感觉 binary 的 flag rollout 就没有问题哈。
szzadkk
    30
szzadkk  
   2023-03-03 10:59:52 +08:00
A/B 实验的话,应该还需要互斥组这个东西,做流量的复用和隔离
FeatureProbe
    31
FeatureProbe  
OP
   2023-03-03 11:31:39 +08:00
@szzadkk 赞,这个已经在我们的规划中了,每个 release note 都会发布在 github 上,欢迎关注
wuchangming89
    32
wuchangming89  
   2023-03-03 13:21:52 +08:00
不错,点个赞
mikeying
    33
mikeying  
   2023-03-07 14:53:04 +08:00   1
赞,已经开始用了,期待你们的上线更多的功能!
TomVista
    34
TomVista  
   2023-03-07 19:46:07 +08:00
这个帖子花了不少钱啊...
40EaE5uJO3Xt1VVa
    35
40EaE5uJO3Xt1VVa  
   2023-03-07 19:49:13 +08:00
@TomVista

原谅我粗浅,我没看懂楼主这个项目干什么的。这样应该算正常。

不过诡异的是 这个帖子没有什么热度,缺有 21 个赞,被顶在首页。
shibo501c
    36
shibo501c  
   2023-03-07 20:46:55 +08:00
@yanzhiling2001 其实热度还可以,很多 V2EX 的朋友给我们点 star ,导致我们周末还短暂的在 github 的 trending 上待了两天。
mistygg
    37
mistygg  
   356 天前
大佬,gitee 的微信群二维码过期了,可以更新一下吗? 另外,我尝试在一个 2 核 4G 的云服务器上 docker 部署,但是报错了,说内存不够,请问有办法解决吗?
关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5737 人在线   最高记录 6679       Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 38ms UTC 01:54 PVG 09:54 LAX 17:54 JFK 20:54
Do have faith in what you're doing
ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86