[RFC] 038 - Feature Flags #1894
Replies: 3 comments
-
Feature Flag 简介Feature Flag(也称为 Feature Toggle、Feature Switch、Feature Flipper 或 Feature Control)是一种软件开发实践,它允许开发团队动态地更改系统的某些功能,而无需修改代码。这种做法可以用于各种目的,例如渐进式发布、A/B 测试、灰度发布或处理运行时的功能开关。 Feature Flags 的工作原理是在软件代码中添加条件逻辑,该逻辑根据配置或数据库中的标志值决定是否启用某个功能。这种方式使得开发人员可以推出新功能而不立即对所有用户可见,也可以根据需要对特定用户群体或环境启用或禁用功能。 Feature Flags 的主要优点包括:
然而,Feature Flags 也有一些潜在的缺点:
为了有效地使用 Feature Flags,团队应该制定明确的策略和最佳实践来创建、部署、管理和退役这些标志。这通常涉及到使用专门的 Feature Flag 管理系统,这些系统提供了界面和工具来控制和监控 Feature Flags 的状态。 |
Beta Was this translation helpful? Give feedback.
-
Feature Flags 的控制,我的想法是:
|
Beta Was this translation helpful? Give feedback.
-
关键实现整理配置文件
export const FeatureFlagsSchema = z.object({
webrtc_sync: z.boolean().optional(),
language_model_settings: z.boolean().optional(),
openai_api_key: z.boolean().optional(),
openai_proxy_url: z.boolean().optional(),
create_session: z.boolean().optional(),
edit_agent: z.boolean().optional(),
dalle: z.boolean().optional(),
});
export type IFeatureFlags = z.infer<typeof FeatureFlagsSchema>;
// 开关默认值
export const DEFAULT_FEATURE_FLAGS: IFeatureFlags = {
// WebRTC 多端同步,计划在 1.0 中将此值改为 false
webrtc_sync: true,
language_model_settings: true,
openai_api_key: true,
openai_proxy_url: true,
create_session: true,
edit_agent: true,
dalle: true,
};
// 将变量字段转换为在应用中进行判断的语义化变量名
export const mapFeatureFlagsEnvToState = (config: IFeatureFlags) => {
return {
enableWebrtc: config.webrtc_sync,
isAgentEditable: config.edit_agent,
showCreateSession: config.create_session,
showLLM: config.language_model_settings,
showOpenAIApiKey: config.openai_api_key,
showOpenAIProxyUrl: config.openai_proxy_url,
showDalle: config.dalle,
};
}; 服务端环境变量在 export const getServerFeatureFlagsValue = () => {
const flags = parseFeatureFlag(env.FEATURE_FLAGS);
return merge(DEFAULT_FEATURE_FLAGS, flags);
};
export const serverFeatureFlags = () => {
const serverConfig = getServerFeatureFlagsValue();
return mapFeatureFlagsEnvToState(serverConfig);
}; 服务端环境变量传递到客户端在 思想类似于 React Context 的用法。 客户端取值判断:组件中使用 const HeaderAction = memo(() => {
const { isAgentEditable } = useFeatureFlagStore(featureFlagsSelectors);
return (
<>
<ShareButton />
{isAgentEditable && <SettingButton />}
</>
);
}); |
Beta Was this translation helpful? Give feedback.
-
背景
我们有很多针对界面自定义的需求,主要在于需要隐藏部分界面功能,以满足不同场景的诉求
设计思路
在 LobeChat 中会计划添加两层 feature Flag 控制,一层在环境变量,一层考虑在中间件。先准备做到环境变量里
环境变量方案
实现语法复用之前 MODEL_LIST 那种, +abc 是开启某个功能,-abc 是关闭某个功能。多个配置之间通过 , 分割。
比如
FEATURE_FLAGS=+webrtc_sync,-openai_api_key
代表了开启 WebRTC 同步,隐藏 OpenAI API keyBeta Was this translation helpful? Give feedback.
All reactions