精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

兩種基于時(shí)間窗口的限流器的簡單實(shí)現(xiàn)

開發(fā) 前端
在實(shí)現(xiàn)的TryAcquire方法中,我們先確定當(dāng)前時(shí)間是否超過了設(shè)定的“下一個(gè)窗口開始時(shí)間”,如果是則調(diào)用Interlocked.CompareExchange方法修改__nextWindowStartTimeTicks字段。

之前開發(fā)的一款基于OpenTelemetry的Tracing組件需要使用基于速率限制(Rate Limiting)的跟蹤采樣策略,本想使用現(xiàn)有的解決方案,比如System.Threading.RateLimiting命名空間下的RateLimiter。大體看了RateLimiter的三種實(shí)現(xiàn)(固定窗口、滑動窗口和令牌桶),覺得過于相對復(fù)雜了點(diǎn),代碼還涉及到鎖,而且提供的功能我也不太需要,于是嘗試實(shí)現(xiàn)一種簡單且無鎖解決方案。

一、滑動時(shí)間窗口

我為RateLimiter定義了如下這個(gè)簡單的IRateLimiter接口,唯一的無參方法TryAcquire利用返回的布爾值確定當(dāng)前是否超出設(shè)定的速率限制。我只提供的兩種基于時(shí)間窗口的實(shí)現(xiàn),如下所示的基于“滑動時(shí)間窗口”的實(shí)現(xiàn)類型SliddingWindowRateLimiter,我們在構(gòu)造的時(shí)候指定時(shí)間窗口和閾值。SliddingWindowRateLimiter采用一種“討巧”的實(shí)現(xiàn),它直接利用了BoundedChannel<DateTimeOffset>對象,我們將指定的閾值作為它的最大容量。

public interface IRateLimiter
{
    bool TryAcquire();
}

public sealed class SliddingWindowRateLimiter: IRateLimiter
{
    private readonly TimeSpan _window;
    private readonly ChannelReader<DateTimeOffset> _reader;
    private readonly ChannelWriter<DateTimeOffset> _writer;
    public SliddingWindowRateLimiter(TimeSpan window, int permit)
    {
        _window = window;
        var options = new BoundedChannelOptions (permit)
        {
            FullMode = BoundedChannelFullMode.Wait,
            SingleReader = false,
            SingleWriter = true
        };
        var channel = Channel
            .CreateBounded<DateTimeOffset>(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();
            }
        }
    }
}

在實(shí)現(xiàn)的TryAcquire方法中,我們試著將當(dāng)前時(shí)間戳寫入這個(gè)Channel,并將寫入的結(jié)果(成功或者失敗)作為返回值。為了讓Channel中只包含指定時(shí)間窗口的時(shí)間戳,我們利用一個(gè)LongRuning的Task執(zhí)行Trim方法對過期的時(shí)間戳進(jìn)行“裁剪”。Trim會調(diào)用ChannelReader的TRyPeek方法,如果返回False,意味著Channel為空,此時(shí)會等待一段窗口時(shí)間再進(jìn)行“裁剪”。如果提取出來時(shí)間戳在Now-Window與當(dāng)前時(shí)間之間,意味著Channel里面的時(shí)間戳均在設(shè)定的窗口內(nèi),此時(shí)同樣需要等待,等待時(shí)間為Window - (Now - Timestamp);只有在提取的時(shí)間超出窗口范圍,我們才需要將其從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)}");
            } 
        }
    })));

我們在上面的演示程序中使用這個(gè)SliddingWindowRateLimiter,設(shè)定的限速規(guī)則為 2/2s。我們創(chuàng)建了100個(gè)Task并發(fā)地調(diào)用這個(gè)SliddingWindowRateLimiter,并將它返回True時(shí)的時(shí)間戳顯示出來,具體輸出如下所示。

圖片圖片

二、固定時(shí)間窗口

如下這個(gè)FixedWindowRateLimiter類型是針對“固定窗口”的實(shí)現(xiàn),字段_windowTicks和_permit同樣表示時(shí)間窗口的時(shí)長(這里我們使用Int64類型的Ticks屬性)和閾值。_nextWindowStartTimeTicks表示下一次固定窗口的起始時(shí)間,這個(gè)需要動態(tài)調(diào)整,為了確保只有一個(gè)線程能夠修改它,我們定義了_windowReseting這個(gè)“信號量”。_count是一個(gè)計(jì)數(shù)器,我們使用它確定是否“超速”。

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()
    {
        // 超出時(shí)間窗口,重置計(jì)數(shù)器,并調(diào)整下一個(gè)時(shí)間窗口的開始時(shí)間
        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;
    }
}

