Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,12 @@ STORE_SESSION_MESSAGES=false # 是否存储请求 messages 到 Redis
# - 启用:适用于网络稳定环境,连续网络错误也应触发熔断保护,避免持续请求不可达的供应商
ENABLE_CIRCUIT_BREAKER_ON_NETWORK_ERRORS=false

# 供应商缓存配置
# 功能说明:控制是否启用供应商进程级缓存
# - true (默认):启用缓存,30s TTL + Redis Pub/Sub 跨实例即时失效,提升供应商查询性能
# - false:禁用缓存,每次请求直接查询数据库(适用于调试或单机低并发场景)
ENABLE_PROVIDER_CACHE=true

# Fetch 连接超时配置
# 功能说明:控制 TCP 连接建立超时时间(包括 DNS 查询、TCP 握手、TLS 握手)
# - 默认值:30000 毫秒(30 秒)
Expand Down
10 changes: 10 additions & 0 deletions src/lib/cache/provider-cache.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,14 @@

import "server-only";

import { getEnvConfig } from "@/lib/config";
import { logger } from "@/lib/logger";
import { publishCacheInvalidation, subscribeCacheInvalidation } from "@/lib/redis/pubsub";
import type { Provider } from "@/types/provider";

// 模块级别读取配置,避免热路径函数中频繁调用
const { ENABLE_PROVIDER_CACHE } = getEnvConfig();

export const CHANNEL_PROVIDERS_UPDATED = "cch:cache:providers:updated";

const CACHE_TTL_MS = 30_000; // 30 seconds
Expand Down Expand Up @@ -89,6 +93,12 @@ export async function publishProviderCacheInvalidation(): Promise<void> {
* @returns Provider 列表
*/
export async function getCachedProviders(fetcher: () => Promise<Provider[]>): Promise<Provider[]> {
// 检查是否启用缓存(默认启用)
if (!ENABLE_PROVIDER_CACHE) {
logger.debug("[ProviderCache] Cache disabled, fetching from DB");
return fetcher();
}

// 确保订阅已初始化(异步,不阻塞)
void ensureSubscription();

Expand Down
4 changes: 4 additions & 0 deletions src/lib/config/env.schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,10 @@ export const EnvSchema = z.object({
TZ: z.string().default("Asia/Shanghai"),
ENABLE_MULTI_PROVIDER_TYPES: z.string().default("false").transform(booleanTransform),
ENABLE_CIRCUIT_BREAKER_ON_NETWORK_ERRORS: z.string().default("false").transform(booleanTransform),
// 供应商缓存开关
// - true (默认):启用进程级缓存,30s TTL,提升供应商查询性能
// - false:禁用缓存,每次请求直接查询数据库
ENABLE_PROVIDER_CACHE: z.string().default("true").transform(booleanTransform),
MAX_RETRY_ATTEMPTS_DEFAULT: z.coerce
.number()
.min(1, "MAX_RETRY_ATTEMPTS_DEFAULT 不能小于 1")
Expand Down
Loading