SWE · System Design

Gemini Android App设计:会话流、离线草稿与生命周期

从移动端会话状态和流式响应切入,逐层回答架构追问。

题目重点:从移动端会话状态和流式响应切入,逐层回答架构追问。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 可辨方向为Gemini Android App;训练限定文本聊天、历史、流式输出和取消,语音/图像作为条件扩展。
  • 不假定Google内部架构、私有API、模型规模或SLA。端上只管理UI/缓存,模型推理由服务器提供。

解题路线

  1. 分层UI→会话状态→Repository→本地DB/网络。conversation/message/clientRequestID形成持久身份,消息状态draft/sending/streaming/complete/failed,用reducer处理事件,旋转屏幕不重发。
  2. 流事件携带messageID和递增sequence,去重并检测缺口;断网后查询服务器最终状态或从可恢复cursor续流,不把已经显示的局部文本当最终答复。取消是服务请求和本地UI两步,迟到事件以generationID过滤。
  3. 离线可存草稿/待发意图,恢复后逐条幂等发送。历史分页与本地缓存一致性依版本,不在UI直接共享可变network对象。敏感会话缓存保留、账户切换清理和权限按产品规则定义。

手动走一遍

用户发送后立刻旋转屏幕,View重新订阅同message状态,服务器只收到一个clientRequestID。stream到seq10断开,重连收到seq8..12,8..10去重;若不支持续传则刷新权威消息而不是拼接重复文本。

规模与取舍

训练示例流token速率R、会话总tokenN,逐token全量字符串重拷会累计二次成本,应分块缓冲/节流绘制。移动内存只保留当前窗口,历史落DB分页。

易错点与追问

容易失分的边界

  • Activity重新创建不是新请求身份。
  • 无限后台重试耗电且可能重复计费,退避/联网条件/幂等都需定义。

继续深挖

  • 图片上传断点续传和文本消息事务怎样关联?
  • 后台进程被杀后如何恢复一个未完成会话而不再次付费?
✓已复制微信号!