4.9 KiB
4.9 KiB
设备优先前缀配置说明
功能概述
设备优先前缀配置允许管理员指定在空闲设备选择时的优先级规则,优先选择特定前缀的设备,实现更灵活的设备分配策略。
配置项
配置键: device.priority_prefixes
配置类型: STRING
默认值: 空字符串(全随机)
格式: 逗号分隔的前缀列表
使用方法
1. 配置优先前缀
通过系统配置接口设置 device.priority_prefixes 的值。
示例配置值:
xx,yy,zz
这表示:
- 第1优先级:
xx开头的设备 - 第2优先级:
yy开头的设备 - 第3优先级:
zz开头的设备 - 最低优先级:其他所有设备
2. 选择逻辑
设备分配时会按照以下逻辑进行:
- 过滤占用设备:排除被其他任务占用的设备
- 按前缀分组:根据配置的前缀将设备分成不同优先级组
- 组内随机:每个优先级组内的设备随机打乱
- 顺序尝试:按优先级从高到低依次尝试分配,直到成功
特点:
- ✅ 优先使用指定前缀的设备
- ✅ 同优先级内随机选择,避免总是选中同一台设备
- ✅ 实现负载均衡和优先级控制的平衡
- ✅ 支持冷却机制和并发安全
3. 示例场景
场景1:无配置(默认行为)
device.priority_prefixes = ""
效果:所有设备完全随机选择,与原有逻辑一致
场景2:优先使用xx设备
device.priority_prefixes = "xx"
假设可用设备:xx1, xx2, yy1, yy2, zz1
选择顺序:
- 优先在
xx1, xx2中随机选择 - 如果 xx 设备都在冷却期或被占用,再从
yy1, yy2, zz1中随机选择
场景3:多级优先级
device.priority_prefixes = "xx,yy"
假设可用设备:xx1, xx2, yy1, yy2, zz1, zz2
选择顺序:
- 第1优先级:在
xx1, xx2中随机选择 - 第2优先级:如果 xx 都不可用,在
yy1, yy2中随机选择 - 第3优先级:如果 xx、yy 都不可用,在
zz1, zz2中随机选择
API使用示例
查询当前配置
GET /api/admin/config/key/device.priority_prefixes
更新配置
PUT /api/admin/config
{
"configKey": "device.priority_prefixes",
"configValue": "xx,yy,zz",
"configType": "STRING",
"description": "设备选择优先前缀(逗号分隔)"
}
批量更新(推荐)
PUT /api/admin/config/batch
[
{
"configKey": "device.priority_prefixes",
"configValue": "xx,yy"
}
]
日志输出
启用该功能后,日志中会输出相关信息:
[INFO] 使用设备优先前缀配置:[xx, yy]
[DEBUG] 优先级0(前缀=xx):2 台设备
[DEBUG] 优先级1(前缀=yy):3 台设备
[DEBUG] 无优先级设备:5 台
[INFO] 设备列表已按优先级排序并随机化:[xx2, xx1, yy3, yy1, yy2, zz1, aa1, bb1, cc1, dd1]
[INFO] 设备分配成功:设备=xx2, 任务ID=123, 原因=首次选区
注意事项
- 前缀匹配:使用
startsWith()进行前缀匹配,例如配置xx会匹配xx1、xx2、xxabc等 - 大小写敏感:前缀匹配区分大小写
- 空格处理:配置值会自动去除前后空格,
"xx, yy"会被处理为["xx", "yy"] - 空配置:如果配置为空或不存在,系统会退化到原有的完全随机选择逻辑
- 优先级顺序:前缀在配置字符串中的顺序决定优先级,越靠前优先级越高
- 实时生效:配置修改后立即生效,无需重启服务
数据库迁移
执行以下 SQL 脚本添加配置项:
-- 位置: db_migration_device_priority_prefixes.sql
INSERT INTO system_config (config_key, config_value, config_type, description, is_system, created_at, updated_at)
VALUES (
'device.priority_prefixes',
'',
'STRING',
'设备选择优先前缀(逗号分隔),例如:xx,yy,zz。优先选择匹配前缀的设备,同优先级内随机。为空则全随机',
1,
NOW(3),
NOW(3)
)
ON DUPLICATE KEY UPDATE
config_type = 'STRING',
description = '设备选择优先前缀(逗号分隔),例如:xx,yy,zz。优先选择匹配前缀的设备,同优先级内随机。为空则全随机',
updated_at = NOW(3);
相关代码
- 配置服务:
SystemConfigService.getDevicePriorityPrefixes() - 分配服务:
DeviceAllocationService.allocateDevice() - 排序逻辑:
DeviceAllocationService.sortByPrefixPriority()
测试建议
- 无配置测试:不配置前缀,验证随机选择是否正常
- 单前缀测试:配置单个前缀,验证是否优先选择该前缀设备
- 多前缀测试:配置多个前缀,验证优先级顺序是否正确
- 负载均衡测试:多次分配,验证同优先级内是否随机分布
- 冷却期测试:验证高优先级设备在冷却期时,能否正确选择低优先级设备