bea97d99f6964cd8653f5a5ba940b3ad74ccf587
\345\270\270\350\247\201\351\227\256\351\242\230/\345\272\224\347\224\250\345\270\202\345\234\272\345\256\211\350\243\205app\345\274\202\345\270\270\346\216\222\346\237\245.md
... | ... | @@ -0,0 +1,34 @@ |
1 | +### 应用市场安装app异常排查 |
|
2 | +##### 1,修改表结构,导致死锁 |
|
3 | + |
|
4 | +[[http://iidp.chinasie.com:9999/iidpminio/issure/deadlock.png]] |
|
5 | + |
|
6 | +由上图死锁导致整个流程卡住,安装app的流程无法继续,导致应用市场安装app异常。 |
|
7 | + |
|
8 | +##### 2,调用distribute安装接口异常 |
|
9 | + |
|
10 | +[[http://iidp.chinasie.com:9999/iidpminio/issure/distributed-install.png]] |
|
11 | + |
|
12 | +调用distribute接口异常,导致应用市场安装app失败,但是应用市场已经对数据库表、redis元模型数据更新,并没有回滚,导致数据不一致。 |
|
13 | + |
|
14 | +##### 3,应用市场安装app异常 |
|
15 | + |
|
16 | +与场景2类似,应用市场本身的安装app接口异常,也没有回滚数据,导致数据不一致。 |
|
17 | + |
|
18 | +### 解决方案 |
|
19 | + |
|
20 | +#### 1,业务制定回滚流程 |
|
21 | +应用市场安装app异常后,业务制定回滚流程,回滚数据库表、redis元模型数据等。 |
|
22 | +数据库在死锁后可以使死锁事务全部回滚,比如mysql可以配置innodb_rollback_on_timeout参数。 |
|
23 | +一个成熟的数据库产品肯定是满足事务的ACID的. |
|
24 | + |
|
25 | +#### 2,手动卸载并重新安装app |
|
26 | +如果应用市场安装app异常,可以手动卸载已经安装的app,并重新安装。 |
|
27 | +distribute暴露的安装和卸载接口是幂等的,可以多次调用。 |
|
28 | + |
|
29 | +对于死锁(数据库锁表、分布式死锁等)情况,需要业务制定死锁处理流程,比如手动kill死锁的sql语句,或者重启应用市场服务等。 |
|
30 | + |
|
31 | + |
|
32 | +任何一个系统都无法保证做一件事情一定成功,这是不可能的,但是任何一个系统必须保证做一件事情结果的一致性,要么成功,要么失败,这是确定性的。 |
|
33 | +我们常说的tcp协议是面向连接的可靠传输协议,但是tcp从来不保证一定传输成功,tcp只保证数据传输了就一定成功了,同时传输失败了就一定失败了,没有中间状态。 |
|
34 | +类似地,对于distributed的安装、卸载和更新接口,它底层是etcd,etcd也不保证一定成功,但是保证数据的地表最强的一致性,要么成功,要么失败。 |
|
... | ... | \ No newline at end of file |