在實(shí)現(xiàn)的TryAcquire方法中,我們先確定當(dāng)前時(shí)間是否超過了設(shè)定的“下一個(gè)窗口開始時(shí)間”,如果是則調(diào)用Interlocked.CompareExchange方法修改__nextWindowStartTimeTicks字段。成功修改__nextWindowStartTimeTicks的線程會調(diào)整窗口開始時(shí)間,并重置計(jì)數(shù)器_count為1,并返回True。如果計(jì)數(shù)器大于等于設(shè)定閾值,方法返回False。否則我們讓計(jì)數(shù)器+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應(yīng)用到上面的演示程序,依然能得到我們希望的輸出結(jié)果。

圖片 圖片

責(zé)任編輯:武曉燕 來源: 大內(nèi)老A
相關(guān)推薦

2023-07-10 07:58:45

2009-06-15 15:02:48

Spring定時(shí)器

2010-08-11 14:22:26

Flex彈出窗口

2025-01-26 00:00:25

限流組件HTTP

2010-10-14 14:33:15

MySQL多表聯(lián)查

2021-12-08 10:47:35

RabbitMQ 實(shí)現(xiàn)延遲

2022-02-21 08:18:38

option編程模式

2010-07-14 10:30:26

Perl多線程

2012-10-16 09:40:38

洗牌算法

2010-09-07 09:18:16

DIV彈出窗口

2010-08-13 12:54:20

Flex彈出窗口

2012-11-29 10:45:31

2010-05-28 09:49:48

MySQL遠(yuǎn)程連接

2010-11-25 10:21:20

MySql查詢時(shí)間段

2009-07-02 15:50:36

JSP體系結(jié)構(gòu)

2009-09-14 19:25:09

Ruby form

2021-05-27 10:57:01

TCP定時(shí)器網(wǎng)絡(luò)協(xié)議

2013-05-27 14:31:34

Hadoop 2.0

2010-10-11 10:31:51

MySQL分區(qū)

2010-07-13 10:47:18

Perl面向?qū)ο?/a>
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

