什么是服务雪崩?
在调用微服务的过程中,如果下层的微服务挂掉了,如果没有超时机制,会导致上层微服务调用失败,阻塞,得不到返回。引起从下到上,一连串的服务崩掉
如图,如果H挂掉,上层所有服务都会挂掉,最终演变成下图这样
如何避免服务雪崩?
**幂等性**
- 设置商品价格,update goods update price = 300,一次多次没区别wang,不需要考虑
- 将商品添加到购物车的操作,如果出现网络问题,多次点击应该算作一次,update shopingcart set nums = nums + 1 ,一次多次区别很大
- 如何解决重试带来的幂等性问题?
1.唯一索引(最常用的方式),比如将手机号设置为唯一索引,及时多次请求,也不会多次插入数据库
2.使用token机制,防止前端页面重复提交
业务要求:
页面的数据只能被点击提交一次
发生原因:
由于重复点击或者网络重发,或者nginx重发等情况会导致数据被重复提交
解决办法:
集群环境:采用token加redis(redis单线程的,处理需要排队)
处理流程:
1. 数据提交前要向服务的申请token,token放到redis或内存,token有效时间
2. 提交后后台校验token,同时删除token,生成新的token返回
token特点:
要申请,一次有效性,可以限流
注意:redis要用删除操作来判断token,删除成功代表token校验通过,如果用select+delete来校验token,存在并发问题,不建议使用
3.悲观锁(很少用)
4.乐观锁
5.分布式锁(分布式系统要用)
6.select+insert,查询不到,再插入(由于并发问题,应该结合锁使用)
7.对外提供接口的api如何保证幂等
对外提供接口为了支持幂等调用,接口有两个字段必须传,一个是来源source,一个是来源方序列号seq,这个两个字段在提供方系统里面做联合唯一索引,这样当第三方调用时,先在本方系统里面查询一下,是否已经处理过,返回相应处理结果;没有处理过,进行相应处理,返回结果。注意,为了幂等友好,一定要先查询一下,是否处理过该笔业务,不查询直接插入业务系统,会报错,但实际已经处理了。