分布式系统---幂等性设计
最近做的项目的性能调优中关于幂等设计的一些总结 场景:假设有这样一个方法,包含了一些DB操作,check if existing then update else save. 如果两个线程同时去执行这个方法,并且他们处理的是同一条数据,期望应该是其中一个线程是save,另外一个是update。但是有可能线程的处理时间相当重合,线程A在check的时候,线程B也在check,这时A和B都认为数据不存在,都去save,在 数据库 有unique 约束的情况下其中一个操作会失败,而我们期望的可能是后面一个操作应该update(取决于具体业务)。 这是很典型的多线程问题,check - then do something,在单系统环境中这很容易用线程同步来处理(syncronised). 但是如果是分布式系统,这两个线程在不同的server上面,syncronised 是不会起效的,而且同步往往降低效率,并不是我们想要的。 拥有相同参数的多次请求对系统造成的副作用应该是相同的,这就是幂等性。在这个例子里面就是说保证相同的ID组合只会插入一条数据到DB里面,如果一个请求是save,后续的都应该update这条。在单系统中也可以用幂等的设计来规避使用syncronized,因为那会降低效率。一般情况下数据库就能保证这种幂等性--用unique关键字,以上面的场景为例