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

一元云购 网站开发云南住建局和城乡建设报考网站

一元云购 网站开发,云南住建局和城乡建设报考网站,帝国cms网站建设,怎么用免费的网站空间一、滑动时间窗口 我为RateLimiter定义了如下这个简单的IRateLimiter接口#xff0c;唯一的无参方法TryAcquire利用返回的布尔值确定当前是否超出设定的速率限制。我只提供的两种基于时间窗口的实现#xff0c;如下所示的基于“滑动时间窗口”的实现类型SliddingWindowRateL…一、滑动时间窗口 我为RateLimiter定义了如下这个简单的IRateLimiter接口唯一的无参方法TryAcquire利用返回的布尔值确定当前是否超出设定的速率限制。我只提供的两种基于时间窗口的实现如下所示的基于“滑动时间窗口”的实现类型SliddingWindowRateLimiter我们在构造的时候指定时间窗口和阈值。SliddingWindowRateLimiter采用一种“讨巧”的实现它直接利用了BoundedChannelDateTimeOffset对象我们将指定的阈值作为它的最大容量。 public interface IRateLimiter {bool TryAcquire(); }public sealed class SliddingWindowRateLimiter: IRateLimiter {private readonly TimeSpan _window;private readonly ChannelReaderDateTimeOffset _reader;private readonly ChannelWriterDateTimeOffset _writer;public SliddingWindowRateLimiter(TimeSpan window, int permit){_window window;var options new BoundedChannelOptions (permit){FullMode BoundedChannelFullMode.Wait,SingleReader false,SingleWriter true};var channel Channel.CreateBoundedDateTimeOffset(options);_reader channel.Reader;_writer channel.Writer;Task.Factory.StartNew(Trim,TaskCreationOptions.LongRunning);}public bool TryAcquire() _writer.TryWrite(DateTimeOffset.UtcNow);private void Trim(){if (!_reader.TryPeek(out var timestamp)){Task.Delay(_window).Wait();Trim();}else{var delay _window - (DateTimeOffset.UtcNow - timestamp);if (delay TimeSpan.Zero){Task.Delay(delay).Wait();Trim();}else{var valueTask _reader.ReadAsync();if (!valueTask.IsCompleted) _ valueTask.Result;Trim();}}} } 在实现的TryAcquire方法中我们试着将当前时间戳写入这个Channel并将写入的结果成功或者失败作为返回值。为了让Channel中只包含指定时间窗口的时间戳我们利用一个LongRuning的Task执行Trim方法对过期的时间戳进行“裁剪”。Trim会调用ChannelReader的TRyPeek方法如果返回False意味着Channel为空此时会等待一段窗口时间再进行“裁剪”。如果提取出来时间戳在Now-Window与当前时间之间意味着Channel里面的时间戳均在设定的窗口内此时同样需要等待等待时间为Window - (Now - Timestamp)只有在提取的时间超出窗口范围我们才需要将其从Channel中移除。 var limiter new SliddingWindowRateLimiter(TimeSpan.FromSeconds(2),2);var index 0; await Task.WhenAll( Enumerable.Range(1, 100).Select(_ Task.Run(() {while (true){if (limiter.TryAcquire()){Console.WriteLine($[{DateTimeOffset.Now}]{Interlocked.Increment(ref index)});} }}))); 我们在上面的演示程序中使用这个SliddingWindowRateLimiter设定的限速规则为 2/2s。我们创建了100个Task并发地调用这个SliddingWindowRateLimiter并将它返回True时的时间戳显示出来具体输出如下所示。 二、固定时间窗口 如下这个FixedWindowRateLimiter类型是针对“固定窗口”的实现字段_windowTicks和_permit同样表示时间窗口的时长这里我们使用Int64类型的Ticks属性和阈值。 _nextWindowStartTimeTicks表示下一次固定窗口的起始时间这个需要动态调整为了确保只有一个线程能够修改它我们定义了_windowReseting这个“信号量”。_count是一个计数器我们使用它确定是否“超速”。 public sealed class FixedWindowRateLimiter : IRateLimiter {private readonly long _windowTicks;private readonly int _permit;private long _nextWindowStartTimeTicks;private volatile int _count 0;public FixedWindowRateLimiter(TimeSpan window, int permit){_windowTicks window.Ticks;_permit permit;_nextWindowStartTimeTicks DateTimeOffset.UtcNow.Add(window).Ticks;}public bool TryAcquire(){// 超出时间窗口重置计数器并调整下一个时间窗口的开始时间var now DateTimeOffset.UtcNow.Ticks;var nextWindowStartTimeTicks nextWindowStartTimeTicks;if (now nextWindowStartTimeTicks Interlocked.CompareExchange(ref _nextWindowStartTimeTicks, now _windowTicks, nextWindowStartTimeTicks) nextWindowStartTimeTicks){Interlocked.Exchange(ref _count, 1);return true;}return _count _permit Interlocked.Increment(ref _count) _permit;} } 在实现的TryAcquire方法中我们先确定当前时间是否超过了设定的“下一个窗口开始时间”如果是则调用Interlocked.CompareExchange方法修改__nextWindowStartTimeTicks字段。成功修改__nextWindowStartTimeTicks的线程会调整窗口开始时间并重置计数器_count为1并返回True。如果计数器大于等于设定阈值方法返回False。否则我们让计数器1如果该值阈值返回True否则返回False。 IRateLimiter limiter new FixedWindowRateLimiter(window: TimeSpan.FromSeconds(2), permit: 2);var index 0; await Task.WhenAll( Enumerable.Range(1, 100).Select(_ Task.Run(() {while (true){if (limiter.TryAcquire()){Console.WriteLine($[{DateTimeOffset.Now}]{Interlocked.Increment(ref index)});} }}))); 将FixedWindowRateLimiter应用到上面的演示程序依然能得到我们希望的输出结果。
http://www.w-s-a.com/news/281683/

