最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

spring?項(xiàng)目實(shí)現(xiàn)限流方法示例

 更新時(shí)間:2022年07月15日 11:08:54   作者:java3y  
這篇文章主要為大家介紹了spring項(xiàng)目實(shí)現(xiàn)限流的方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

01、為什么AUSTIN項(xiàng)目需要限流

眾所周知,服務(wù)器能處理的請(qǐng)求數(shù)是有限的,如果請(qǐng)求量特別大,我們就可能需要做限流。

限流處理的姿勢:要么就讓請(qǐng)求等待,要么就把請(qǐng)求給扔了

從系統(tǒng)架構(gòu)來看,我們的統(tǒng)一處理入口在austin-api接入層上,austin-api接入層做完簡單的參數(shù)校驗(yàn)以及參數(shù)拼接后,就將請(qǐng)求轉(zhuǎn)發(fā)到消息隊(duì)列上了

按正常來說,因?yàn)榻恿讼㈥?duì)列且接入層沒有什么耗時(shí)的操作,那對(duì)外的接口壓力不大的。

沒錯(cuò)的,austin要接入限流也并不是在austin-api接入層上做,是在austin-handler消息處理下發(fā)層。austin-handler消息處理下發(fā)層我們是用線程池去隔離不同的消息渠道不同的消息類型。

