实现用户配置文件服务 UserProfileService

云眼About 3 min

实现用户配置文件服务 UserProfileService

本主题介绍如何设置自定义用户配置文件服务或如何使用云眼灰度发布(特性标帜)AB实验 JavaScript(浏览器)SDK 的默认值。

使用用户配置文件服务保留有关用户的信息,并确保变体分配具有粘性。例如,如果正在处理后端网站,则可以创建一个从 Redis 或 Memcached 存储读取和保存用户配置文件的实现。

在 JavaScript SDK 中,没有默认实现。实施用户配置文件服务是可选的,仅当希望保持变体分配的粘性时,即使实验条件在运行过程中发生了变化(例如,受众群体、属性、变体暂停和流量分配),才需要实现该服务。否则,JavaScript 开发工具包是无状态的,并依赖于确定性分桶来返回一致的分配。

如果用户配置文件服务未按预期对用户进行分桶,请检查其他灰度发布(特性标帜)是否覆盖了分桶。有关更多信息,请参阅 分桶的工作原理

实现服务

请参阅下面的代码示例以提供您自己的用户配置文件服务。它应公开两个具有以下签名的函数:

  • lookup :获取用户 ID 字符串并返回与以下架构匹配的用户配置文件。
  • save :获取用户配置文件并保留它。

如果要将用户配置文件服务纯粹用于跟踪目的而不是粘性分桶,则只能实现save方法(始终从lookup返回nil)。

用户配置文件服务的界面如下所示:

JavaScript

// Sample user profile service implementation 
const userProfileService = {   
    lookup: userId => {     
        // Perform user profile lookup   
    },   
    save: userProfileMap => {     
        // Persist user profile   
    },
};  

var eyeofcloudClient = eyeofcloud.createInstance({   datafile,   userProfileService, });

使用 localStorage 的用户配置文件服务的客户端实现示例如下所示:

JavaScript

var userProfileService = {   
    // Adapter that provides helpers to read and write from localStorage   
    localStorageAdapter: {     
        UPS_LS_KEY: 'eyeofcloud-ups-data',     
        read: function() {       
            var UPSDataObject = JSON.parse(localStorage.getItem(this.UPS_LS_KEY) || '{}');       
            return UPSDataObject;     
        },     
        write: function(data) {       
            localStorage.setItem(this.UPS_LS_KEY, JSON.stringify(data));     
        },   
},   

// Perform user profile lookup   
lookup: function(userId) {             
    return this.localStorageAdapter.read()[userId];   
},   

// Persist user profile   save: function(userProfileMap) {     
    var overwriteData = this.localStorageAdapter.read();     
    overwriteData[userProfileMap.user_id] = userProfileMap;     
    this.localStorageAdapter.write(overwriteData);   
    }, 
};  

// example usage 
var eyeofcloudClientInstance = window.eyeofcloudSdk.createInstance({   
    datafile: eyeofcloudDatafile,   
    userProfileService: userProfileService 
});

下面的代码示例显示了用户配置文件对象的 JSON 架构。在下面的示例中,^[a-zA-Z0-9]+$是实验 ID。 JSON

{  
    "title": "UserProfile",   
    "type": "object",       
    "properties": {         
        "user_id": {
            "type": "string"
        }, 
        "experiment_bucket_map": {
            "type": "object", 
            "patternProperties": {   
                "^[a-zA-Z0-9]+$": {
                    "type": "object",
                    "properties": {
                        "variation_id": {
                            "type":"string"
                        }
                    }, 
                    "required": ["variation_id"]
                }     
            }                        
        }   
     },      
     "required": ["user_id", "experiment_bucket_map"]   
}

Java SDK 使用你提供的 User Profile Service 在保存试验分配的情况下替代默认分桶行为。

在实现自己的 User Profile Service 时,建议在初始化时将用户配置文件加载到 User Profile Service 中,并避免对查找函数执行成本高昂的阻塞查找,以最大程度地减少合并服务对性能的影响。

在多服务器或无状态环境中实现时,我们建议将此接口与 Cassandra 或 Redis 等后端一起使用。您可以通过配置这些服务来决定要将粘性存储桶保留多长时间。

Last update:
Contributors: zhangweixue,“zhangweixue”