IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

面试题 – 为什么我的朋友圈不见了?

Tim[后端技术] 2014-12-28 23:42:59 累计浏览 11,952 次
本机暂存

   有如下一个场景,某个服务需要构建一个列表数据返回给调用方(调用方通常是客户端),服务本身是一个数据聚合器,它由内部多个远程服务的数据聚合而生成。在正常情况下,需要将所有内部服务的结果全获取成功后再返回。但是在一个大系统中,多个服务中某个服务出现不稳定的概率会比较大,当出现如图远程服务3不可用的时候,有3种不同的解决思路。

   list1

   方案1:忽略出错的数据(图中数据3),直接返回数据1、2、4。

   方案2:遇到任意失败,整个请求返回错误503 service unavailable。

   方案3:忽略出错的数据(图中数据3),并告知调用方出错的范围,需要自定义的返回格式。如 {“load_date3_success”: false}

   如果你作为一个架构师,会选择哪种方案?

   方案一类似架构设计里面常说的优雅降级,在出现问题情况下,除了数据3之外,其它数据可以正常返回,原理上可以将损失降低到最低。但会给用户体验带来一定伤害,并且用户在使用系统时候会存在不确定性的心理。

   方案二比较依赖调用方的容错逻辑,如果调用方存在上一次缓存且容错处理得当,用户表面会感受不到这个异常,否则将会返回白页(最坏结果)。即使调用方有容错逻辑,但由于正常的数据不能及时返回,从工程师到用户可能不太容易接受这个结果。

   方案三是一个看起来相对合理的方案,但是需要添加自定义的字段,本来这是一个标准的LIST返回,但是需要额外添加一些错误字段如 {“load_date3_success”: false}来标识哪些数据返回失败了。同时在调用方也需要实现缓存及容错逻辑。这个方案从服务方到调用方的熵都增加了很多。

   在大部分应用中,对于数据列表访问同时还存在未读数的功能,如下图中的小红点数字。如果这个未读数由另外一个API提供(假设这个API功能是正常的),情况就更复杂。如果不提供单独的未读数API,客户端则通常每次需要加载全量新数据才能算出未读数,即使在用户不展开列表的情况下,这样会带来访问速度的下降及客户端更多数据流量的消耗。因此大多数情况提供一个未读数API整体开销会更低。

   list2

   这时候如果未读数都出来了,远程数据又取不到的情况下,你作为架构师,会选择何种方案?

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. 15个最好的免费开源电子商务平台 (累计阅读 12,541)
  2. 好的API设计 (累计阅读 12,395)
  3. Twitter/微博客的学习摘要 (累计阅读 12,259)
  4. Facebook 网站架构 (累计阅读 11,112)
  5. Zookeeper研究和应用 (累计阅读 9,481)
  6. 分布式哈希和一致性哈希 (累计阅读 8,813)
  7. Feed架构-我们做错了什么 (累计阅读 8,732)
  8. 面试IT业界顶尖企业所应该知道的10道题(1) (累计阅读 8,525)
  9. 架构师给程序员的一封信 (累计阅读 7,986)
  10. Java技术路线 (累计阅读 7,725)