在系統(tǒng)本身上其實(shí)沒有性能相關(guān)的問題,但我們下發(fā)的渠道可能就需要我們?nèi)タ刂普{(diào)用的速率。

騰訊云短信默認(rèn)限制3000次/秒調(diào)用下發(fā)接口

釘釘渠道對(duì)應(yīng)用消息和群機(jī)器人消息都有接口調(diào)用的限制

....

在保證下發(fā)速度的前提下,為了讓業(yè)務(wù)方所下發(fā)的消息其用戶能正常接收到和下游渠道的穩(wěn)定性,我們需要給某些渠道進(jìn)行限流

于是在這個(gè)背景下,我目前定義了兩種限流策略:

1、按照請(qǐng)求數(shù)限流

2、按照下發(fā)用戶數(shù)限流

02、如何實(shí)現(xiàn)限流?

想要實(shí)現(xiàn)限流,擺在我們面前有兩個(gè)選擇:

1、單機(jī)限流

2、分布式限流

咋一看,線上不可能只部署一臺(tái)機(jī)器去發(fā)送整個(gè)公司的消息推送的,我們的系統(tǒng)應(yīng)用在線上環(huán)境絕對(duì)是集群部署的,那肯定就需要上分布式限流了,對(duì)吧?

但實(shí)際上分布式限流實(shí)現(xiàn)并不簡單,目前分布式限流的方案一般借助兩個(gè)中間件

1、Redis

2、Sentinel

我們可能會(huì)用Redis的setnx/incrby+expire命令(從而實(shí)現(xiàn)計(jì)數(shù)器、令牌桶限流)/zset數(shù)據(jù)結(jié)構(gòu)(從而實(shí)現(xiàn)滑動(dòng)窗口限流)

Redis實(shí)現(xiàn)的限流想要比較準(zhǔn)確,無論是哪種方式,都要依靠lua腳本

而Sentinel支持單機(jī)限流和分布式限流,Sentinel分布式限流需要部署Token服務(wù)器

對(duì)于分布式限流而言,不管用哪一種方案,使用的成本和技術(shù)挑戰(zhàn)都是比較大的。

如果用單機(jī)限流的話,那就簡單得多了,省事直接用Guava包下的RateLimiter就完了。缺點(diǎn)就在于:它只能控制單機(jī)的限流,如果發(fā)生了服務(wù)器擴(kuò)容和縮容,它是感知不到的。

有的人就給出了方案:那我用Zookeeper監(jiān)聽服務(wù)器的數(shù)量不就好了嗎。理論上確實(shí)是這樣的:每臺(tái)機(jī)器限流值=限流總值/服務(wù)器數(shù)量

不過這又要去依賴Zookeeper,Zookeeper集群本身也有一堆狀態(tài)相關(guān)的問題。

我是怎么實(shí)現(xiàn)的?單機(jī)限流一把梭

03、代碼設(shè)計(jì)

從上面的描述可以看到,austin的限流我是要做在具體渠道上的,根據(jù)現(xiàn)有的代碼設(shè)計(jì)我要的就是在各個(gè)的Handler上寫上限流的代碼。

我本身就設(shè)計(jì)了BaseHandler抽象類作為模板方法設(shè)計(jì)模式,此次限流的設(shè)計(jì)我的是:

1、將flowControl定義為abstract抽象方法,子類渠道去實(shí)現(xiàn)限流的代碼

2、子類在初始化的時(shí)候定義限流參數(shù),BaseHandler父類根據(jù)限流參數(shù)統(tǒng)一實(shí)現(xiàn)限流的邏輯

我選擇了第二種方式,主要是我認(rèn)為對(duì)于各個(gè)渠道而言,只是限流值是不同的,限流的邏輯應(yīng)該都是一樣的,沒必要在每個(gè)子類上實(shí)現(xiàn)類似的邏輯。

而限流的邏輯就比較簡單了,主要就使用RateLimit提供的易用API實(shí)現(xiàn)

沒錯(cuò),限流值的大小我是配置在apollo分布式配置中心的。假設(shè)以后真的要擴(kuò)縮容了,那到時(shí)候提前把分布式配置中心的值給改掉,也能解決一部分的問題。

04、總結(jié)

扯了半天,原來就用了Guava包的RateLimit實(shí)現(xiàn)了單機(jī)限流,就這么簡單,只是把限流值配置在分布式配置中心上而已。

很多時(shí)候,設(shè)計(jì)簡單的代碼可能實(shí)現(xiàn)并不完美,并不智能,并不優(yōu)雅,但它付出的代價(jià)往往是最小的。

雖說如此,如果大家想要了解Redis+lua實(shí)現(xiàn)的同學(xué)可以fetch下austin最新的代碼,就我寫文章這段時(shí)間里,已經(jīng)有老哥提了pull request用Redis+lua實(shí)現(xiàn)了滑動(dòng)窗口去重的功能了,本質(zhì)上是一樣的。我已經(jīng)merge到master分支了。

austin消息推送平臺(tái)項(xiàng)目源碼Gitee鏈接:gitee.com/austin

austin消息推送平臺(tái)項(xiàng)目源碼GitHub鏈接:github.com/austin

以上就是spring 項(xiàng)目實(shí)現(xiàn)限流方法示例的詳細(xì)內(nèi)容,更多關(guān)于spring 項(xiàng)目限流的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Spring搭配Ehcache實(shí)例解析

    Spring搭配Ehcache實(shí)例解析

    這篇文章主要為大家詳細(xì)介紹了Spring搭配Ehcache實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Spring啟動(dòng)指定時(shí)區(qū)的兩種方法

    Spring啟動(dòng)指定時(shí)區(qū)的兩種方法

    最近項(xiàng)目啟動(dòng),時(shí)間要修改成東七區(qū)時(shí)間,本文主要介紹了Spring啟動(dòng)指定時(shí)區(qū)的兩種方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-11-11
  • Java手寫持久層框架的詳細(xì)代碼

    Java手寫持久層框架的詳細(xì)代碼

    這篇文章主要介紹了Java手寫持久層框架,本文適合有一定java基礎(chǔ)的同學(xué),通過自定義持久層框架,可以更加清楚常用的mybatis等開源框架的原理,需要的朋友可以參考下
    2022-08-08
  • Java CAS操作與Unsafe類詳解

    Java CAS操作與Unsafe類詳解

    這篇文章主要介紹了Java CAS操作與Unsafe類的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-02-02
  • 深入理解java泛型詳解

    深入理解java泛型詳解

    這篇文章主要介紹了Java中的泛型詳解,什么是泛型,作用以及基礎(chǔ)實(shí)例等,喜歡的朋友可以參考
    2017-04-04
  • 詳解java中spring里的三大攔截器

    詳解java中spring里的三大攔截器

    在本篇文章里我們給大家詳細(xì)講述了java中spring里的三大攔截器相關(guān)知識(shí)點(diǎn)以及用法代碼,需要的朋友們學(xué)習(xí)下。
    2018-10-10
  • @RefreshScope(nacos配置熱更新方式)

    @RefreshScope(nacos配置熱更新方式)

    文章主要介紹了Spring和Nacos對(duì)`@RefreshScope`注解的處理方式,Spring在每次調(diào)用被`@RefreshScope`注解的bean的屬性時(shí),會(huì)先從本地緩存獲取,如果緩存不存在則重新創(chuàng)建并獲取最新環(huán)境配置
    2024-12-12
  • PowerJob的TransportServiceAware工作流程源碼解讀

    PowerJob的TransportServiceAware工作流程源碼解讀

    這篇文章主要介紹了PowerJob的TransportServiceAware工作流程源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • 深入了解java內(nèi)存分配和回收策略

    深入了解java內(nèi)存分配和回收策略

    下面小編就為大家?guī)硪黄钊肓私鈐ava內(nèi)存分配和回收策略。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • SpringBoot2 整合Nacos組件及環(huán)境搭建和入門案例解析

    SpringBoot2 整合Nacos組件及環(huán)境搭建和入門案例解析

    這篇文章主要介紹了SpringBoot2 整合Nacos組件,環(huán)境搭建和入門案例詳解,在整合springboot2時(shí)注意版本 0.2.x.RELEASE 對(duì)應(yīng)的是 Spring Boot 2.x 版本,版本 0.1.x.RELEASE 對(duì)應(yīng)的是 Spring Boot 1.x 版本,具體內(nèi)容詳情跟隨小編一起看看吧
    2022-03-03

最新評(píng)論

健康| 永州市| 郸城县| 丽江市| 大石桥市| 衡山县| 财经| 冀州市| 云和县| 溧水县| 阿巴嘎旗| 辽宁省| 成安县| 行唐县| 青海省| 静乐县| 启东市| 通州市| 化隆| 克拉玛依市| 凤庆县| 虞城县| 洪湖市| 安泽县| 金沙县| 石门县| 长垣县| 响水县| 建平县| 梁河县| 沂南县| 富顺县| 德州市| 施甸县| 永定县| 古蔺县| 顺义区| 望奎县| 额尔古纳市| 密山市| 宁德市|