Skip to content

[Channels] 消除列表逐条查询 status 的 N+1 请求 #3643

Description

@AbigailDeng

Channels 列表为每条记录单独请求 /status,导致请求数量随列表长度线性增长。用户提供的 2026-09-16 线上 Network 截图中,10 条记录对应 12 次相关数据请求。希望确认并提供适合列表使用的批量状态来源,配合前端消除逐行状态查询。

现象与复现方式

  1. 使用有多个 Channel 的账号打开 Aevatar Console → Channels。
  2. 在浏览器 Network 中观察首次加载,或点击页面的 Refresh。
  3. 10 条记录时,当前请求组成如下:
请求 次数 用途
GET /api/channels/registrations 1 注册信息、Skill、Workflow delivery 等
GET /api/channels/registrations/{id}/status 10 每条记录的 Inbound 状态
GET /api/v1/channel-bots(NyxID) 1 批量获取 Channel name

这是每次列表加载/手动刷新的逐行请求模式;当前代码关闭了定时轮询。记录增多时,浏览器请求和后端到 NyxID 的逐条查询也会增加。本 issue 依据用户线上截图及源码核对,未做额外线上压力测试。

已确认的原因

  • 前端每个 ConnectedRow 都调用 useChannelStatus(scopeId, registration.id),用结果渲染 Inbound。
  • GET /registrations 返回 workflow_result_delivery_status,但没有 NyxID bot 的 Inbound status
  • 后端单条 /status 先查询 registration,再调用 nyxClient.GetChannelBotAsync(...) 获取状态;Workflow delivery 也在这个响应中重复返回。
  • 页面已经调用 NyxID 的 channel-bots 批量接口,但当前前端解码器只读取 id / platform / label尚未确认该批量接口是否返回与单条查询同语义、可直接复用的 status。

源码定位:

建议确认的方案

优先确认现有 NyxID channel-bots 批量列表能否提供所需状态。如果已支持,前端按 registration 的 nyx_channel_bot_id 与 bot id 精确匹配,一次获取名称和 Inbound 状态;Workflow delivery 直接使用 registration 列表字段。

如果该接口不支持,评估补充列表状态摘要或批量状态查询契约。需要同时考虑 NyxID 上游调用量,避免只是将逐条请求移到后端;若采用状态快照,应明确新鲜度语义。

验收预期

  • 首次加载和手动 Refresh 不再默认对每条记录发起单独 /status 请求;请求按列表/批次组织。
  • 保持名称、Skill、Inbound 和 Workflow delivery 的正确展示,不混淆 bot ID 与 registration ID。
  • 状态缺失或查询失败仍诚实展示 Unknown,不默认判定 Active;保持当前账号的数据边界。
  • 单条详情按需查询可以保留;验证时记录浏览器请求数及后端到 NyxID 的调用数。

关联:#3617

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions