首页 > 技术文章 > 分布式 幂等性/服务降级

ruhuanxingyun 2020-09-03 09:32 原文

一、幂等性

  1. 定义:用户对同一操作发起的一次或多次接口请求的结果是相同的,不会因多次单击而产生副作用;

   注意:对于编程来说就是CRUD,而查询和删除是天然具有幂等性的,剩下就是需要考虑增加和删除,特别是增加。

  2. 导致多次请求的场景

    A. 前端重复提交;

    B. 接口超时重试;

    C. 消息重复消费。

  3. 实现方式

    虽然前端可以拦截一部分,如防止表单重复提交、按钮置灰等,但是不够安全,因为懂技术的可以通过工具进行请求模拟,所以还是需要从后端接口控制;

    A. 数据库唯一性索引;

    B. 先查询后判断;

    C. token机制防重复提交;

    D. 乐观锁/悲观锁等。

   设计核心:校验请求参数的有效性,及与已有数据对比,如果同样的请求参数已经处理过就不要重复处理,直接返回。

 

  4. 应用场景

    A. 创建支付订单接口:同样的订单号,同样的金额信息,重复支付,可能会因为服务超时或网络故障等原因无法无法及时响应而造成金额累加;

    B. 发送短信接口:因为短信接口收费,重复提交会导致多条短信产生。

 

可参考:分布式系统中实现幂等性的几种方式

    Redis解决幂等性问题实践

    SpringBoot实现接口幂等性四种方案

 

二、服务降级

  1. 定义:尽可能的把系统资源让给优先级高的服务使用;

  2. 措施

    A. 拒绝服务:高峰期时拒绝优先级低的应用的服务请求,保证核心应用正常工作,也可以随机拒绝请求,直接返回服务器繁忙;

    B. 关闭服务:临时关闭一些冷门的或者边缘不重要的服务,给核心服务让出资源;

  3. 作用:因为资源有限,请求无限,在高峰期时降级处理,可以避免整体服务的性能变差,还可以避免因为宕机导致服务不可用。

 

推荐阅读