Skip to content

✨ feat(message-queue): Kafka 列表只取元数据,详情按需加载 payload - #1570

Merged
Syngnat merged 1 commit into
Syngnat:devfrom
AutumnNazi:dev-message-queue-fixes
Oct 22, 2026
Merged

Syngnat merged 1 commit into
Syngnat:devfrom
AutumnNazi:dev-message-queue-fixes

Conversation

@AutumnNazi

Copy link
Copy Markdown
Collaborator

背景

Kafka 单条消息可达十几 MB(实测 15,505,118 字节)。此前列表预览会把 payload 连同
flattenKafkaMap 展开出来的 value.xxx 列一起塞进每一行,单行 JSON 接近 30 MB,
直接顶满驱动代理 32 MiB 的单帧上限:

  • 预览流中途中断——topic 明明有很多消息,列表却只出几条;
  • 详情面板对十几 MB 内容做 JSON.parse + 缩进美化,界面卡死。

另外发现两处放大问题:conn.ReadMessage 内部是「每次新发一次 fetch,只取第一条,
丢弃批内其余消息」,等于一条一个网络来回;预览的 1500 ms 又是整个拉取的硬超时,
大消息读两三条就被截断。

变更点

驱动(kafka 专属)

  • SELECT 支持列投影;WHERE partition = ? AND offset = ? 精确定位单条;新增
    FetchMessageAt 按定位读取;大 payload 不再展开成 value.xxx 列
  • 预览读取改为按批消费(ReadBatch 读完批内消息),单次 fetch 上限 1 MiB → 16 MiB
  • 预览读取改为空闲超时:每读一条重置窗口,ctx 30 秒仍是硬上限

客户端(不参与 agent 指纹)

  • 收到「单帧超限」失败帧时不再终止 transport:一条超大消息不再让整个连接永久不可用;
    单帧上限维持 32 MiB 不变

前端

  • Kafka 预览命令改为 SELECT timestamp, partition, offset, key, value_size
  • 点击消息即按 partition+offset 拉取完整内容并缓存;「跟随最新消息」自动选中的那条同样触发加载
  • 详情加载失败会给出错误提示,不再静默留白
  • 超过 512 KB 的详情跳过 JSON 美化;列表卡片合并为单行展示 topic · #offset · 大小
  • 详情头部时间并入右侧;加载态改骨架屏并显示消息大小,加载完成无布局跳动

i18n:补充加载/失败文案(6 个语言),同步 catalog.zip。

影响范围

  • 列表帧从「每行十几 MB」降到几十字节,展示条数不再受单帧上限影响
  • 详情按需拉取,单条消息(含十几 MB payload)仍在 32 MiB 之内
  • 其余 25 个驱动行为与指纹均不变(改动全部落在 kafka 专属文件与客户端侧)
  • 预览不再使用 consumer group(预览本就不该提交消费进度),仍保留其格式校验

验证

gofmt -l  → 无输出
go vet -tags gonavi_kafka_driver ./internal/db/  → 通过
go build -tags gonavi_kafka_driver ./internal/db/ ./cmd/optional-driver-agent/  → 通过
go test -tags gonavi_kafka_driver ./internal/db -run "TestKafka|TestParseKafkaSQL|TestOptionalDriverAgent"  → ok
go test ./cmd/optional-driver-agent/...  → ok
tsc --noEmit  → 通过
vitest run MessageQueueWorkbench + messageQueue  → 34 passed
i18n 六语言键数一致  → 12837

新增用例覆盖:列投影与定位解析、投影模式丢弃 payload、超大 payload 不展开、
详情命令构造、卡片摘要回退、字节大小格式化。

指纹表相对 origin/dev 只差 kafka 一行(src-11e403fa66ffcdb4),其余 25 个驱动不变。

需要重建 agent

改动包含 agent 侧逻辑,kafka 指纹已更新。重启 GoNavi 后首次连接 Kafka 会自动重建 agent;
其它驱动的 agent 不受影响。

