幂等性问题
这个问题在分布式系统中很常见,所谓的幂等性,就是说一个接口,多次发起同一个请求,你这个请求得保证结果是准确的,比如不能多扣款,不能多插入一条数据,不能将统计值多加了1,这就是幂等性
保证幂等的方式
- 对于每个请求必须有一个唯一的标识,举个例子,订单支付请求,肯定得包含订单id,一个订单最多支付一次
- 每次处理完请求之后,必须有一个记录标识这个请求已经处理过了,比如说常见的方案是在mysql中记录状态,比如支付之前记录一条这个订单的支付流水,而且支付流水采用了orderId作为唯一键,只有成功插入这个支付流水,才能执行实际的支付扣款
- 每次接受请求需要进行判断之前的是否已经处理过的逻辑处理,如果一个业务已经处理过了,那么就不用再处理了
分布式系统的接口顺序性
其实在一般的情况下,分布式系统中的顺序性不是必须要求的,但是再某些极端情况下,需要保证接口调用的顺序性,譬如说,需要对一条数据进行修改后删除,但是执行时顺序错了,先删除再修改,那么本来这条数据应该被删除,但是现在数据还存在,导致后续很多问题
保证顺序性的方法
- 通过线程内存队列,每个线程监听一个内存队列,然后将需要保证顺序性的服务链压到一个内存队列中,有一条线程监听并执行
- 通过分布式锁(可以保证100%的强一致性),通过zookeeper生成一个分布式锁,再锁中维护一个步骤信息,由其余的服务开始识别并获取锁来执行