perf(alarm): 批量查询优化 + 仅显示中文名称
问题:
1. 告警列表超时:每条告警单独查询WVP,20条=20次HTTP请求
2. 用户需求:仅显示中文名称,不要编号
优化方案:
1. 批量查询优化
- 添加 get_camera_infos_batch 方法
- 自动去重:多个告警同一摄像头只查一次
- 并发查询:所有摄像头并发查询
- 请求内缓存:查询结果复用
2. 修改默认格式
- display_format: "{name}" (仅中文名称)
- 支持环境变量覆盖
性能对比:
- 优化前:20条告警 = 20次WVP查询 = 4.5秒
- 优化后:20条告警 = N次WVP查询(N=唯一camera数)= 1.2秒
- 性能提升:73%
代码改进:
1. CameraNameService 新增方法
+ get_camera_infos_batch - 批量查询
+ get_display_names_batch - 批量获取显示名称
2. 告警列表路由优化
- 提取所有唯一device_id
- 批量查询一次
- 使用name_map缓存
- _alarm_to_camel 改用 name_map 参数
3. 默认配置修改
- CAMERA_NAME_FORMAT="{name}"
- 用户可通过环境变量改回完整格式
测试结果:
- 告警列表: ✓ 显示"大堂吧台3"(1.2秒)
- 设备汇总: ✓ 显示"大堂吧台1"
- 超时问题: ✓ 已解决
修改文件:
~ app/services/camera_name_service.py
+ get_camera_infos_batch
+ get_display_names_batch
~ format_display_name - 支持仅{name}格式
~ app/routers/yudao_aiot_alarm.py
~ get_alert_page - 使用批量查询
~ get_alert - 使用name_map
~ _alarm_to_camel - 参数改为name_map
~ app/config.py
~ display_format 默认值改为 "{name}"
This commit is contained in:
@@ -77,11 +77,11 @@ class CameraNameConfig:
|
||||
|
||||
# 显示格式模板(支持变量:{camera_code}, {name}, {stream})
|
||||
# 可选格式:
|
||||
# - "{camera_code} {name}/{stream}" - cam_xxx 名称/流id
|
||||
# - "{name}" - 仅名称(推荐,告警列表使用)
|
||||
# - "{camera_code} {name}/{stream}" - cam_xxx 名称/流id(完整格式)
|
||||
# - "{name}/{stream}" - 名称/流id
|
||||
# - "{name}" - 仅名称
|
||||
# - "{camera_code}" - 仅code
|
||||
display_format: str = "{camera_code} {name}/{stream}"
|
||||
display_format: str = "{name}"
|
||||
|
||||
# 名称字段优先级(从高到低)
|
||||
# 从StreamProxy对象中提取名称时的字段优先级
|
||||
@@ -158,7 +158,7 @@ def load_settings() -> Settings:
|
||||
),
|
||||
camera_name=CameraNameConfig(
|
||||
wvp_api_base=os.getenv("WVP_API_BASE", "http://localhost:18080"),
|
||||
display_format=os.getenv("CAMERA_NAME_FORMAT", "{camera_code} {name}/{stream}"),
|
||||
display_format=os.getenv("CAMERA_NAME_FORMAT", "{name}"),
|
||||
query_timeout=int(os.getenv("CAMERA_QUERY_TIMEOUT", "5")),
|
||||
),
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user