b8425cc059
Co-authored-by: Cursor <cursoragent@cursor.com>
37 lines
1.1 KiB
Markdown
37 lines
1.1 KiB
Markdown
# 服务器列表实时字段排序设计
|
||
|
||
**日期**: 2026-06-08
|
||
|
||
## 背景
|
||
|
||
`GET /api/servers/` 在 MySQL 层 `ORDER BY` 后分页,再用 Redis heartbeat 覆盖 `is_online`、`last_heartbeat`、`agent_version`、`status`。展示值与排序键不一致,导致状态/心跳/Agent 列排序无效。
|
||
|
||
## 目标
|
||
|
||
对 `sort_by ∈ {status, heartbeat, agent_version}`:overlay 全量筛选结果后内存排序,再分页返回。
|
||
|
||
## 方案
|
||
|
||
1. `server_repo.get_filtered()` 拉取筛选后全量(上限 5000)
|
||
2. Redis pipeline 批量 `HGETALL heartbeat:{id}`
|
||
3. `server_list_sort.sort_server_items()` 按 UI 语义排序
|
||
4. `slice[offset:offset+per_page]`
|
||
|
||
静态列(name/domain/category/target_path/id)仍 DB 排序。
|
||
|
||
## 排序语义
|
||
|
||
| 字段 | 键 |
|
||
|------|-----|
|
||
| status | online(0) → offline(1) → unknown(2),tiebreaker name |
|
||
| heartbeat | ISO 时间;缺失置后(升序/降序均置后) |
|
||
| agent_version | 字符串;空置后 |
|
||
|
||
## 性能
|
||
|
||
≤5000 台 × 一次 pipeline + 内存 sort;运维列表低频可接受。
|
||
|
||
## 验收
|
||
|
||
见 `docs/changelog/2026-06-08-servers-live-sort-fix.md`
|