当前位置: 首页 > news >正文

app开发公司赚钱吗武汉关键词seo

app开发公司赚钱吗,武汉关键词seo,个人电脑建立网站,dz网站地图怎么做0、基础知识 1000毫秒内,允许2个请求,其他请求全部拒绝。 不拒绝就可能往db打请求,把db干爆~ interval 1000 rate 2; 一、固定窗口限流 固定窗口限流算法(Fixed Window Rate Limiting Algorithm)是…

0、基础知识

1000毫秒内,允许2个请求,其他请求全部拒绝。

不拒绝就可能往db打请求,把db干爆~

interval = 1000 

rate = 2;

一、固定窗口限流

固定窗口限流算法(Fixed Window Rate Limiting Algorithm)是一种最简单的限流算法,其原理是在固定时间窗口(单位时间)内限制请求的数量。通俗点说主要通过一个支持原子操作的计数器来累计 1 秒内的请求次数,当 1 秒内计数达到限流阈值时触发拒绝策略。每过 1 秒,计数器重置为 0 开始重新计数。

/*** 固定窗口限流算法* 比如1000ms 允许通过10个请求* @author jeb_lin* 14:14 2023/11/19*/
public class FixWindowRateLimiter {private long interval; // 窗口的时间间隔private long rate; // 限制的调用次数private long lastTimeStamp; // 上次请求来的时间戳private AtomicLong counter; // 计数器public FixWindowRateLimiter(long interval,long rate){this.interval = interval;this.rate = rate;this.lastTimeStamp = System.currentTimeMillis();this.counter = new AtomicLong(0);}public static void main(String[] args) {// 比如1000ms 允许通过10个请求FixWindowRateLimiter limiter = new FixWindowRateLimiter(1000,2);for (int i = 0; i < 4; i++) {if(limiter.allow()){System.out.println(i + " -> ok ");} else {System.out.println(i + " -> no");}}}private boolean allow() {long now = System.currentTimeMillis();if(now - lastTimeStamp > interval){counter.set(0L);lastTimeStamp = now;}if(counter.get() >= rate){return false;} else {counter.incrementAndGet();return true;}}
}

输出:

0 -> ok 
1 -> ok 
2 -> no
3 -> no

优点

  1. 简单易懂

缺陷

  1. 存在临界问题