91欧美日韩在线| 888av在线| 国产欧美91| 国产亚洲一本大道中文在线| 欧美亚洲国产视频小说| 亚洲专区区免费| 77导航福利在线| 成人丝袜视频网| 国产精品久久久久久久电影| avtt天堂在线| 亚洲v天堂v手机在线| 欧美男男青年gay1069videost| 欧美午夜欧美| 国产偷拍一区二区| 免费成人网www| 一区二区免费在线播放| 久久免费视频观看| 亚洲 小说 欧美 激情 另类| 欧州一区二区三区| 欧美日韩色婷婷| 亚洲欧美一二三| 国产精品视频一区在线观看| 91蜜臀精品国产自偷在线| 亚洲第一页在线| 天天干天天操天天玩| 欧美aa在线| 亚洲人一二三区| 日韩久久不卡| 香蕉视频911| 成人一区在线看| 成人激情在线观看| 久久久久在线视频| 亚洲毛片视频| 免费不卡在线观看av| 日韩欧美黄色网址| 综合亚洲色图| 亚洲精品成a人在线观看| 三上悠亚在线一区| 高清日韩av电影| av在线不卡免费看| 俄罗斯精品一区二区三区| 久草视频在线资源| 91精品久久久久久久蜜月| 一区二区三区四区视频| 中文字幕在线看高清电影| 精品嫩草影院| 亚洲精品在线三区| www.四虎精品| av第一福利在线导航| 亚洲精品一二三| 在线视频不卡一区二区| www.日韩高清| 国产精品88av| 97超碰最新| 国产浮力第一页| 精品亚洲欧美一区| 成人在线视频网| 91无套直看片红桃在线观看| 国产一精品一av一免费爽爽| 亚洲久本草在线中文字幕| 亚洲精品成人a8198a| 国产免费av高清在线| 国产亚洲欧洲997久久综合 | 欧美区亚洲区| 九九精品在线视频| 青青草精品在线视频| 欧美特黄a级高清免费大片a级| 亚洲精选一区二区| 波多野结衣三级视频| 粉嫩av一区二区三区四区五区| 亚洲国产精品自拍| 精品少妇人妻av免费久久洗澡| 日本精品在线| 亚洲欧美日韩成人高清在线一区| 欧美日韩一区综合| 男女av在线| 国产精品丝袜在线| 久久精品magnetxturnbtih| 四虎影院在线域名免费观看| 日韩精品电影一区亚洲| 国产精品69久久久久| 中文字幕一区二区三区免费看| 99综合精品| 国产精品久久二区| av无码精品一区二区三区宅噜噜| 日韩成人一区二区三区在线观看| 97视频com| 区一区二在线观看| 亚洲欧美网站| 国产精品影片在线观看| 日本中文字幕网| 欧美一级播放| 成人网在线观看| 天堂网av2014| 成人sese在线| 国产又爽又黄的激情精品视频| 少妇太紧太爽又黄又硬又爽| 蜜臀av一区二区| 国产a级全部精品| 国产又粗又黄视频| 99久久久久久| 国产精品一区二区a| 国产黄a三级三级看三级| 2021久久国产精品不只是精品| 精品国产一区二区三区四区精华| 噜噜噜久久,亚洲精品国产品| 国产大陆精品国产| 欧美精品一区三区在线观看| 国产原创在线观看| 岛国av一区二区三区| av在线免费看片| 国产成人久久精品麻豆二区| 日韩欧美资源站| 国产亚洲精品熟女国产成人| 狠久久av成人天堂| 国产在线999| 免费福利在线观看| 亚洲精品中文在线| 91女神在线观看| 亚洲人成网www| 97精品一区二区三区| 国产精品嫩草影院桃色| 国产亚洲欧美中文| 久久久久久久久久网| 美女视频在线免费| 日韩丝袜情趣美女图片| 色哟哟无码精品一区二区三区| 国产图片一区| 国产亚洲xxx| 国产乱国产乱老熟| 成人国产精品免费观看视频| 久久综合久久久| 亚洲欧美日韩动漫| 樱花影视一区二区| 黄色片免费网址| 日韩成人精品一区| 国产精品久久久久高潮| 欧美婷婷久久五月精品三区| 久久久国产精华| 国产欧美日韩网站| 成人线上播放| 欧美激情视频在线| 亚洲成a人片77777精品| 亚洲人被黑人高潮完整版| 亚洲欧美自偷自拍另类| jiujiure精品视频播放| 国产成人精品久久久| 欧美色综合一区二区三区| 婷婷国产在线综合| 欧洲一级黄色片| 在线亚洲免费| 鲁丝一区二区三区免费| 午夜激情在线观看| 欧美日韩免费观看一区二区三区| www.黄色网| 欧美精品18| 国产精品播放| 超碰成人av| 亚洲精品在线观看www| 亚洲乱码国产乱码精品| 久久久99精品久久| 日韩av片网站| 久久久伦理片| 欧美在线视频一区二区| 69精品久久久| 成人在线综合网| 女人天堂av手机在线| 亚洲电影男人天堂| 国产精品久久久久久超碰 | 尤物网在线观看| 欧美夫妻性生活| 男女做爰猛烈刺激| 蜜臀久久99精品久久久画质超高清 | 亚洲色无码播放| 亚洲一区中文字幕永久在线| 91麻豆免费看| 日本在线观看免费视频| 亚洲xxx拳头交| 国产一区视频观看| 欧美va在线| 欧美不卡视频一区发布| 一本一道人人妻人人妻αv | 91精品视频观看| 少女频道在线观看免费播放电视剧| 在线免费不卡电影| 成人涩涩小片视频日本| 成人av在线影院| 999精品视频在线| 午夜精品久久99蜜桃的功能介绍| 国产综合视频在线观看| 青青青草视频在线| 亚洲免费影视第一页| 国产精品视频第一页| 午夜精品在线视频一区| 欧美特级aaa| 欧美日本中文| 97久久精品午夜一区二区| 亚洲色图美国十次| 亚洲免费视频观看| 中文字幕手机在线视频| 亚洲欧美日本在线| 日本xxxxxxxxx18| 国产成人午夜电影网| 毛葺葺老太做受视频| 黄色欧美日韩| 亚洲一区二区三区免费看| 日韩美女在线| 久久夜精品香蕉| 毛片免费在线| 欧美成人艳星乳罩| 中文字幕一区二区三区人妻四季 | 亚洲精品视频一二三| 国产精品高清乱码在线观看 | 国产伦理在线观看| 日本中文在线一区| 一区二区不卡在线| 免费精品国产| 国产欧美日韩一区二区三区| 亚洲v.com| 亚洲第一区在线| 影音先锋国产资源| 欧美性生交xxxxx久久久| 欧美成人乱码一二三四区免费| 欧美xxav| 欧美裸体网站| 欧美电影完整版在线观看| 亚洲bt欧美bt日本bt| 99欧美精品| 日本久久久久久| 免费看男女www网站入口在线 | 日韩在线免费观看av| 成人黄色777网| 绯色av蜜臀vs少妇| 国产精品一区久久久久| 成人中文字幕在线播放| 欧美涩涩视频| 国产情侣第一页| 国产精品九九| 久久久久久久9| 欧美午夜国产| 国产在线无码精品| 台湾佬综合网| 91免费版网站入口| **日韩最新| 国产欧美一区二区三区久久| 777午夜精品电影免费看| 日韩美女在线观看| 欧美黑人一区| 国产精品久久9| 国产极品久久久久久久久波多结野| 久久国产精品影片| av免费在线观| 亚洲国产91色在线| 成人午夜免费福利| 欧美性生活久久| 日韩欧美一级大片| 欧美日韩在线播放三区| 中文字幕日本人妻久久久免费 | 亚洲理论电影在线观看| 欧美日韩一区二区三区四区在线观看| 久久偷看各类wc女厕嘘嘘偷窃 | 91精品久久久久久久久久| 91九色美女在线视频| 久久久噜噜噜久久久| 国产精品25p| 日本精品视频在线| 福利成人导航| 欧美孕妇与黑人孕交| 三级成人在线| 国产91|九色| 性欧美超级视频| 国产日韩精品视频| 天堂va欧美ⅴa亚洲va一国产| 国产精品夜间视频香蕉| 国产精品一区二区三区四区在线观看 | 少妇高潮惨叫久久久久| 亚洲人午夜精品天堂一二香蕉| 国产又粗又猛又爽又黄的视频四季 | 日韩毛片久久久| 久久中文字幕在线视频| 香蕉视频网站在线观看| 欧美精品在线第一页| aaa在线播放视频| 国产精品日本精品| 午夜电影一区| 日韩久久久久久久久久久久久| 人人网欧美视频| 亚洲欧美日韩精品在线| 亚洲私拍自拍| 香蕉视频网站入口| 丰满放荡岳乱妇91ww| 久久久视频6r| 久久亚洲综合色一区二区三区| 中国极品少妇xxxx| 欧美激情一区二区在线| 免费麻豆国产一区二区三区四区| 亚洲欧美日韩一区二区| 日本三级欧美三级| 欧美无人高清视频在线观看| 丰满少妇被猛烈进入| 制服丝袜亚洲播放| av中文字幕免费在线观看| 日韩av在线不卡| 超碰在线最新| 日韩av电影手机在线| 国产精品一区二区美女视频免费看| 91热精品视频| 国产精品一区二区99| 真人做人试看60分钟免费| 日韩精品久久久久久| 少妇搡bbbb搡bbb搡打电话| 中文欧美字幕免费| 黄色在线视频网址| 日韩精品一区二区三区在线| eeuss影院www在线播放| 在线观看91精品国产麻豆| 无码国产精品一区二区色情男同| 日韩精品久久久久久福利| www在线免费观看视频| 国产精品久久久久久久久久免费| 亚洲网站免费| 青青草成人激情在线| 亚洲国产裸拍裸体视频在线观看乱了中文 | 成人video亚洲精品| 久久久久国色av免费观看性色| 超碰高清在线| 国产精品成人一区二区三区| 最新亚洲精品| 99爱视频在线| 99久久免费视频.com| 久久久久久久国产视频| 欧美性极品少妇精品网站| 丁香花免费高清完整在线播放| 日韩av在线免费观看| 超碰在线影院| 日本精品中文字幕| 国产aⅴ精品一区二区三区久久| 影音先锋男人的网站| 久久99精品久久久久婷婷| 丁香激情五月少妇| 在线免费观看日本一区| 国产一级片在线| 国产91色在线免费| 欧美精品影院| 女人床在线观看| 国产精品白丝jk黑袜喷水| 爱爱的免费视频| 欧美午夜精品伦理| 黄色在线观看网| 国产成人精品在线| 亚洲精品黑牛一区二区三区| 欧美一区二区高清在线观看| 久久精品二区三区| 中文字幕 91| 成人福利视频网站| 九九热国产视频| 日韩av在线天堂网| 另类图片综合电影| 日本高清视频一区二区三区 | 国产传媒一区在线| 免费观看a级片| 欧美酷刑日本凌虐凌虐| 国产黄色在线网站| av一本久道久久波多野结衣| 亚洲天堂男人| 青青草成人免费视频| 日本韩国欧美三级| 九七久久人人| 国产精品久久久久免费a∨| 美国成人xxx| 欧美激情精品久久久久久小说| av在线免费不卡| 欧美人一级淫片a免费播放| 日韩在线观看网站| 6080成人| 日本阿v视频在线观看| 99久久精品费精品国产一区二区| 久久国产露脸精品国产| 精品亚洲一区二区三区在线观看| 91超碰在线播放| 日韩精品不卡| 日日摸夜夜添夜夜添亚洲女人| 性久久久久久久久久久| 26uuu亚洲综合色欧美| 午夜精品免费观看| 欧美另类极品videosbest最新版本 | 亚洲国产精品综合小说图片区| www.国产黄色| 欧美中文字幕在线视频| 91精品国产乱码久久久久久| 国产真实乱人偷精品| 欧美日韩激情一区二区| 国内在线免费视频| 亚洲 国产 欧美一区| 日本欧美在线观看| 久久久久99精品| 久久精品在线播放| 四虎地址8848精品| 欧美日韩在线一| 久久尤物电影视频在线观看|