相关文章:

  • h5美食制作网站模板下载wordpress大学百度云
  • 零陵做网站建立网站的公司平台
  • 某企业电子商务网站建设网站开发实验结论
  • 自己做的网站突然打不开杭州哪些做网站公司好
  • 株洲专业建设网站免费cms内容管理系统
  • 网上建立网站赚钱网站建设方案书纯文字
  • 专业网站设计哪家好it外包合同模板
  • 个人网站备案都需要什么中小企业服务网
  • 佛山网站建设哪个在公司网站投简历该怎么做
  • 八戒网站做推广老域名全部失效请拿笔记好
  • iss服务器网站建设甘肃建设厅网站执业注册中心
  • 域名访问网站 过程网站 免费 托管运营
  • 下单的网站建设教程wordpress php7.1
  • 爱网站查询怎么做网站的图片跳转
  • 阿里云建站百度收录吗北京的设计公司排名
  • 网站制作方案包含哪些内容布吉网站建设方案
  • 吉林省建设安全信息网站宜宾市建设工程质量监督站网站
  • 镇江网站建设远航网络帝国cms 网站地图 自定义
  • 金融网站模板源代码net网站是国际域名吗
  • 北京高端网站建设价格企业网络托管公司
  • 规范门户网站建设没有网站可以做域名解析吗
  • pc 手机网站源码织梦网站修改教程视频教程
  • 江苏省建设厅副厅长网站济南网络建站模板
  • 工信部网站备案举报做网站竞争大吗
  • 网站建设经费管理注册了域名怎么做网站
  • 哪个着陆页网站福田做网站的公司
  • 网站备案完成后该如何做宁波公司网站建设价格
  • 标识标牌网站怎么做手机网站开发session
  • 怎样建设网站是什么样的广州做和改版网站的公司
  • 世界网站制作帮助做职业规划的网站