@github-actions

github-actions Bot commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

变更概览

  • 变更规模:24 个文件,+661 / -84(大型变更)
  • 测试行占比:37%(测试 +226 / 源码 +377)
  • 规约扫描覆盖:65%(逐行扫描 435 / 新增 661,测试与生成文件只做文件级检查)
  • 规约命中:需要处理 0 · 建议 1
  • i18n 同步:100%(6/6 语言已更新)

建议

  • frontend/src/components/messageQueue/MessageQueueStreamPane.tsx:界面文案请走 shared/i18n 的 t(),不要在组件里写死中文。

模型评审

模型评审本次不可用:groq: 模型接口返回 HTTP 413

CI 门禁

  • CI Gate:已跳过
    • Frontend clean build:已跳过
    • Full backend suite:进行中
    • Platform-sensitive tests (${{ matrix.os }}):已跳过
    • Platform-sensitive tests (macos-latest):进行中
    • Platform-sensitive tests (windows-latest):进行中
    • Plugin and marketplace contract tests:进行中

门禁未通过。

规约意见不会代替 CI 门禁。这条评论会在后续推送和测试完成后更新。

单条 Kafka 消息可达十几 MB(实测 15,505,118 字节)。此前列表预览会把 payload 连同
flatten 出来的 value.xxx 列一起塞进每一行,单行 JSON 接近 30 MB,直接顶满驱动代理
32 MiB 的单帧上限:预览流中途中断,详情面板对十几 MB 内容做 JSON 美化还会卡死界面。

改为「列表取元数据、详情按需拉取」:

- 驱动(kafka 专属):SELECT 支持列投影,WHERE partition = ? AND offset = ? 精确定位
  单条;新增 FetchMessageAt 按定位读取;大 payload 不再展开成 value.xxx 列
- 驱动(kafka 专属):预览读取改为按批消费。conn.ReadMessage 内部是
  「ReadBatch(1, maxBytes) → 只取第一条 → Close 丢弃批内其余消息」,等于一条一个网络
  来回还白扔同批数据;改为一次 fetch 读完批内消息,单次 fetch 上限 1 MiB → 16 MiB
- 驱动(kafka 专属):预览读取改为空闲超时。原来 1500 ms 是整个拉取的硬超时,大消息
  读两三条就中断,表现为「topic 明明有很多消息却只列出几条」
- 客户端(不参与指纹):收到「单帧超限」失败帧时不再终止 transport,一条超大消息不再
  让整个连接永久不可用;单帧上限维持 32 MiB 不变
- 前端:Kafka 预览命令改为 SELECT timestamp, partition, offset, key, value_size;
  点击消息即按 partition+offset 拉取完整内容并缓存,无需再点按钮
- 前端:「跟随最新消息」自动选中的那条也会触发按需加载,不再停在「点按钮加载」状态
- 前端:详情加载失败会给出错误提示,不再静默留白
- 前端:超过 512 KB 的详情跳过 JSON 美化;列表卡片合并为单行,展示 topic · #offset · 大小
- 前端:详情头部把时间并到右侧与复制按钮同排;加载态改为骨架屏并显示消息大小,
  加载完成时不再有布局跳动
- i18n:补充加载/失败文案(6 个语言),同步翻译压缩包

改动全部落在 kafka 专属文件与客户端侧,其余 25 个驱动的 agent 指纹保持不变,
只有 kafka 需要重建 agent(src-11e403fa66ffcdb4)。
@AutumnNazi
AutumnNazi force-pushed the dev-message-queue-fixes branch from 52764a9 to 85bbd8c Compare October 22, 2026 01:17
@Syngnat
Syngnat merged commit 06c184d into Syngnat:dev Oct 22, 2026
18 of 24 checks passed
Syngnat added a commit that referenced this pull request Oct 23, 2026
## 发布目标

- 正式版本:v1.1.5
- 发布来源:dev 当前已合并代码 `a788abe67`(API Route 供应商预设)
- 上一正式版本:v1.1.4

