配置用户配置文件服务

云眼About 3 min

配置用户配置文件服务

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

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

Android SDK 默认为用户配置文件服务,该服务将此状态直接存储在设备上。请参阅 Android SDK 用户配置文件服务open in new window

manager.userProfileService.lookup读取客户的用户配置文件。

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

实现服务

如果要实现自定义用户配置文件服务,而不是使用 Android SDK 提供的默认服务,请参阅下面的代码示例。您自己的用户配置文件服务应公开两个具有以下签名的函数:

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

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

下面的代码示例显示了用户配置文件对象的 JSON 架构。

experiment_bucket_map覆盖默认分桶行为,并为给定用户定义备用实验变体。对于要覆盖的每个实验,向Map添加一个对象。使用实验 ID 作为键,并包含一个指定所需变体的variation_id属性。如果没有实验条目,则默认分桶行为仍然存在。

在下面的示例中,^[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"] 
}

SDK 使用您提供的用户配置文件服务在保存实验分配时覆盖默认分桶行为。

对于 Swift 和 Android 应用,用户配置文件服务将在应用更新中保留变体分配。但是,用户配置文件服务不会在重新安装应用后保留变体分配。

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

安卓中的No-op

在 Android 中,默认的用户配置文件服务也是粘性的。这可以通过在Android应用程序中禁用UserProfileService来否决。为此,请定义一个CustomUserProfileService继承我们的DefaultUserProfileService class,但覆盖lookupmethod以始终返回 null。请参阅以下示例:

Kotlin

class CustomUserProfileService : UserProfileService {     
    
    @Throws(Exception::class)    
    override fun lookup(userId: String): Map<String, Any>? {       
        return null    
    }     
    
    @Throws(Exception::class)    
    override fun save(userProfile: Map<String, Any>) {       
    }  
    
}

Java

public class CustomUserProfileService implements UserProfileService {      
    public Map<String, Object> lookup(String userId) throws Exception {         
        return null;     
    }      
    
    public void save(Map<String, Object> userProfile) throws Exception {     
    }  
        
}

将此传递给云眼管理器:

Kotlin

val customUserProfileService = CustomUserProfileService() 
val eyeofcloudManager = EyeofcloudManager.builder()          
        .withSDKKey("<Your_SDK_Key>")          
        .withUserProfileService(customUserProfileService)          
        .build(context)

Java

CustomUserProfileService customUserProfileService = new CustomUserProfileService();    
EyeofcloudManager eyeofcloudManager = EyeofcloudManager.builder()         
        .withSDKKey("<Your_SDK_Key>")         
        .withUserProfileService(customUserProfileService)         
        .build(context);

使用此自定义实现,当流量分配更改时,分桶将不再粘滞。

Last update:
Contributors: zhangweixue,“zhangweixue”