千万级流量架构设计实现方案
实现千万级流量架构设计实现原则
1 实现高并发
- 服务拆分:将整个项目拆分成多个子项目或者模块,分而治之,将项目进行水平扩展
- 服务化:解决服务调用复杂之后的服务注册和发现问题
- 消息队列: 解耦,异步处理
- 缓存:各种缓存带来的高并发
2 实现高可用
- 集群
- 限流
- 降级
3 业务设计
- 幂等:用户对于同一个操作发起的一次请求或者多次请求的最终请求结果是一致的,不会因为点击了多次而产生不一致的结果
- 防重:防止同样的数据同时提交,服务端防重实现思路:在服务器端生成一个惟一的随机标识(Token),同时在当前用户的Session中保存这个标识,然后将这个标识发送到客户端的form表单中,在表单中用隐藏域存储这个标识,当表单提交的时候,这个标识和表单一起提交到服务端,然后在服务端判断用户提交上来的标识和服务器生成的标识是否一样,如果不一样就代表是重复提交,此时服务器就可以不用处理重复提交上来的请求,如果一样,则证明不是重复提交,服务器可以对提交的请求做相关的处理,请求处理完成后清除当前用户session中存储的标识
在下列情况下,服务器将拒绝用户提交的请求:
- 存储session中的token域表单提交的token不一致
- 存储用户的session中不存在token
- 用户提交的表单数据中不存在token
- 状态机:软件设计中的状态机,一般指有限状态机,是表示有限个状态以及这些状态之间的转移和动作等
4 限流
限流的目的是通过对并发访问/请求进行限速或者一个时间窗口内的请求进行限速来保护系统的可用性,一旦达到限制速率就可以拒绝服务。就像手机预售一样,假如要卖出3万台,只需要接收3万用户的请求就可以,其他的用户请求可以选择过滤,可以提示"当前服务器过忙,请稍后再试"的提示。
限流的方式
- 限制瞬时并发数: 在入口层限制同一个IP 来源的连接请求,防止恶意攻击
- 限制并发总数:通过配置数据库连接池,线程池的大小来约束总的并发数
- 限制时间窗口内的平均速度:在接口层面,通过限制访问速率来控制接口的并发请求
- 其他方式:限制远程接口的调用速率,限制MQ的消费速率
常用的限流算法
- 滑动窗户协议:一种常见的流量控制技术,用来改善吞吐量
滑动窗口是一种流量控制技术,在早期的网络通信中,通信双方不会考虑网络拥挤情况直接发送数据,由于大家不知道网络的拥挤情况,同时发送数据导致中间节点阻塞丢包,谁也发送不了数据,所以就有了滑动窗口机制来解决这类问题,发送方和接收方都维护一个数据帧的序列,这个序列就成为窗口
滑动窗口协议,是基于TCP协议的一种应用,用于网络数据传输时的流量控制,避免阻塞发生。该协议允许发送方在停止并等待确认前发送多个数据分组,由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输,提高网络吞吐量
发送窗口:发送端允许连续发送的帧的序号表,发送端可以不等待应答而连续发送数据(可以通过设置窗口的尺寸来控制)
接收窗口:接收方允许接收的帧的序列表,凡是落在接收窗口内的帧,接收方都必须处理,落在窗口之外的帧将被丢弃,接收方每次允许接收的帧数称为接收窗口的尺寸
2 漏桶:漏桶算法能强行限制数据的传输速率
漏桶算法的原理很简单,请求先进入到漏桶中,漏桶以一定的速度出水,当水请求过大会直接溢出,可以看出漏桶算法能强行限制数据的传输速率,进入端无须考虑出水端的速率,就像mq消息队列那样,provider只需要将消息传入队列中,而不需要关系consumer是否接收到了消息。对于溢出的水就是被过滤的数据,可以直接丢弃,也可以通过某种方式暂时保存,例如加入队列,像线程池里面对溢出数据的4种处理机制一样
3 令牌桶:属于控制速率类型的限流算法
对于很多应用场景来说,除了能够要求限制数据的平均传输速率外,还要求允许某种程度的突发传输,这个时候漏桶算法就不合适了,令牌桶算法更为合适,令牌桶的算法原理是系统会以一个恒定的速度往桶里面放入令牌,如果请求需要被处理,则需要从桶里面获取一个令牌,当桶里面没有令牌可获取的时候,则拒绝服务
4 计数器:最简单的一种,通过控制时间段内的请求次数
posted on 2018-11-23 13:02 anqli_java 阅读(1182) 评论(0) 编辑 收藏 举报