feat(rpm): RPM 限流模块优化
P0: - rpm_override 嵌入 Auth Cache Snapshot,消除每请求 DB 查询 (snapshot v6→v7) - 429 RPM 响应返回 Retry-After 头(当前分钟剩余秒数) P1: - ClearAll 按钮直连 DELETE API,带 loading 防重复 - 新增 GET /admin/users/:id/rpm-status 管理员 RPM 用量查询端点 优化: - checkRPM 从级联互斥改为并行取最严,user.rpm_limit 作为全局硬上限始终生效 - Override/Group 变更后自动失效 auth cache - fail-open 语义不变,Redis 故障不阻塞业务
This commit is contained in:
@@ -894,6 +894,8 @@ export default {
|
||||
description: 'Manage your account information and settings',
|
||||
accountBalance: 'Account Balance',
|
||||
concurrencyLimit: 'Concurrency Limit',
|
||||
rpmLimit: 'RPM Limit',
|
||||
rpmUnlimited: 'Unlimited',
|
||||
memberSince: 'Member Since',
|
||||
overviewTitle: 'Account Overview',
|
||||
overviewDescription: 'Check account status, profile sources, and common actions at a glance.',
|
||||
@@ -1490,6 +1492,11 @@ export default {
|
||||
copyPassword: 'Copy password',
|
||||
creating: 'Creating...',
|
||||
updating: 'Updating...',
|
||||
form: {
|
||||
rpmLimit: 'Requests Per Minute (RPM)',
|
||||
rpmLimitPlaceholder: '0 = unlimited',
|
||||
rpmLimitHint: 'Max requests per minute for this user; 0 = unlimited. Acts as a fallback only when the group has no rpm_limit set.'
|
||||
},
|
||||
columns: {
|
||||
user: 'User',
|
||||
id: 'ID',
|
||||
@@ -1704,6 +1711,10 @@ export default {
|
||||
name: 'Name',
|
||||
platform: 'Platform',
|
||||
rateMultiplier: 'Rate Multiplier',
|
||||
rpmOverride: 'RPM Override',
|
||||
rpmOverrideHint: 'Per-user RPM cap in this group; empty = group default; 0 = unlimited',
|
||||
rateDefault: 'default',
|
||||
rpmDefault: 'default',
|
||||
type: 'Type',
|
||||
accounts: 'Accounts',
|
||||
capacity: 'Capacity',
|
||||
@@ -1730,7 +1741,10 @@ export default {
|
||||
platform: 'Platform',
|
||||
rateMultiplier: 'Rate Multiplier',
|
||||
status: 'Status',
|
||||
exclusive: 'Exclusive Group'
|
||||
exclusive: 'Exclusive Group',
|
||||
rpmLimit: 'Requests Per Minute (RPM)',
|
||||
rpmLimitPlaceholder: '0 = unlimited',
|
||||
rpmLimitHint: 'Max requests per minute for each user in this group; 0 = unlimited. Once set, it takes over per-user rate limiting in this group (overrides the user-level rpm_limit fallback).'
|
||||
},
|
||||
enterGroupName: 'Enter group name',
|
||||
optionalDescription: 'Optional description',
|
||||
@@ -1762,6 +1776,12 @@ export default {
|
||||
rateMultipliers: 'Rate Multipliers',
|
||||
rateMultipliersTitle: 'Group Rate Multipliers',
|
||||
addUserRate: 'Add User Rate Multiplier',
|
||||
rpmOverrides: 'RPM Overrides',
|
||||
rpmOverridesTitle: 'Group RPM Overrides',
|
||||
addUserRpm: 'Add User RPM Override',
|
||||
noRpmOverrides: 'No users have an RPM override yet',
|
||||
rpmSaved: 'RPM overrides saved',
|
||||
groupRpmDefault: 'Group default RPM',
|
||||
searchUserPlaceholder: 'Search user email...',
|
||||
noRateMultipliers: 'No user rate multipliers configured',
|
||||
rateUpdated: 'Rate multiplier updated',
|
||||
@@ -4503,6 +4523,8 @@ export default {
|
||||
defaultBalanceHint: 'Initial balance for new users',
|
||||
defaultConcurrency: 'Default Concurrency',
|
||||
defaultConcurrencyHint: 'Maximum concurrent requests for new users',
|
||||
defaultUserRpmLimit: 'Default User RPM Limit',
|
||||
defaultUserRpmLimitHint: 'Default max requests per minute for new users; 0 = unlimited. Only applied at new user creation.',
|
||||
defaultSubscriptions: 'Default Subscriptions',
|
||||
defaultSubscriptionsHint: 'Auto-assign these subscriptions when a new user is created or registered',
|
||||
addDefaultSubscription: 'Add Default Subscription',
|
||||
|
||||
Reference in New Issue
Block a user