Files
game_server/docs/设备优先前缀配置说明.md

4.9 KiB
Raw Permalink Blame History

设备优先前缀配置说明

功能概述

设备优先前缀配置允许管理员指定在空闲设备选择时的优先级规则,优先选择特定前缀的设备,实现更灵活的设备分配策略。

配置项

配置键: device.priority_prefixes
配置类型: STRING
默认值: 空字符串(全随机)
格式: 逗号分隔的前缀列表

使用方法

1. 配置优先前缀

通过系统配置接口设置 device.priority_prefixes 的值。

示例配置值:

xx,yy,zz

这表示:

  • 第1优先级xx 开头的设备
  • 第2优先级yy 开头的设备
  • 第3优先级zz 开头的设备
  • 最低优先级:其他所有设备

2. 选择逻辑

设备分配时会按照以下逻辑进行:

  1. 过滤占用设备:排除被其他任务占用的设备
  2. 按前缀分组:根据配置的前缀将设备分成不同优先级组
  3. 组内随机:每个优先级组内的设备随机打乱
  4. 顺序尝试:按优先级从高到低依次尝试分配,直到成功

特点

  • 优先使用指定前缀的设备
  • 同优先级内随机选择,避免总是选中同一台设备
  • 实现负载均衡和优先级控制的平衡
  • 支持冷却机制和并发安全

3. 示例场景

场景1无配置默认行为

device.priority_prefixes = ""

效果:所有设备完全随机选择,与原有逻辑一致

场景2优先使用xx设备

device.priority_prefixes = "xx"

假设可用设备xx1, xx2, yy1, yy2, zz1

选择顺序

  1. 优先在 xx1, xx2 中随机选择
  2. 如果 xx 设备都在冷却期或被占用,再从 yy1, yy2, zz1 中随机选择

场景3多级优先级

device.priority_prefixes = "xx,yy"

假设可用设备xx1, xx2, yy1, yy2, zz1, zz2

选择顺序

  1. 第1优先级xx1, xx2 中随机选择
  2. 第2优先级如果 xx 都不可用,在 yy1, yy2 中随机选择
  3. 第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前缀=xx2 台设备
[DEBUG] 优先级1前缀=yy3 台设备
[DEBUG] 无优先级设备5 台
[INFO] 设备列表已按优先级排序并随机化:[xx2, xx1, yy3, yy1, yy2, zz1, aa1, bb1, cc1, dd1]
[INFO] 设备分配成功:设备=xx2, 任务ID=123, 原因=首次选区

注意事项

  1. 前缀匹配:使用 startsWith() 进行前缀匹配,例如配置 xx 会匹配 xx1xx2xxabc
  2. 大小写敏感:前缀匹配区分大小写
  3. 空格处理:配置值会自动去除前后空格,"xx, yy" 会被处理为 ["xx", "yy"]
  4. 空配置:如果配置为空或不存在,系统会退化到原有的完全随机选择逻辑
  5. 优先级顺序:前缀在配置字符串中的顺序决定优先级,越靠前优先级越高
  6. 实时生效:配置修改后立即生效,无需重启服务

数据库迁移

执行以下 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()

测试建议

  1. 无配置测试:不配置前缀,验证随机选择是否正常
  2. 单前缀测试:配置单个前缀,验证是否优先选择该前缀设备
  3. 多前缀测试:配置多个前缀,验证优先级顺序是否正确
  4. 负载均衡测试:多次分配,验证同优先级内是否随机分布
  5. 冷却期测试:验证高优先级设备在冷却期时,能否正确选择低优先级设备