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

用个人电脑做服务器建网站一键优化表格

用个人电脑做服务器建网站,一键优化表格,淘宝客推广网站建设,最近几天的重大新闻事件在微服务系统中#xff0c;缓存、限流、熔断是保证系统高可用的三板斧#xff0c;今天我们就来聊聊限流。限流是保障系统高可用的方式之一#xff0c;当然啦也是大厂高频面试题#xff0c;如果阿里的面试官问一句#xff1a;“如何实现每秒钟1K个请求的限流#xff1f;”…在微服务系统中缓存、限流、熔断是保证系统高可用的三板斧今天我们就来聊聊限流。限流是保障系统高可用的方式之一当然啦也是大厂高频面试题如果阿里的面试官问一句“如何实现每秒钟1K个请求的限流”你要是分分钟给他写上几种限流方案那岂不香哉哈哈:smirk:! 话不多说我来列几种常用限流实现方式。Guava RateLimiterGuava是Java领域很优秀的开源项目包含了日常开发常用的集合、String、缓存等 其中RateLimiter是常用限流工具。RateLimiter是基于令牌桶算法实现的如果每秒10个令牌内部实现会每100ms生产1个令牌。使用Guava RateLimiter引入pom依赖com.google.guavaguava23.0复制代码代码public class GuavaRateLimiterTest{//比如每秒生产10个令牌相当于每100ms生产1个令牌private RateLimiter rateLimiter RateLimiter.create(10);/*** 模拟执行业务方法*/public void exeBiz(){if (rateLimiter.tryAcquire(1)) {try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(线程 Thread.currentThread().getName() 执行业务逻辑);} else {System.out.println(线程 Thread.currentThread().getName() 被限流);}}public static void main(String[] args) throws InterruptedException{GuavaRateLimiterTest limiterTest new GuavaRateLimiterTest();Thread.sleep(500);//等待500ms让limiter生产一些令牌//模拟瞬间生产100个线程请求for (int i 0; i 100; i) {new Thread(limiterTest::exeBiz).start();}}}复制代码滑窗计数打个比方某接口每秒允许100个请求设置一个滑窗窗口中有10个格子每个格子占100ms每100ms移动一次。滑动窗口的格子划分的越多滑动窗口的滚动就越平滑限流的统计就会越精确。代码/*** 滑窗计数器*/public class SliderWindowRateLimiter implements Runnable{//每秒允许的最大访问数private final long maxVisitPerSecond;//将每秒时间划分N个块private final int block;//每个块存储的数量private final AtomicLong[] countPerBlock;//滑动窗口划到了哪个块儿可以理解为滑动窗口的起始下标位置private volatile int index;//目前总的数量private AtomicLong allCount;/*** 构造函数** param block每秒钟划分N个窗口* param maxVisitPerSecond 每秒最大访问数量*/public SliderWindowRateLimiter(int block, long maxVisitPerSecond){this.block block;this.maxVisitPerSecond maxVisitPerSecond;countPerBlock new AtomicLong[block];for (int i 0; i block; i) {countPerBlock[i] new AtomicLong();}allCount new AtomicLong(0);}/*** 判断是否超过最大允许数量** return*/public boolean isOverLimit(){return currentQPS() maxVisitPerSecond;}/*** 获取目前总的访问数** return*/public long currentQPS(){return allCount.get();}/*** 请求访问进来判断是否可以执行业务逻辑*/public void visit(){countPerBlock[index].incrementAndGet();allCount.incrementAndGet();if (isOverLimit()) {System.out.println(Thread.currentThread().getName() 被限流 currentQPS currentQPS() index index);} else {System.out.println(Thread.currentThread().getName() 执行业务逻辑 currentQPS currentQPS() index index);}}/*** 定时执行器* 每N毫秒滑块移动一次然后再设置下新滑块的初始化数字0然后新的请求会落到新的滑块上* 同时总数减掉新滑块上的数字并且重置新的滑块上的数量*/Overridepublic void run(){index (index 1) % block;long val countPerBlock[index].getAndSet(0);allCount.addAndGet(-val);}public static void main(String[] args){SliderWindowRateLimiter sliderWindowRateLimiter new SliderWindowRateLimiter(10, 100);//固定的速率移动滑块ScheduledExecutorService scheduledExecutorService Executors.newSingleThreadScheduledExecutor();scheduledExecutorService.scheduleAtFixedRate(sliderWindowRateLimiter, 100, 100, TimeUnit.MILLISECONDS);//模拟不同速度的请求new Thread(() - {while (true) {sliderWindowRateLimiter.visit();try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}}).start();//模拟不同速度的请求new Thread(() - {while (true) {sliderWindowRateLimiter.visit();try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}}}).start();}}复制代码信号量利用Semaphore每隔固定速率释放Semaphore的资源。线程获取到资源则执行业务代码。代码public class SemaphoreOne{private static Semaphore semaphore new Semaphore(10);public static void bizMethod() throws InterruptedException{if (!semaphore.tryAcquire()) {System.out.println(Thread.currentThread().getName() 被拒绝);return;}System.out.println(Thread.currentThread().getName() 执行业务逻辑);Thread.sleep(500);//模拟处理业务逻辑需要1秒semaphore.release();}public static void main(String[] args){Timer timer new Timer();timer.scheduleAtFixedRate(new TimerTask() {Overridepublic void run(){semaphore.release(10);System.out.println(释放所有锁);}}, 1000, 1000);for (int i 0; i 10000; i) {try {Thread.sleep(10);//模拟每隔10ms就有1个请求进来} catch (InterruptedException e) {e.printStackTrace();}new Thread(() - {try {SemaphoreOne.bizMethod();} catch (InterruptedException e) {e.printStackTrace();}}).start();}}}复制代码令牌桶令牌桶算法一个存放固定容量令牌的桶按照固定速率往桶里添加令牌如有剩余容量则添加没有则放弃。如果有请求进来则需要先从桶里获取令牌当桶里没有令牌可取时则拒绝任务。令牌桶的优点是可以改变添加令牌的速率一旦提高速率则可以处理突发流量。代码public class TokenBucket{/*** 定义的桶*/public class Bucket{//容量int capacity;//速率每秒放多少int rateCount;//目前token个数AtomicInteger curCount new AtomicInteger(0);public Bucket(int capacity, int rateCount){this.capacity capacity;this.rateCount rateCount;}public void put(){if (curCount.get() capacity) {System.out.println(目前数量 curCount.get() , 我还可以继续放);curCount.addAndGet(rateCount);}}public boolean get(){if (curCount.get() 1) {curCount.decrementAndGet();return true;}return false;}}Testpublic void testTokenBucket() throws InterruptedException{Bucket bucket new Bucket(5, 2);//固定线程固定的速率往桶里放数据比如每秒N个ScheduledThreadPoolExecutor scheduledCheck new ScheduledThreadPoolExecutor(1);scheduledCheck.scheduleAtFixedRate(() - {bucket.put();}, 0, 1, TimeUnit.SECONDS);//先等待一会儿让桶里放点tokenThread.sleep(6000);//模拟瞬间10个线程进来拿tokenfor (int i 0; i 10; i) {new Thread(() - {if (bucket.get()) {System.out.println(Thread.currentThread() 获取到了资源);} else {System.out.println(Thread.currentThread() 被拒绝);}}).start();}//等待往桶里放tokenThread.sleep(3000);//继续瞬间10个线程进来拿tokenfor (int i 0; i 10; i) {new Thread(() - {if (bucket.get()) {System.out.println(Thread.currentThread() 获取到了资源);} else {System.out.println(Thread.currentThread() 被拒绝);}}).start();}}}复制代码总结本文主要介绍几种限流方法Guava RateLimiter、简单计数、滑窗计数、信号量、令牌桶当然啦限流算法还有漏桶算法、nginx限流等等。半支烟所写的这些方法只是个人在实际项目总使用过的或者是参加阿里笔试时写过的方式。如果你更好的想法也欢迎跟我一起交流
http://www.pierceye.com/news/874858/