## 本次准备

- 将 Wails 产品版本(`wails.json`)及 npm CLI
包版本(`npm/gonavi-cli/package.json`)对齐到 1.1.5。
- 同步版本契约测试断言,保持正式 tag 与 npm 包版本严格一致。
- 本 PR 收口 v1.1.4 之后 dev 的 145 个已合并提交,不含任何本地未提交工作。
- `main` 当前无 `dev` 之外的新提交,合入为 fast-forward 语义的常规合并。

## 主要变更

**新功能**

- 新增 XXL-JOB 任务调度中心工作台(#1576)
- 落地可独立开发、分发、安装、运行的开放插件体系(#1562),插件入口提级为设置中心顶层入口
- 新增 Cheaper Inference(#1547)、API Route(#1580)AI 供应商预设
- AI 聊天模型菜单改为供应商子菜单并加入推理滑块(#1552)
- Nacos 配置编辑器支持 JSON 解析器(#1548)
- 字体画廊:与选择器一致的单选框布局并支持选中即预览、打开面板即拉取远程目录、下载字体可设为界面/代码字体、推荐名单扩充并默认展开
- Kafka 列表只取元数据,详情按需加载 payload(#1570)

**问题修复**

- 查询编辑器:输入时光标逐步右偏(#1579)、自动补全后重复输入右括号(#1553)、过程定义与批量执行误切库(#1545)
- 数据同步:Oracle 迁移字符长度语义丢失(#1544)
- 驱动代理:超大响应只让当前请求失败,不再终止连接(#1578)
- 消息队列:Kafka 预览截断、详情加载与发布不可用(#1577)
- 数据源:MongoDB SSH 隧道因 channel 不支持 deadline 一直超时(#1555)、Chroma 部分版本 v2 无
databases 列表端点(#1557)
- 表概览:MongoDB / 消息队列 / Redis 回落 `information_schema`、向量库与时序库表名列表路径(#1556
/ #1558 / #1559)
- 数据库加载失败后的重试(#1563);内置 AI 刷新响应丢失导致强制重新登录(#1571)
- Kingbase 维护库报错自助引导、调度作业源探测改为验证关系可解析;XXL-JOB 描述表补全 agent 声明;无 agent
的数据源描述视为合法

**界面与体验**

- 统一顶栏样式联动设置(#1575)、工具栏横向滚动条自动隐藏(#1561)、连接树滚动条悬停显示(#1550)
- 信息面板开关移到状态栏左下角(#1546);只读与可编辑结果集统一双击查看判定(#1543)
- 收窄工作台页签样式作用域,修复设置中心嵌套页签布局

## 验证

- 来源 dev 提交(`a788abe6`)的 Backend Tests 已成功;Dev Build 与 Docker Images
在其上运行中/已通过上一提交。
- 本地 7 组发版合同测试中 5 组共 38
项通过:`validate-npm-cli-package-version`、`legal-release-assets`、`generate-update-latest-manifest`、`generate-release-notes`、`validate-gui-update-manifest`、`download-mirror-config`。
- `cli-release-assets.test.py` 本机固定 2
项失败(`test_checksum_generation_keeps_cli_staging_separate`、`test_release_workflow_bash_blocks_are_syntax_checked`),原因与
v1.1.4 发版时一致:Windows 下子进程输出按 UTF-8 解码失败,与版本号无关,CI 在 Linux 上通过。
- 本次版本号提交 `git diff --check` 通过;`v1.1.4..HEAD`
区间的空白告警均来自既有生成文件(`wailsjs/go/models.ts`、`star-history.yml`、`sdk/typescript/src/index.ts`),非本
PR 引入。

## 发布计划

- 校验并合并到 main 后,在该合并提交创建不可变 v1.1.5 tag。
- 跟踪 Release 与 Publish Draft Release 工作流,验收正式资产、Latest、更新清单及下载镜像。
- 发布结束后将 main 同步回 dev。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants