前提
业务背景
就拿前些天的双十一的 “抢券活动” 来说,一般是设置整点开始抢的,你想想,淘宝的用户群体非常大,可以达到亿级别,而服务接口每秒能处理的量是有限的,那么这个时候问题就会出现,我们如何通过程序来控制用户抢券呢,于是就必须加上这个限流功能了。
生产环境
1、服务接口所能提供的服务上限(limit)假如是 500次/s
2、用户请求接口的次数未知,QPS可能达到 800次/s,1000次/s,或者更高
3、当服务接口的访问频率超过 500次/s,超过的量将拒绝服务,多出的信息将会丢失
4、线上环境是多节点部署的,但是调用的是同一个服务接口
于是,为了保证服务的可用性,就要对服务接口调用的速率进行限制(接口限流)。
什么是限流?
限流是对系统的出入流量进行控制,防止大流量出入,导致资源不足,系统不稳定。
限流系统是对资源访问的控制组件,控制主要的两个功能:限流策略和熔断策略,对于熔断策略,不同的系统有不同的熔断策略诉求,有的系统希望直接拒绝、有的系统希望排队等待、有的系统希望服务降级、有的系统会定制自己的熔断策略,这里只针对限流策略这个功能做详细的设计。
限流算法
1、限制瞬时并发数
Guava RateLimiter 提供了令牌桶算法实现:平滑突发限流(SmoothBursty)和平滑预热限流(SmoothWarmingUp)实现。
2、限制某个接口的时间窗最大请求数
即一个时间窗口内的请求数,如想限制某个接口/服务每秒/每分钟/每天的请求数/调用量。如一些基础服务会被很多其他系统调用,比如商品详情页服务会调用基础商品服务调用,但是怕因为更新量比较大将基础服务打挂,这时我们要对每秒/每分钟的调用量进行限速;一种实现方式如下所示:
LoadingCache<Long, AtomicLong> counter = CacheBuilder.newBuilder() .expireAfterWrite(2, TimeUnit.SECONDS) .build(new CacheLoader<Long, AtomicLong>() { @Override public AtomicLong load(Long seconds) throws Exception { return new AtomicLong(0); } }); long limit = 1000; while(true) { //得到当前秒 long currentSeconds = System.currentTimeMillis() / 1000; if(counter.get(currentSeconds).incrementAndGet() > limit) { System.out.println("限流了:" + currentSeconds); continue; } //业务处理 } |
使用Guava的Cache来存储计数器,过期时间设置为2秒(保证1秒内的计数器是有的),然后我们获取当前时间戳然后取秒数来作为KEY进行计数统计和限流,这种方式也是简单粗暴,刚才说的场景够用了。
3、令牌桶
算法描述:
-
假如用户配置的平均发送速率为r,则每隔1/r秒一个令牌被加入到桶中
-
假设桶中最多可以存放b个令牌。如果令牌到达时令牌桶已经满了,那么这个令牌会被丢弃
-
当流量以速率v进入,从桶中以速率v取令牌,拿到令牌的流量通过,拿不到令牌流量不通过,执行熔断逻辑
属性
-
长期来看,符合流量的速率是受到令牌添加速率的影响,被稳定为:r
-
因为令牌桶有一定的存储量,可以抵挡一定的流量突发情况
-
M是以字节/秒为单位的最大可能传输速率。 M>r
-
T max = b/(M-r) 承受最大传输速率的时间
-
B max = T max * M 承受最大传输速率的时间内传输的流量
优点:流量比较平滑,并且可以抵挡一定的流量突发情况
4、GOOGLE GUAVA 提供的工具库中 RATELIMITER 类(内部也是采用令牌桶算法实现)
最快的方式是使用 RateLimit 类,但是这仅限制在单节点,如果是分布式系统,每个节点的 QPS 是一样的,请求量到服务接口那的话就是 QPS * 节点数 了。所以这种方案在分布式的情况下不适用!
5、基于 REDIS 实现,存储两个 KEY,一个用于计时,一个用于计数。请求每调用一次,计数器增加 1,若在计时器时间内计数器未超过阈值,则可以处理任务。
这种能够很好地解决了分布式环境下多实例所导致的并发问题。因为使用redis设置的计时器和计数器均是全局唯一的,不管多少个节点,它们使用的都是同样的计时器和计数器,因此可以做到非常精准的流控。
代码就不公布了,毕竟涉及公司隐私了。
最后
参考文章:
基于Redis的限流系统的设计
感兴趣的可以看看别人的代码是怎么写的:https://github.com/wukq/rate-limiter
http://mp.weixin.qq.com/s/oGSXJK7BLKw1k8YIuwQOpQ
相关推荐
【分布式环境下限流方案的实现】在现代高并发的分布式系统中,限流是一个至关重要的技术,用于防止系统被过量的请求淹没,确保服务的稳定性和可用性。本篇文章主要探讨了在分布式环境中,如何利用Redis、Guava的...
因此,文章《基于流媒体的分布式显示控制系统设计探析.pdf》中,作者们探讨了当前传统显示控制系统所面临的瓶颈问题,并提出了一种基于流媒体技术和分布式控制理念的新型显示控制系统架构。 首先,传统显示控制系统...
本文将详细介绍分布式进程间通信的原理、设计以及实现技术,特别关注分布式环境下进程间通信的关键技术和系统设计方法。 分布式进程通信系统设计与研究的知识点可以分为以下几个部分: 1. 进程间通信概述 进程间...
为解决此问题,文章提出了一种基于分布式数据流的服务集成方法。这种方法支持指控服务构件之间直接的数据传输,避免了集中式处理的瓶颈问题,并提高了集成效率。该方法适合于异构网络环境,能够满足军用网络化指控...
《基于分布式的微服务电商系统》毕业设计是一个深入探讨现代电商平台架构的重要课题。在这个项目中,我们将重点关注如何利用微服务架构来构建一个可扩展、高可用且易于维护的电子商务平台。下面将详细阐述该设计涉及...
标题“Go-基于redis的分布式限频模块”表明我们讨论的是一个使用Go语言编写的库,它专注于利用Redis数据库实现分布式环境下的速率限制功能。这种限频模块在高并发场景下特别有用,它可以防止过量请求导致的服务崩溃...
### MySQL并发控制与限流设计 #### 一、MySQL性能概览 MySQL作为一款广泛使用的开源关系型数据库管理系统,在各种应用场景下展现出了优秀的性能特点。然而,在高并发场景下,MySQL也面临着诸多挑战。为了更好地...
当我们谈论“java-基于redis限流系统”时,我们实际上是指利用Redis这个内存数据存储作为工具来实现Java应用的流量控制。Redis因其高效、灵活的特性,常被用于构建限流系统。下面将详细阐述这一主题。 首先,限流的...
以上提到的“分布式系统”和“分布式开发”则强调了基于分布式星群设计的多卫星协同工作模式,这要求开发人员和研究人员采用不同于传统集中式架构的设计思想和开发方法,以确保系统设计的有效性和可靠性。...
本文将深入探讨Python在分布式环境下的限流器设计与实现,并基于给定文件中的描述,详细介绍服务端限流器的设计理念、具体实现以及应用场景。 #### 一、限流器简介 限流器是一种用于限制特定时间间隔内的请求数量...
本部分将详细解析基于Hadoop的分布式入侵检测系统设计与实现所涉及的关键知识点。 分布式入侵检测系统(Distributed Intrusion Detection System,DIDS)是一种能够应对复杂网络环境和多变安全威胁的解决方案。它...
### 基于Dubbo的分布式系统架构的关键知识点 #### 一、Dubbo简介与应用场景 **1.... Dubbo是一款高性能、轻量级的开源...无论是对于初学者还是有一定经验的开发者来说,学习Dubbo都是提升分布式系统设计能力的重要途径。
结合这些信息,我们可以推断该文档主要讨论的是Sentinel系统如何在云计算环境下充当分布式系统的流量防卫兵。 Sentinel是阿里巴巴开源的一款分布式系统的流量控制组件。Sentinel 主要用于解决分布式系统中的服务...
此外,系统扩展性也是分布式系统设计的关键。随着电力应急指挥需求的增长,视频会议系统需要能快速适应增加的参与者数量,提供更多的并发连接,以及处理更高的数据吞吐量。因此,系统架构需要灵活,能够支持硬件和...
为了应对这一问题,作者提出了一种名为Tassel的安全系统,该系统基于分布式信息流控制理论。分布式信息流控制是一种用于保护系统安全的技术,它可以对信息的传播路径进行细粒度的监控和限制,确保敏感信息不会流向不...
这种系统设计对于提升大规模分布式系统的服务质量、监控能力和维护效率具有重要意义。随着分布式系统架构的不断发展和完善,我们有理由相信,类似octoLogStreamlet这样的日志系统将在未来的IT行业中扮演越来越重要的...
矿区分布式网络视频录像系统设计是一项针对传统集中式网络视频录像系统在矿区特定环境下所面临的存储容量和并发访问限制问题的解决方案。分布式网络视频录像系统的设计考虑到了矿区环境对视频监控的特殊需求,如多...
本文介绍了一种基于分布式电源(DG)的串联补偿方式的设计,该设计旨在扩展分布式发电的应用范围并改善配电网络的电能质量。分布式电源因其靠近负荷中心的特点,在电力系统中具有重要的作用。它们可以降低功率传输...
8. **一致性维护**:探讨了如何在分布式环境下保证服务状态的一致性,确保数据的准确性和完整性。 此外,论文还关注了服务组合的关键问题,这是SOA应用的核心。服务组合涉及到服务的部署策略和路径优化,以提升系统...
为了实现这一目标,设计了一个名为MobiStreams的分布式流处理系统,该系统能够在智能手机上直接运行,处理感应数据并实现数据流的分布式处理。 在实现基于智能手机的DSPS系统过程中,遇到的首要挑战就是故障检测和...