分布式学习二

1、幂等解决方法
什么是幂等?
常见描述:对于相同的请求应该返回相同的结果,所以查询类接口是天然的幂等性接口。
真正的回答方式:幂等指的是相同请求(identical request)执行一次或者多次所带来的副作
用(side-effects)是一样的。
什么常见会出现幂等?
前端调后端接口发起支付超时,然后再次发起重试。可能会导致多次支付。
Dubbo中也有重试机制。
页面上多次点击。
我们想要的是:接口的幂等性实际上就是接口可重复调用,在调用方多次调用的情况下,接口最终
得到的结果是一致的 。
解决方案
在插入数据的时候,插入去重表,利用数据库的唯一索引特性,保证唯一的逻辑。
悲观锁,select for update,整个执行过程中锁定该订单对应的记录。注意:这种在DB读大于写的
情况下尽量少用。
先查询后修改数据,并发不高的后台系统,或者一些任务JOB,为了支持幂等,支持重复执行,简
单的处理方法是,先查询下一些关键数据,判断是否已经执行过,在进行业务处理,就可以了。注
意:核心高并发流程不要用这种方法。
状态机幂等,在设计单据相关的业务,或者是任务相关的业务,肯定会涉及到状态机,就是业务单
据上面有个状态,状态在不同的情况下会发生变更,一般情况下存在有限状态机,这时候,如果状
态机已经处于下一个状态,这时候来了一个上一个状态的变更,理论上是不能够变更的,这样的
话,保证了有限状态机的幂等。
token机制,防止页面重复提交:
集群环境:采用token加redis(redis单线程的,处理需要排队)或者
单JVM环境:采用token加redis或token加jvm内存
数据提交前要向服务的申请token,token放到redis或jvm内存,设置token有效时间,提交后后台
校验token,同时删除token,生成新的token返回。token特点:要申请,一次有效性,可以限流。
全局唯一ID,如果使用全局唯一ID,就是根据业务的操作和内容生成一个全局ID,在执行操作前先
根据这个全局唯一ID是否存在,来判断这个操作是否已经执行。如果不存在则把全局ID,存储到存
储系统中,比如数据库、redis等。如果存在则表示该方法已经执行。

2、负载均衡算法
轮询
加权轮询
随机
最少连接
源地址hash

3、限流算法
计数器算法(固定窗口)
滑动窗口
漏桶算法
令牌桶算法

4、计数器算法
计数器算法是使用计数器在周期内累加访问次数,当达到设定的限流值时,触发限流策略。下一个
周期开始时,进行清零,重新计数。
此算法在单机还是分布式环境下实现都非常简单,使用redis的incr原子自增性和线程安全即可轻松
实现。
这个算法通常用于QPS限流和统计总访问量,对于秒级以上的时间周期来说,会存在一个非常严重
的问题,那就是临界问题。
假设1min内服务器的负载能力为100,因此一个周期的访问量限制在100,然而在第一个周期的最
后5秒和下一个周期的开始5秒时间段内,分别涌入100的访问量,虽然没有超过每个周期的限制
量,但是整体上10秒内已达到200的访问量,已远远超过服务器的负载能力,由此可见,计数器算
法方式限流对于周期比较长的限流,存在很大的弊端。

5、滑动窗口算法
滑动窗口算法是将时间周期分为N个小周期,分别记录每个小周期内访问次数,并且根据时间滑动
删除过期的小周期。

6、漏桶算法
漏桶算法是访问请求到达时直接放入漏桶,如当前容量已达到上限(限流值),则进行丢弃(触发
限流策略)。漏桶以固定的速率进行释放访问请求(即请求通过),直到漏桶为空。

7、令牌桶算法
令牌桶算法是程序以r(r=时间周期/限流值)的速度向令牌桶中增加令牌,直到令牌桶满,请求到
达时向令牌桶请求令牌,如获取到令牌则通过请求,否则触发限流策略。

8、数据库处理海量数据
对数据库进行:分库分表,主从架构,读写分离。
水平分库/分表,垂直分库/分表。
水平分库/表,各个库和表的结构一模一样。
垂直分库/表,各个库和表的结构不一样。
读写分离:主机负责写,从机负责读。

9、提高系统的并发能力
使用分布式系统。
部署多台服务器,并做负载均衡。
使用缓存(Redis)集群。
数据库分库分表 + 读写分离。
引入消息中间件集群。

你可能感兴趣的:(学习,分布式,学习)