一輪
-
限流有哪幾種底層算法
常用4種限流算法介紹及比較
面試官:你知道的限流算法有哪些?
計數(shù)器(固定窗口)算法
每個時間周期只允許固定次數(shù)的請求以故,超出拒絕蜗细,容易產(chǎn)生的問題是臨界問題,
比如3s內(nèi)允許的最大請求量為1000,那么會出現(xiàn)2個極端:
極端情況1:
??第1s請流量為10,
??第2s請流量為10,
??第3s請流量突然激增到980.這意味著在這一刻,有大量的請求蜂擁而至,假設(shè)服務(wù)每秒能處理的上線為800/1s,但是此刻卻有超過這個量級的請求量,那么后果是不堪設(shè)想的.
極端情況2:
??第1s請流量突然就達(dá)到990,
??留給后續(xù)第2s,3s的可請求數(shù)量就非常少了,可能會出現(xiàn)大量的拒絕請求滑動窗口算法
滑動窗口算法是將時間周期分為N個小周期怒详,分別記錄每個小周期內(nèi)訪問次數(shù)炉媒,并且根據(jù)時間滑動刪除過期的小周期。
滑動窗口的格子劃分的越多昆烁,那么滑動窗口的滾動就越平滑吊骤,限流的統(tǒng)計就會越精確。
此算法可以很好的解決固定窗口算法的臨界問題静尼。漏桶算法
漏桶算法是訪問請求到達(dá)時直接放入漏桶白粉,如當(dāng)前容量已達(dá)到上限(限流值),則進(jìn)行丟棄(觸發(fā)限流策略)鼠渺。漏桶以固定的速率進(jìn)行釋放訪問請求(即請求通過)鸭巴,直到漏桶為空。
實現(xiàn):用隊列保存請求拦盹,用ScheduledThreadPoolExecutor(支持定時任務(wù)的線程池)來定時從隊列中取請求來執(zhí)行-
令牌桶算法
令牌桶算法可以說是對漏桶算法的改進(jìn)奕扣。漏桶算法能限制請求的速率。而令牌桶算法在限制請求速率的同時還允許一定程度的突發(fā)調(diào)用
算法過程:- 一直放令牌掌敬,如果令牌桶達(dá)到上限則丟棄令牌惯豆,假設(shè)每秒放10個
- 可以應(yīng)對一定程度的流量激增,如此時令牌桶有100個令牌奔害,突然發(fā)生200次調(diào)用楷兽,則此時最開始的100次請求可以正常調(diào)用,后續(xù)的請求才會以10個/s的速率來調(diào)用
實現(xiàn):用隊列保存令牌华临,用ScheduledThreadPoolExecutor來定時放令牌
-
Redis緩存的數(shù)據(jù)量大概有多少
-
Kafka使用過程中有沒有遇到什么問題
-
Kafka 輪詢刪除日志芯杀,對高性能的讀寫有影響嗎 零拷貝
-
Kafka 使用ZK 選舉,寫入主broker雅潭,副本怎樣同步揭厚,同步機(jī)制有哪些
ZK在Kafka中的作用
Zookeeper 在 Kafka 中的作用- broker注冊
- topic注冊
- 生產(chǎn)者負(fù)載均衡
- 消費(fèi)者負(fù)載均衡
5.消費(fèi)者注冊
ZK數(shù)據(jù)同步方式
在初始化階段,zk 的 learner會優(yōu)先初始化以全量同步方式來同步數(shù)據(jù)
learner先向leader注冊扶供,上報peerLastZxid
-
ZK 很多機(jī)器都往zk寫入數(shù)據(jù)的話 會有什么問題
-
NG 負(fù)載均衡的配置 NG會開發(fā)一些腳本嗎
-
CAP有了解嗎 ZK 是哪種
zk是CP系統(tǒng)
不能保證可用性 也就是在極端環(huán)境下筛圆,ZooKeeper可能會丟棄一些請求,消費(fèi)者程序需要重新請求才能獲得結(jié)果
-
ZK主從選舉保證的什么
-
Java的多線程用過嗎
-
定時的線程池椿浓,線程是一開始初始化好的太援,還是新來任務(wù)之后陸續(xù)初始化的闽晦?
-
如果想new出現(xiàn)線程池之后直接初始化好所有的核心線程數(shù),怎么實現(xiàn)
-
用過ThreadLocal 嗎 什么場景提岔?內(nèi)存泄漏的風(fēng)險
-
強(qiáng)引用仙蛉,弱引用,虛引用
在Java中碱蒙,我們的垃圾回收機(jī)制回收垃圾的時候就會根據(jù)對象的引用荠瘪,判斷對象是否可以被垃圾回收,這里有兩種:
- 引用計數(shù)法:為每個對象添加一個引用計數(shù)器赛惩,每當(dāng)有一個引用指向它時哀墓,計數(shù)器就加一,當(dāng)引用失效時坊秸,計數(shù)器減一麸祷,當(dāng)計數(shù)器為0時,則認(rèn)為該對象可以被回收褒搔。
- 可達(dá)性分析算法(GC roots)從一個被稱為GC roots的對象開始往下搜索阶牍,如果一個對象到GC roots沒有任何引用鏈相連,則說明此對象不可用星瘾。
對象的引用被劃分為4種級別走孽,從而使程序能更加靈活地控制對象的生命周期。這4種級別由高到低依次為:強(qiáng)引用琳状、軟引用磕瓷、弱引用和虛引用。
-
k8s有了解嗎
二輪
-
sonar會開發(fā)規(guī)則嗎
-
代碼掃描有什么收獲
-
快排的思路 是穩(wěn)定的嗎念逞?
-
堆排序
-
鏈表怎么判斷有環(huán)
-
二叉樹的鏡像
-
ThreadLocal的原理 key是什么
key是ThreadLocal類的實例對象困食,value為用戶的值
-
stream group是什么意思
-
多線程中 join yeild
wait()方法的作用是將當(dāng)前運(yùn)行的線程掛起(即讓其進(jìn)入阻塞狀態(tài)),直到notify或notifyAll方法來喚醒線程.
有了對wait方法原理的理解翎承,notify方法和notifyAll方法就很容易理解了硕盹。既然wait方式是通過對象的monitor對象來實現(xiàn)的,所以只要在同一對象上去調(diào)用notify/notifyAll方法叨咖,就可以喚醒對應(yīng)對象monitor上等待的線程了瘩例。notify和notifyAll的區(qū)別在于前者只能喚醒monitor上的一個線程,對其他線程沒有影響甸各,而notifyAll則喚醒所有的線程
sleep方法的作用是讓當(dāng)前線程暫停指定的時間(毫秒)垛贤,sleep方法是最簡單的方法,在上述的例子中也用到過趣倾,比較容易理解聘惦。唯一需要注意的是其與wait方法的區(qū)別。最簡單的區(qū)別是誊酌,wait方法依賴于同步部凑,而sleep方法可以直接調(diào)用露乏。而更深層次的區(qū)別在于sleep方法只是暫時讓出CPU的執(zhí)行權(quán)碧浊,并不釋放鎖涂邀。而wait方法則需要釋放鎖。
yield方法的作用是暫停當(dāng)前線程箱锐,以便其他線程有機(jī)會執(zhí)行比勉,不過不能指定暫停的時間,并且也不能保證當(dāng)前線程馬上停止驹止。yield方法只是將Running狀態(tài)轉(zhuǎn)變?yōu)镽unnable狀態(tài)浩聋。
join方法的作用是父線程等待子線程執(zhí)行完成后再執(zhí)行,換句話說就是將異步執(zhí)行的線程合并為同步的線程臊恋。
-
volitile 內(nèi)存可見性的底層原理
-
Kafka看過源碼嗎衣洁?
三輪
-
研發(fā)效能平臺為什么能提高效率?
-
kafka 為什么快
零拷貝技術(shù)抖仅,
兩種零拷貝方案 MMap sendfile
MMap三次拷貝 sendfile兩次拷貝坊夫,多出的一次是CPU拷貝 從內(nèi)核拷貝到用戶進(jìn)程
rocketMQ使用MMAP Kafka使用sendfile 所以rocketmq能達(dá)到十萬級別,kafka能達(dá)到百萬級別
但為什么rocketmq不適用sendfile 因為rocketmq可以處理消息的順序撤卢,消息的過濾
Kafka不能完成环凿,因為sendfile壓根就沒有到達(dá)數(shù)據(jù)應(yīng)用層,內(nèi)核中無法處理這些操作放吩。
-
消息隊列怎么保證不丟消息
-
filebeat如果采集過智听,怎么再采集一次 配置在哪里
-
list里學(xué)生對象哥艇,根據(jù)學(xué)生年齡排序
-
HashMap與hashtable的區(qū)別
-
synchronize修飾一個方法门岔,這個方法如果是靜態(tài)的和非靜態(tài)的有什么區(qū)別
使用synchronized修飾靜態(tài)方法和非靜態(tài)方法有什么區(qū)別 -
Java默認(rèn)有哪些線程池抡草,
-
spring中事務(wù)底層是怎樣實現(xiàn)的休里,
-
如果讓你實現(xiàn)一個事務(wù)蜒秤,該怎么來做