Wasabi简介
Wasabi是一个实时、企业级、100% API驱动的A/B测试服务平台。它允许用户拥有并管理自己的数据,同时在Web、移动和桌面端运行实验。Wasabi具有快速、易用、功能丰富和仪器化最小的特点,能够帮助企业从猜测转向基于数据驱动的用户洞察。
环境搭建
在使用Wasabi之前,需要先搭建一个完整的Wasabi栈。以下是详细的步骤:
安装必要工具:
Wasabi需要一系列的工具才能正常运行,包括Homebrew、Git、Maven、Java、Docker、Node.js和Python等。使用以下命令安装这些工具:
#!/bin/bash
curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install | bash
sudo apt-get update
sudo apt-get install -y git maven openjdk-8-jdk docker.io nodejs python2.7
注意:在Ubuntu上运行bootstrap命令后需要重启系统。
构建并启动Wasabi:
安装完必要工具后,使用以下命令构建并启动Wasabi:
cd wasabi
./bootstrap.sh
./wasabi.sh up
启动成功后,可以通过访问http://<your-docker-host-ip>:8080/api/health
来验证Wasabi是否正常运行。
使用Wasabi进行A/B测试
在使用Wasabi进行A/B测试时,需要完成以下步骤:
定义实验:
首先,需要在Wasabi中定义一个实验。实验通常包括实验组和对照组,以及要测试的功能或设计变化。
分配用户:
接下来,需要将用户分配到实验组或对照组中。Wasabi提供了API接口来实现这一功能。以下是一个将用户分配到实验组BucketA的示例:
curl -X POST \
-H "Content-Type: application/json" \
-d '{
"assignment": {
"bucket": "BucketA",
"context": "PROD",
"payload": "green",
"status": "NEW_ASSIGNMENT"
},
"cache": {},
"events": [],
"userId": "userID1"
}' \
http://<your-docker-host-ip>:8080/api/assignments/Demo_App/BuyButton
记录事件:
在实验过程中,需要记录用户的行为事件,如点击、购买等。以下是一个记录用户点击Buy按钮的事件示例:
curl -X POST \
-H "Content-Type: application/json" \
-d '{
"events": [
{
"name": "BuyClicked"
}
]
}' \
http://<your-docker-host-ip>:8080/api/events/Demo_App/userID1
分析结果:
收集到足够的数据后,可以使用Wasabi提供的API或UI界面来分析实验结果。通过分析实验组和对照组之间的差异,可以确定测试的功能或设计变化是否有效。
代码示例:集成Wasabi到客户端应用
以下是一个简单的示例,展示了如何将Wasabi集成到客户端应用中。在这个示例中,客户端应用是一个基于Node.js的Web应用。
安装必要的npm包:
npm install axios
创建Wasabi客户端:
const axios = require('axios');
class WasabiClient {
constructor(baseUrl, appId, userId) {
this.baseUrl = baseUrl;
this.appId = appId;
this.userId = userId;
}
async assignUserToExperiment(experimentName, bucket) {
const url = `${this.baseUrl}/api/assignments/${this.appId}/${experimentName}`;
const data = {
assignment: {
bucket: bucket,
context: 'PROD',
payload: 'green',
status: 'NEW_ASSIGNMENT'
},
cache: {},
events: [],
userId: this.userId
};
const response = await axios.post(url, data);
return response.data;
}
async recordEvent(eventName) {
const url = `${this.baseUrl}/api/events/${this.appId}/${this.userId}`;
const data = {
events: [
{
name: eventName
}
]
};
const response = await axios.post(url, data);
return response.data;
}
}
module.exports = WasabiClient;
在客户端应用中使用Wasabi客户端:
const express = require('express');
const WasabiClient = require('./WasabiClient');
const app = express();
const port = 3000;
const wasabiClient = new WasabiClient('http://<your-docker-host-ip>:8080', 'Demo_App', 'userID1');
app.get('/assign', async (req, res) => {
try {
const assignment = await wasabiClient.assignUserToExperiment('BuyButton', 'BucketA');
res.json(assignment);
} catch (error) {
res.status(500).json(error);
}
});
app.get('/record', async (req, res) => {
const eventName = req.query.eventName;
try {
const eventResponse = await wasabiClient.recordEvent(eventName);
res.json(eventResponse);
} catch (error) {
res.status(500).json(error);
}
});
app.listen(port, () => {
console.log(`Server is running at http://localhost:${port}`);
});