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

13 小时 55 分钟前
 mouyase

前情提要

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

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

问题简述

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

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

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

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

争议

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

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

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

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

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

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

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

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

至于这个问题谁改这个事儿,道理上也应该是后台改,但实际上是成本的考量,谁改成本最低,这个成本包括但不限于(开发成本,测试成本,投入的时间造成的机会成本,团队教育的成本,等等)不同的人看到的不一样,这块就让你们领导去 PK 吧
zsc8917zsc
12 小时 42 分钟前
对于历史功能的改动,可以考虑向下兼容或者强制更新。
向下兼容就对接口做好版本号管理,指定版本号调用指定版本号的接口。
不想向下兼容就强制更新,天下太平。
lyxxxh2
12 小时 41 分钟前
"而且 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
12 小时 37 分钟前
客户端更新要审核发版,服务端随时都可以更新,怎么可能让客户端适配。。
qq135449773
12 小时 33 分钟前
这种问题一般都是 leader 无能+敷衍工作导致的
yiqiao
12 小时 29 分钟前
客户端改不是要发版本吗?那用户用老版本不是还是会造成奔溃吗
服务端这么硬气啊?不算 KPI 的?
9136347
12 小时 26 分钟前
以文档为准,文档写的什么是什么,谁对不上找谁。

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

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

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

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

© 2021 V2EX