服务端开发错了,客户端就应该错着适配

9 小时 53 分钟前
 mouyase

前情提要

我们的产品今日在开发环境暴露出一个风险,某些数据取值取不到了导致产品崩溃。

排查了半天数据和逻辑之后,发现是因为某个接口返回的数据新加了一种类型,但是这种类型的定义和之前的另一种类型是相同的,导致代码合并后,有的数据处理认为是之前的类型,有的认为是之后的类型,导致某些判断分支没有达成,最后导致数据没有正确解析。

问题简述

我们排查了问题之后,理了一下现在的逻辑。

假设我们之前的数据有 A ,B ,C 三种类型,然后根据数据的 type 字段等于 A ,B ,C 来判断数据类型,再根据类型去做相应的数据解析和操作。

但是现在服务端只在某些接口中,把 C 类型给区分成了 C 类型和 D 类型。C 类型的 type 字段是 C ,D 类型的 type 字段是 D 。但是现在的 D 类型的数值是我们之前客户端用的 C 类型,现在的 C 类型则是之前我们客户端会过滤掉的一种数据。老的接口中依旧只有 type 值为 C 。

于是我们现在如果需要在老的接口判断是否是我们需要的类型,就要经历下面几个判断才能确定值的类型。

争议

理清逻辑后,我就去找服务端理论,为什么要设计成这样。

讨论了半天,总之就是服务端那边不同的人代码逻辑没有统一,最后导致类型定义不统一。

但是服务端表示我们不会改,因为改了容易出问题,而且 Web 端已经适配了,希望我们也适配一下。

我便问他: “但是你这逻辑已经错了,不处理一下吗?我们要适配你们的错误逻辑吗?”

服务端表示: “服务端写错了你们就错着适配吧。”

3996 次点击
所在节点    程序员
51 条回复
zcf0508
9 小时 51 分钟前
找 leader ,一级一级往上找
jydeng
9 小时 46 分钟前
直接拉群,闹起来
lai9fox95
9 小时 43 分钟前
错了不改这是什么逻辑,这种情况一旦出现了大概率还会有下一次,不想给自己堆屎山挖坑就要坚决一点
sagaxu
9 小时 39 分钟前
先出接口文档,后写代码

1. 有效减少此类错误
2. 发生这种错误时不用扯皮
Helsing
9 小时 38 分钟前
这种肯定是服务端适配,向上提升吧,不要惯着他们
falcon05
9 小时 34 分钟前
如果有一个 bug ,其他功能都依赖这个 bug ,那它不是一个 bug ,而是一个 feature 。估计后端系统已经严重依赖这个错误了,就会像这样。
Forestar
9 小时 33 分钟前
先把 pm 拉进来,说不通再把你们的 leader 拉进来,还说不通再把对面的 leader 拉进来,这总说的通了吧
PainAndLove
9 小时 31 分钟前
先扯皮,服务端不认,再拉 leader 。 让 leader 决策
adoal
9 小时 30 分钟前
做一个 v2 版的接口,你们调用 v2 ,其它调用 v1 的可以以后迁移。
注:v2 不是指 V2EX 的意思。
Yanlongli
9 小时 17 分钟前
大概是新增的类型替换了之前被废弃的类型,然后出现的兼容问题
wolfie
9 小时 14 分钟前
这是管理问题,需求评审时就得评估的,找你客户端负责人去对线就行。
ugpu
8 小时 51 分钟前
@adoal 赞.
1. 提出了解决方案
2. 解决了争端 大家都不尴尬
OP 一定要当着很多人面说出来解决方案 当着 leader 的面 大家都好做.
zypy333
8 小时 46 分钟前
倾向于趁早发现趁早改,除非实改动的影响跟成本实在无法负担
cowcomic
8 小时 44 分钟前
是谁的问题和这个问题谁改是两件事情

是谁的问题是个定性判断,就你说的这个情况,肯定是后端的问题,已经上线接口的定义怎么能轻易修改,这部分向上反馈要的是公道和后续的处理整改

至于这个问题谁改这个事儿,道理上也应该是后台改,但实际上是成本的考量,谁改成本最低,这个成本包括但不限于(开发成本,测试成本,投入的时间造成的机会成本,团队教育的成本,等等)不同的人看到的不一样,这块就让你们领导去 PK 吧
zsc8917zsc
8 小时 40 分钟前
对于历史功能的改动,可以考虑向下兼容或者强制更新。
向下兼容就对接口做好版本号管理,指定版本号调用指定版本号的接口。
不想向下兼容就强制更新,天下太平。
lyxxxh2
8 小时 39 分钟前
"而且 Web 端已经适配了"
那得先将 web 改了,得考虑下时间成本,让有老大决定吧。

不过话说回来:
我认为产品崩溃不是类型问题,是沟通上的。
1. 这种特殊情况,api 文档不标个备注?

2. "如果是老接口,那他的 type 是否等于 C... " 逻辑就太冗余了,没那么复杂啊。
拦截处理就行。
例如 js:
```
r1 = Promise.resolve({c:1}) # 老接口 重写类型
.then(v => {v.c = 'b'; return v}).then(v => console.log(v.c))

r2 = ... # 新接口不管
```
Yukineko
8 小时 35 分钟前
客户端更新要审核发版,服务端随时都可以更新,怎么可能让客户端适配。。
qq135449773
8 小时 31 分钟前
这种问题一般都是 leader 无能+敷衍工作导致的
yiqiao
8 小时 27 分钟前
客户端改不是要发版本吗?那用户用老版本不是还是会造成奔溃吗
服务端这么硬气啊?不算 KPI 的?
9136347
8 小时 24 分钟前
以文档为准,文档写的什么是什么,谁对不上找谁。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1082855

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX