什么是服务雪崩?

在调用微服务的过程中,如果下层的微服务挂掉了,如果没有超时机制,会导致上层微服务调用失败,阻塞,得不到返回。引起从下到上,一连串的服务崩掉
在这里插入图片描述
如图,如果H挂掉,上层所有服务都会挂掉,最终演变成下图这样
在这里插入图片描述

如何避免服务雪崩?

**幂等性**
  1. 设置商品价格,update goods update price = 300,一次多次没区别wang,不需要考虑
  2. 将商品添加到购物车的操作,如果出现网络问题,多次点击应该算作一次,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,这个两个字段在提供方系统里面做联合唯一索引,这样当第三方调用时,先在本方系统里面查询一下,是否已经处理过,返回相应处理结果;没有处理过,进行相应处理,返回结果。注意,为了幂等友好,一定要先查询一下,是否处理过该笔业务,不查询直接插入业务系统,会报错,但实际已经处理了。