分布式服务之间不可避免要相互通信,通信的结果有三种:成功,失败,超时。而超时状态,有可能是接收方没有接受到数据,另一种情况是接受到数据处理完了,返回数据的过程超时。一般地我们都会进行业务补偿操作,常见的模式有两种
1 调用方查询,根据结果决定是否重传
2 调用方重传,而接受方查询是否已处理,若是没有处理则进行处理,否则返回结果。
第二种方式要求接口的幂等的。即一次调用产生的副作用与多次相同,如果用数学公式表示为f(x)=f(f(x))。
如何才能做到幂等呢?
1 首先需要一个唯一标识,如全局唯一id,如UUID,虽然可以保证全局唯一,但是生成的id占用空间太大,不利于索引,而且随机性太强无法看懂。比较推荐的是snowflake算法,全局id也可考虑加入业务字段。
2 处理的流程大致如下,调用方发送带id的数据,接受方先判断此数据是否已经处理,没有则处理有则返回之前的处理结果。
3 流程优化,上面的流程,每次都需要进行一次查询,出问题的概率其实并不大,所以呢,有点浪费资源,优化后流程:接受方接到请求后执行不存在则插入,存在则更新的动作,如insert into ...on duplicate on key update....