相关文章:

  • 手机怎么做3d短视频网站网站开发工程师php岗位职责
  • 莆田做网站公司电话人才网站建设方案
  • 找人做网站需要问哪些问题桂林漓江悦府
  • 专门做2次元图片的网站高清vpswindows在线看
  • 青岛手机建站公司网站源码com大全
  • 电脑搭建网站需要空间wordpress文件夹权限设置方法
  • 建设网站基础医疗网站建设比较好的
  • 建个网站视频教程小程序开发是前端还是后端
  • 广州分享网站建设网站速度查询
  • 做电商网站价钱传奇类网页游戏大全
  • 如何选择南京网站建设网站制作能赚多少钱
  • 一站式网站设计已有域名如何在花生壳网站做二级域名托管
  • 哪个网站可以接图纸做返利网站怎么做的
  • 旅游网站建设国内外现状辽阳专业建设网站公司
  • 免费视频模板网站wordpress不写代码
  • 设计网站公司 露 联湖南岚鸿小程序网站开发公司
  • 聊城网站设计seo公司重庆
  • 网站布局技术厦门网站建设680元
  • 深圳物流公司网站建e网怎么做效果图
  • 做营销网站公司建个个人网站一年多少钱
  • 阆中网站网站建设代理网络服务器
  • 企业网站新模式seo排名推广工具
  • 山东做网站三五个人网页设计作品简单
  • 福州网站建设软件网站做了301怎么查看跳转前网站
  • 网站开发竞品分析网站开发与规划
  • 香山红叶建设有限公司网站网络营销方式落后的表现
  • 合肥百姓网网站建设263云通信官方网站
  • 深圳建设网站seo 手机电商数据分析师
  • 网站内外链怎么做公司建设包括哪些方面
  • 织梦网站环境搭建电子邮件怎么注册