跳到正文

面试追问 ​

状态:未准备;以下为答题提纲,完整口述见现有面经。本人贡献确认后再使用第一人称。

1. 为什么要支持 channel 与 Kafka 两种模式? ​

  • 我的方案:入口不同,公共 dispatcher 复用业务分发。
  • 选择理由:单机简单部署,多实例时可使用 Kafka 解耦;减少业务逻辑重复。
  • 替代方案与适用边界:强制 Kafka 运维成本更高;channel 无法替代持久队列。
  • 实际结果与证据:两种模式相同行为待运行验证,不能只凭接口抽象推断结果。
  • 关联代码:相对源码根目录的 internal/service/chat/dispatch.go、server.go、kafka_server.go。
  • 后续追问:落库失败会怎样?消息重复怎么办?Kafka 保证的是哪一段顺序?

2. 收件人在另一实例时怎么投递? ​

  • 我的方案:查询 Redis 在线路由,通过节点消息总线转发到连接所属实例。
  • 选择理由:避免让每个节点处理所有收件人推送。
  • 替代方案与适用边界:广播实现简单但开销更高;Pub/Sub 断开不能保留所有事件。
  • 实际结果与证据:双实例跨节点消息、重连和节点退出实验待执行。
  • 关联代码:internal/service/chat/cluster_bridge.go、internal/service/cluster/registry.go。
  • 后续追问:为什么清理要比对所有权?路由 TTL 过期怎么办?Redis 断开会丢哪类消息?

3. Agent 工具如何避免越权? ​

  • 我的方案:后端确定身份和会话范围,模型只提供业务参数;服务端查询按授权范围执行。
  • 选择理由:模型输出不能作为身份或权限依据。
  • 替代方案与适用边界:仅在提示词中要求不越权不足以保障授权;群成员资格还需上游独立检查。
  • 实际结果与证据:伪造用户 / 群组参数的负向用例待运行。
  • 关联代码:internal/agent/tools.go、internal/agent/service.go、internal/middleware/auth.go。
  • 后续追问:上下文如何裁剪?工具超时怎么处理?Mock 与真实模型分别验证什么?

4. 如何证明全栈而非只调接口? ​

  • 我的方案:选择本人完成的一条业务链,从页面操作讲到身份、服务端业务、数据库 / 缓存、事件返回和状态更新。
  • 选择理由:同一用例能展示前后端边界和失败处理。
  • 替代方案与适用边界:只罗列页面和接口数量不能证明理解业务链路。
  • 实际结果与证据:待选真实改动并补请求、日志、数据记录和截图。
  • 关联代码:frontend/src/api/axios.ts、frontend/src/stores/useChatStore.ts、internal/service/chat/dispatch.go。
  • 后续追问:未认证怎么跳转?发送者为什么依赖服务端回显?缓存失败时页面看到什么?

理解机制,讲清取舍,用复盘检验掌握。