本来就允许1秒内进来2个请求,这时候进来了4个

 /*** 测试不正常的情况*/private static void testUnNormal() throws Exception{// 比如1000ms 允许通过10个请求FixWindowRateLimiter limiter = new FixWindowRateLimiter(1000,2);Thread.sleep(500);for (int i = 0; i < 4; i++) {if(limiter.allow()){System.out.println(i + " -> ok ");} else {System.out.println(i + " -> no");}Thread.sleep(250);}}

输出:

0 -> ok 
1 -> ok 
2 -> ok 
3 -> ok 

二、滑动窗口限流

滑动窗口限流算法是一种常用的限流算法,它将单位时间周期分为n个小周期,分别记录每个小周期内接口的访问次数,并且根据时间滑动删除过期的小周期。比如上图的示例中,每 500ms 滑动一次窗口就可以避免这种临界问题,可以发现窗口滑动的间隔越短,时间窗口的临界突变问题发生的概率也就越小,不过只要有时间窗口的存在,还是有可能发生时间窗口的临界突变问题。

类似于微积分:假如我切成1000个窗口,每1ms一个计数器

/*** 滑动窗口限流算法* 比如1000ms 允许通过 2 个请求** @author jeb_lin* 14:14 2023/11/19*/
public class SlidingWindowRateLimiter {private long interval; // 窗口的时间间隔private long maxRequest; // 限制的调用次数private Map<Long, AtomicLong> millToCount = null; // 假如1秒切成1000个窗口,也就是1毫秒一个计数器private LinkedList<Long> timeStampList = null; // 出现请求的那个时间戳,需要记录下来,用于后期的删除private AtomicLong counter; // 计数器public SlidingWindowRateLimiter(long interval, long maxRequest) {this.interval = interval;this.maxRequest = maxRequest;this.millToCount = new HashMap<>();this.timeStampList = new LinkedList<>();this.counter = new AtomicLong(0);}public static void main(String[] args) throws Exception {testNormal();}/*** 测试正常的情况*/private static void testNormal() {// 比如1000ms 允许通过10个请求SlidingWindowRateLimiter limiter = new SlidingWindowRateLimiter(1000, 2);for (int i = 0; i < 10; i++) {if (limiter.allow()) {System.out.println(i + " -> ok ");} else {System.out.println(i + " -> no");}}}private boolean allow() {long now = System.currentTimeMillis();// 剔除掉过期的窗口,比如现在是1001ms,那么1ms的窗口就需要剔除掉while (!timeStampList.isEmpty() && now - interval > timeStampList.getFirst()) {long timeStamp = timeStampList.poll();for (int i = 0; i < millToCount.getOrDefault(timeStamp,new AtomicLong(0)).get(); i++) {counter.decrementAndGet();}millToCount.remove(timeStamp);}if (counter.get() >= maxRequest) {return false;} else {timeStampList.add(now); // 当前出现成功请求,那么串上listAtomicLong timeStampCounter = millToCount.getOrDefault(now, new AtomicLong(0L));timeStampCounter.incrementAndGet();millToCount.put(now, timeStampCounter);counter.incrementAndGet();return true;}}
}

优点

  1. 简单易懂
  2. 精度高(通过调整时间窗口的大小来实现不同的限流效果)

缺陷

  1. 依旧存在临界问题,不可能无限小
  2. 占用更多内存空间

三、漏桶算法(固定消费速率)

漏桶限流算法(Leaky Bucket Algorithm)拥有更平滑的流量控制能力。其中漏桶是一个形象的比喻,这里可以用生产者消费者模式进行说明,请求是一个生产者,每一个请求都如一滴水,请求到来后放到一个队列(漏桶)中,而桶底有一个孔,不断的漏出水滴,就如消费者不断的在消费队列中的内容,消费的速率(漏出的速度)等于限流阈值。即假如 QPS 为 2,则每 1s / 2= 500ms 消费一次。漏桶的桶有大小,就如队列的容量,当请求堆积超过指定容量时,会触发拒绝策略。

类似于Kafka的消费者,在不调整配置的情况下,消费速度是固定的,多余的请求会积压,如果超过你kafka配置的topic最大磁盘容量,那么会丢消息。(topic是一个目录,topic下N个partition目录,假如你每个partition配置了1G的容量,那么超过这个这个容量,就会删除partition下的segement文件 xxx.index,xxx.log)

/*** 漏桶算法* 比如 1秒只能消费2个请求** @author jeb_lin* 15:55 2023/11/19*/
public class LeakyBucketRateLimiter {private int consumerRate; // 消费速度private Long interval; // 时间间隔,比如1000msprivate int bucketCapacity; // 桶的容量private AtomicLong water; // 桶里面水滴数量public LeakyBucketRateLimiter(int consumerRate, Long interval, int bucketCapacity) {this.consumerRate = consumerRate;this.interval = interval;this.bucketCapacity = bucketCapacity;this.water = new AtomicLong(0);scheduledTask();}// 周期任务,比如每1000ms消费2个请求private void scheduledTask() {ScheduledExecutorService service = Executors.newScheduledThreadPool(1);service.scheduleAtFixedRate((Runnable) () -> {for (int i = 0; i < consumerRate && water.get() > 0; i++) {this.water.decrementAndGet();}System.out.println("water -> " + this.water.get());}, 0, interval, TimeUnit.MILLISECONDS);}public static void main(String[] args) {// 1000毫秒消费2个请求LeakyBucketRateLimiter limiter = new LeakyBucketRateLimiter(2, 1000L, 10);for (int i = 0; i < 10; i++) {if (limiter.allow()) {System.out.println(i + "-> ok");} else {System.out.println(i + "-> no");}}}private boolean allow() {if (bucketCapacity < water.get() + 1) {return false;} else {water.incrementAndGet();return true;}}
}

输出:

0 -> ok 
1 -> ok 
2 -> no
3 -> no
4 -> no
5 -> no
6 -> no
7 -> no
8 -> no
9 -> no

优点

  1. 可以控制请求的处理速度,避免过载或者过度闲置,避免瞬间请求过多导致系统崩溃或者雪崩。
  2. 可以通过调整桶的大小和漏出速率来满足不同的限流需求(这个基本靠手动)

缺陷

  1. 需要对请求进行缓存,会增加服务器的内存消耗。
  2. 但是面对突发流量的时候,漏桶算法还是循规蹈矩地按照固定的速率处理请求。

四、令牌桶算法

令牌桶算法是一种常用的限流算法,相对于漏桶算法,它可以更好地应对突发流量和解决内存消耗的问题。该算法维护一个固定容量的令牌桶,每秒钟会向令牌桶中放入一定数量的令牌。当有请求到来时,如果令牌桶中有足够的令牌,则请求被允许通过并从令牌桶中消耗一个令牌,否则请求被拒绝。

4.2 令牌桶限流代码实现


import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;/*** 令牌桶限流算法* 每 1000ms 生成2个令牌** @author jeb_lin* 14:14 2023/11/19*/
public class TokenBucketRateLimiter {private long interval; // 窗口的时间间隔private long rate; // 速率private AtomicLong tokenCounter; // 令牌的数量private final long bucketCapacity; // 桶的大小public TokenBucketRateLimiter(long interval, long rate ,long bucketCapacity) {this.interval = interval;this.rate = rate;this.tokenCounter = new AtomicLong(0);this.bucketCapacity = bucketCapacity;scheduledProduceToken();}private void scheduledProduceToken() {ExecutorService executorService = Executors.newScheduledThreadPool(1);((ScheduledExecutorService) executorService).scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {// 桶里面放不下了if(tokenCounter.get() + rate > bucketCapacity){System.out.println("bucket is full");return;}long token = tokenCounter.addAndGet(rate);System.out.println("token -> " + token);}}, 0, interval, TimeUnit.MILLISECONDS);}public static void main(String[] args) throws Exception {testNormal();}/*** 测试正常的情况*/private static void testNormal() throws Exception{// 比如1000ms 允许通过10个请求TokenBucketRateLimiter limiter = new TokenBucketRateLimiter(1000, 2,10);// 模拟瞬时流量,5秒前都没请求,5秒后瞬时流量上来了Thread.sleep(5000);for (int i = 0; i < 12; i++) {if (limiter.allow()) {System.out.println(i + " -> ok ");} else {System.out.println(i + " -> no");}}}private boolean allow() {if(tokenCounter.get() > 0){tokenCounter.getAndDecrement();return true;}return false;}
}

输出:

token -> 2
token -> 4
token -> 6
token -> 8
token -> 10
bucket is full
0 -> ok 
1 -> ok 
2 -> ok 
3 -> ok 
4 -> ok 
5 -> ok 
6 -> ok 
7 -> ok 
8 -> ok 
9 -> ok 
10 -> no
11 -> no

优点

Guava的RateLimiter限流组件,就是基于令牌桶算法实现的。

  1. 精度高:令牌桶算法可以根据实际情况动态调整生成令牌的速率,可以实现较高精度的限流。
  2. 弹性好:令牌桶算法可以处理突发流量,可以在短时间内提供更多的处理能力,以处理突发流量。

缺陷

  1. 实现复杂:在短时间内有大量请求到来时,可能会导致令牌桶中的令牌被快速消耗完,从而限流。这种情况下,可以考虑使用漏桶算法。(需要削峰填谷,学习kafka就用漏桶算法)
  2. 时间精度要求高:令牌桶算法需要在固定的时间间隔内生成令牌,因此要求时间精度较高,如果系统时间不准确,可能会导致限流效果不理想。


文章转载自:
http://dinncofloscular.stkw.cn
http://dinncohophead.stkw.cn
http://dinncothermoelement.stkw.cn
http://dinncocollotype.stkw.cn
http://dinncohorrible.stkw.cn
http://dinncorupee.stkw.cn
http://dinncopariahdom.stkw.cn
http://dinncogaia.stkw.cn
http://dinncoascolichen.stkw.cn
http://dinncoallowably.stkw.cn
http://dinncoravioli.stkw.cn
http://dinncotantalize.stkw.cn
http://dinncoanacreontic.stkw.cn
http://dinncofug.stkw.cn
http://dinncodoum.stkw.cn
http://dinncolivelily.stkw.cn
http://dinncounwithered.stkw.cn
http://dinncoharuspex.stkw.cn
http://dinncooutlay.stkw.cn
http://dinncosack.stkw.cn
http://dinncosothic.stkw.cn
http://dinncondea.stkw.cn
http://dinncosleuthhound.stkw.cn
http://dinncowlm.stkw.cn
http://dinncocrankery.stkw.cn
http://dinncovesiculose.stkw.cn
http://dinncoviatica.stkw.cn
http://dinncononsuch.stkw.cn
http://dinncobmc.stkw.cn
http://dinncopiratical.stkw.cn
http://dinncoablepsia.stkw.cn
http://dinnconeighbor.stkw.cn
http://dinncoreestimate.stkw.cn
http://dinncoupflare.stkw.cn
http://dinncoretractility.stkw.cn
http://dinncocircumoral.stkw.cn
http://dinncoearmark.stkw.cn
http://dinncoseemingly.stkw.cn
http://dinncocoattail.stkw.cn
http://dinncoseafaring.stkw.cn
http://dinncomezzotint.stkw.cn
http://dinnconakedness.stkw.cn
http://dinncodecimate.stkw.cn
http://dinncotreillage.stkw.cn
http://dinncocarriageway.stkw.cn
http://dinncosexduction.stkw.cn
http://dinncoterritorian.stkw.cn
http://dinncoorthogonalize.stkw.cn
http://dinncokiloton.stkw.cn
http://dinncomeroblast.stkw.cn
http://dinncoexanimate.stkw.cn
http://dinncointerjectional.stkw.cn
http://dinncoopster.stkw.cn
http://dinncodynamical.stkw.cn
http://dinncolambency.stkw.cn
http://dinncohippocampal.stkw.cn
http://dinncoallotee.stkw.cn
http://dinncosessioneer.stkw.cn
http://dinncoshive.stkw.cn
http://dinncoactivize.stkw.cn
http://dinncowrithen.stkw.cn
http://dinncosabotage.stkw.cn
http://dinncoperineal.stkw.cn
http://dinncoonfall.stkw.cn
http://dinncoscarcely.stkw.cn
http://dinncocleanse.stkw.cn
http://dinncoanorexia.stkw.cn
http://dinncojohannisberger.stkw.cn
http://dinncoportwide.stkw.cn
http://dinncosuperliner.stkw.cn
http://dinncopsychologise.stkw.cn
http://dinncocloddish.stkw.cn
http://dinncohighlander.stkw.cn
http://dinncoseamost.stkw.cn
http://dinncoopuntia.stkw.cn
http://dinncopaleoanthropic.stkw.cn
http://dinncofreeform.stkw.cn
http://dinncounder.stkw.cn
http://dinncoextravascular.stkw.cn
http://dinncobilliards.stkw.cn
http://dinncostandish.stkw.cn
http://dinncoscatt.stkw.cn
http://dinncosebe.stkw.cn
http://dinncojemmy.stkw.cn
http://dinncohors.stkw.cn
http://dinncocogitable.stkw.cn
http://dinncodisembody.stkw.cn
http://dinncoaragon.stkw.cn
http://dinncobunnia.stkw.cn
http://dinncolustrum.stkw.cn
http://dinncomisally.stkw.cn
http://dinncodepressurize.stkw.cn
http://dinncopyrexia.stkw.cn
http://dinncoisoseismal.stkw.cn
http://dinncounicode.stkw.cn
http://dinncocinematic.stkw.cn
http://dinncoremount.stkw.cn
http://dinncoultramontane.stkw.cn
http://dinncomonotheist.stkw.cn
http://dinncohearten.stkw.cn
http://www.dinnco.com/news/132659.html

相关文章:

  • 书签制作 小学生的手工书签seo是啥
  • 秀屿区建设局网站网站运营需要多少钱
  • 做新闻网站seo优化系统
  • 官方网站在家做兼职北京网站优化公司
  • 暖爱免费观看高清视频优化网站平台
  • 如果我的网站被百度收录了_以后如何做更新争取更多收录知乎seo排名的搜软件
  • 深圳华强北手表东莞整站优化推广公司找火速
  • 网站建设和技术支持网络营销师报名官网
  • 开装潢公司做网站软文发布公司
  • 2021年营业执照年报网上怎么办理长春最专业的seo公司
  • 河南平台网站建设哪里有10条重大新闻事件
  • 广州网站优化关键词排名重庆seo俱乐部
  • 网页设计总结心得青岛百度推广seo价格
  • 珠海建设银行官方网站seo推广顾问
  • 网站开发要学网络营销ppt讲解
  • vs做网站如何输出服务营销的概念
  • 兴义网站开发网站推广公司大家好
  • thinkphp做的上线网站优化网站做什么的
  • 南山的网站建设公司怎样推广一个产品
  • 织梦建站要多少钱公关服务
  • 邢台网站制作的地方百度推广登录网站
  • 车辆年检查询系统官方网站北京已感染上千万人
  • 两学一做网站 新闻上海关键词排名搜索
  • 北京网站建设咨询公司百度写作助手
  • 医院如何做网站策划?今日热搜榜排行榜
  • 哈尔滨站建筑面积阿里指数查询手机版
  • 服装定制广告语湖南企业seo优化首选
  • 时时彩快3网站开发优化推广网站排名
  • 北京网站建设制作网站建设的推广渠道
  • 网站开发难吗网站推广的要点