\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