字節(jié)后端開發(fā)面經(jīng)一面
去年的存貨
面試公司:字節(jié)【基架部門】
面試崗位:后端開發(fā)
面試問題:
1.實(shí)習(xí)項(xiàng)目
2.有哪些方案可以避免流量高峰造成的問題
- 消息隊(duì)列削峰填谷
- 緩存預(yù)熱
- 負(fù)載均衡,分散請(qǐng)求
- 限流和降級(jí)
3.了解常用的限流或者降級(jí)的算法嘛?描述一下原理?
固定窗口計(jì)數(shù)器:按照時(shí)間段劃分窗口,有一次請(qǐng)求就+1,最為簡(jiǎn)單的算法,但是限流不夠平滑且無法應(yīng)對(duì)突然激增的流量。滑動(dòng)窗口計(jì)數(shù)器:通過將窗口再細(xì)分,并且按照時(shí)間“滑動(dòng)”來解決突破限制的問題,但是時(shí)間區(qū)間的精度越高,算法所需的空間容量就越大。漏桶:請(qǐng)求類似水滴,先放到桶里,服務(wù)的提供方則按照固定的速率從桶里面取出請(qǐng)求并執(zhí)行。缺陷也很明顯,當(dāng)短時(shí)間內(nèi)有大量的突發(fā)請(qǐng)求時(shí),即便此時(shí)服務(wù)器沒有任何負(fù)載,每個(gè)請(qǐng)求也都得在隊(duì)列中等待一段時(shí)間才能被響應(yīng)。令牌桶:往桶里面發(fā)放令牌,每個(gè)請(qǐng)求過來之后拿走一個(gè)令牌,然后只處理有令牌的請(qǐng)求。令牌桶滿了則多余的令牌會(huì)直接丟棄。令牌桶算法既能夠?qū)⑺械恼?qǐng)求平均分布到時(shí)間區(qū)間內(nèi),又能接受服務(wù)器能夠承受范圍內(nèi)的突發(fā)請(qǐng)求,因此是目前使用較為廣泛的一種限流算法。
4.滑動(dòng)窗口相對(duì)固定窗口算法解決了什么問題
相比于固定窗口算法,滑動(dòng)窗口計(jì)數(shù)器算法可以應(yīng)對(duì)突然激增的流量。
5.【手撕】字符串的z型變換
6.操作系統(tǒng),進(jìn)程和線程的區(qū)別
進(jìn)程是操作系統(tǒng)資源分配的基本單位,線程是cpu調(diào)度的基本單位。進(jìn)程是一個(gè)程序的動(dòng)態(tài)運(yùn)行實(shí)例,而線程是進(jìn)程當(dāng)中的一條執(zhí)行流程。進(jìn)程包含多個(gè)線程,線程從屬于一個(gè)進(jìn)程;各進(jìn)程間相互獨(dú)立,但線程不一定,同一個(gè)進(jìn)程的多個(gè)線程可能相互影響。進(jìn)程切換的開銷顯著高于線程切換。
7.threadlocal的原理
就是線程本地變量,如果創(chuàng)建了一個(gè)ThreadLocal變量,那么訪問這個(gè)變量的每個(gè)線程都會(huì)有這個(gè)變量的一個(gè)本地拷貝,多個(gè)線程操作這個(gè)變量的時(shí)候,實(shí)際是操作自己本地內(nèi)存里面的變量,從而起到線程隔離的作用,避免了線程安全問題。ThreadLocal的底層數(shù)據(jù)建構(gòu)就是ThreadLocalMap,它的key就是ThreadLocal的引用,值就是Object對(duì)象。
8.用戶的請(qǐng)求進(jìn)來,用戶的信息怎樣在一個(gè)請(qǐng)求內(nèi)傳遞?
在web應(yīng)用程序中,ThreadLocal可以用來存儲(chǔ)當(dāng)前請(qǐng)求的上下文信息,使得不同請(qǐng)求之間相互獨(dú)立
9.epoll?
當(dāng)調(diào)用epoll_create方法時(shí),Linux內(nèi)核會(huì)創(chuàng)建一個(gè)eventpoll結(jié)構(gòu)體,用于存放通過epoll_ctl方法向epoll對(duì)象中添加進(jìn)來的事件。這些事件都會(huì)掛載在紅黑樹中,如此,重復(fù)添加的事件就可以通過紅黑樹而高效的識(shí)別出來。而所有添加到epoll中的事件都會(huì)與設(shè)備(網(wǎng)卡)驅(qū)動(dòng)程序建立回調(diào)關(guān)系,也就是說,當(dāng)相應(yīng)的事件發(fā)生時(shí)會(huì)調(diào)用這個(gè)回調(diào)方法,它會(huì)將發(fā)生的事件添加到rdlist雙鏈表中。當(dāng)調(diào)用epoll_wait檢查是否有事件發(fā)生時(shí),只需要檢查eventpoll對(duì)象中的rdlist雙鏈表中是否有epitem元素即可。如果rdlist不為空,則把發(fā)生的事件復(fù)制到用戶態(tài),同時(shí)將事件數(shù)量返回給用戶。
10.項(xiàng)目的代碼結(jié)構(gòu)是怎樣的
微服務(wù)架構(gòu),ddd
11.流量是rpc進(jìn)來還是http進(jìn)來
12.介紹一下rpc和http在使用場(chǎng)景上的區(qū)別
rpc通常使用在分布式系統(tǒng)、跨語言調(diào)用、高性能服務(wù)中。http通常使用在網(wǎng)頁瀏覽、RESTful API、文件下載等
13.用rpc代替http會(huì)有什么問題???
14.http底層連接可以基于連接池嘛
15.了解golang嘛?了解golang的協(xié)程嗎
16.描述一下動(dòng)態(tài)規(guī)劃的核心思想?什么樣的問題可以用它去解決?
17.排序算法有哪些?挑選排序算法的時(shí)候要考量哪些?
考量:時(shí)間復(fù)雜度、空間復(fù)雜度、穩(wěn)定性、實(shí)現(xiàn)難度、數(shù)據(jù)規(guī)模和特性
18.快排是穩(wěn)定排序的算法嘛?哪些算法是穩(wěn)定排序的?
不是。穩(wěn)定排序的算法:冒泡排序、插入排序和歸并排序
19.紅黑樹相對(duì)于普通的樹有哪些特征?通常用來解決什么問題?
20.mysql的事務(wù)隔離級(jí)別?
21.讀已提交和可重復(fù)讀的底層區(qū)別?
22.mysql有哪些日志?
23.了解redolog嗎?
24.redolog的刷盤機(jī)制是怎樣的?
25.kafka和rocketmq在業(yè)務(wù)中使用場(chǎng)景上有什么區(qū)別?
26.git中版本管理的模型是什么?
Git 中的版本管理模型是圍繞快照(snapshot)的概念構(gòu)建的。每次提交(commit)都會(huì)記錄一個(gè)當(dāng)前所有文件的快照??煺瞻水?dāng)時(shí)整個(gè)目錄樹的狀態(tài),包括文件內(nèi)容和目錄結(jié)構(gòu)。
27.git的常見操作
28.git merge和rebase的區(qū)別
`git merge` 合并后的歷史記錄保留了所有分支的歷史,呈現(xiàn)出分叉后再合并的結(jié)構(gòu)。
`git rebase` 會(huì)將當(dāng)前分支的提交按順序應(yīng)用到另一個(gè)分支的頂端,這相當(dāng)于在另一個(gè)分支的基礎(chǔ)上重新應(yīng)用當(dāng)前分支的更改。
29.反問
#軟件開發(fā)筆面經(jīng)##字節(jié)跳動(dòng)#
面試公司:字節(jié)【基架部門】
面試崗位:后端開發(fā)
面試問題:
1.實(shí)習(xí)項(xiàng)目
2.有哪些方案可以避免流量高峰造成的問題
- 消息隊(duì)列削峰填谷
- 緩存預(yù)熱
- 負(fù)載均衡,分散請(qǐng)求
- 限流和降級(jí)
3.了解常用的限流或者降級(jí)的算法嘛?描述一下原理?
固定窗口計(jì)數(shù)器:按照時(shí)間段劃分窗口,有一次請(qǐng)求就+1,最為簡(jiǎn)單的算法,但是限流不夠平滑且無法應(yīng)對(duì)突然激增的流量。滑動(dòng)窗口計(jì)數(shù)器:通過將窗口再細(xì)分,并且按照時(shí)間“滑動(dòng)”來解決突破限制的問題,但是時(shí)間區(qū)間的精度越高,算法所需的空間容量就越大。漏桶:請(qǐng)求類似水滴,先放到桶里,服務(wù)的提供方則按照固定的速率從桶里面取出請(qǐng)求并執(zhí)行。缺陷也很明顯,當(dāng)短時(shí)間內(nèi)有大量的突發(fā)請(qǐng)求時(shí),即便此時(shí)服務(wù)器沒有任何負(fù)載,每個(gè)請(qǐng)求也都得在隊(duì)列中等待一段時(shí)間才能被響應(yīng)。令牌桶:往桶里面發(fā)放令牌,每個(gè)請(qǐng)求過來之后拿走一個(gè)令牌,然后只處理有令牌的請(qǐng)求。令牌桶滿了則多余的令牌會(huì)直接丟棄。令牌桶算法既能夠?qū)⑺械恼?qǐng)求平均分布到時(shí)間區(qū)間內(nèi),又能接受服務(wù)器能夠承受范圍內(nèi)的突發(fā)請(qǐng)求,因此是目前使用較為廣泛的一種限流算法。
4.滑動(dòng)窗口相對(duì)固定窗口算法解決了什么問題
相比于固定窗口算法,滑動(dòng)窗口計(jì)數(shù)器算法可以應(yīng)對(duì)突然激增的流量。
5.【手撕】字符串的z型變換
6.操作系統(tǒng),進(jìn)程和線程的區(qū)別
進(jìn)程是操作系統(tǒng)資源分配的基本單位,線程是cpu調(diào)度的基本單位。進(jìn)程是一個(gè)程序的動(dòng)態(tài)運(yùn)行實(shí)例,而線程是進(jìn)程當(dāng)中的一條執(zhí)行流程。進(jìn)程包含多個(gè)線程,線程從屬于一個(gè)進(jìn)程;各進(jìn)程間相互獨(dú)立,但線程不一定,同一個(gè)進(jìn)程的多個(gè)線程可能相互影響。進(jìn)程切換的開銷顯著高于線程切換。
7.threadlocal的原理
就是線程本地變量,如果創(chuàng)建了一個(gè)ThreadLocal變量,那么訪問這個(gè)變量的每個(gè)線程都會(huì)有這個(gè)變量的一個(gè)本地拷貝,多個(gè)線程操作這個(gè)變量的時(shí)候,實(shí)際是操作自己本地內(nèi)存里面的變量,從而起到線程隔離的作用,避免了線程安全問題。ThreadLocal的底層數(shù)據(jù)建構(gòu)就是ThreadLocalMap,它的key就是ThreadLocal的引用,值就是Object對(duì)象。
8.用戶的請(qǐng)求進(jìn)來,用戶的信息怎樣在一個(gè)請(qǐng)求內(nèi)傳遞?
在web應(yīng)用程序中,ThreadLocal可以用來存儲(chǔ)當(dāng)前請(qǐng)求的上下文信息,使得不同請(qǐng)求之間相互獨(dú)立
9.epoll?
當(dāng)調(diào)用epoll_create方法時(shí),Linux內(nèi)核會(huì)創(chuàng)建一個(gè)eventpoll結(jié)構(gòu)體,用于存放通過epoll_ctl方法向epoll對(duì)象中添加進(jìn)來的事件。這些事件都會(huì)掛載在紅黑樹中,如此,重復(fù)添加的事件就可以通過紅黑樹而高效的識(shí)別出來。而所有添加到epoll中的事件都會(huì)與設(shè)備(網(wǎng)卡)驅(qū)動(dòng)程序建立回調(diào)關(guān)系,也就是說,當(dāng)相應(yīng)的事件發(fā)生時(shí)會(huì)調(diào)用這個(gè)回調(diào)方法,它會(huì)將發(fā)生的事件添加到rdlist雙鏈表中。當(dāng)調(diào)用epoll_wait檢查是否有事件發(fā)生時(shí),只需要檢查eventpoll對(duì)象中的rdlist雙鏈表中是否有epitem元素即可。如果rdlist不為空,則把發(fā)生的事件復(fù)制到用戶態(tài),同時(shí)將事件數(shù)量返回給用戶。
10.項(xiàng)目的代碼結(jié)構(gòu)是怎樣的
微服務(wù)架構(gòu),ddd
11.流量是rpc進(jìn)來還是http進(jìn)來
12.介紹一下rpc和http在使用場(chǎng)景上的區(qū)別
rpc通常使用在分布式系統(tǒng)、跨語言調(diào)用、高性能服務(wù)中。http通常使用在網(wǎng)頁瀏覽、RESTful API、文件下載等
13.用rpc代替http會(huì)有什么問題???
14.http底層連接可以基于連接池嘛
15.了解golang嘛?了解golang的協(xié)程嗎
16.描述一下動(dòng)態(tài)規(guī)劃的核心思想?什么樣的問題可以用它去解決?
17.排序算法有哪些?挑選排序算法的時(shí)候要考量哪些?
考量:時(shí)間復(fù)雜度、空間復(fù)雜度、穩(wěn)定性、實(shí)現(xiàn)難度、數(shù)據(jù)規(guī)模和特性
18.快排是穩(wěn)定排序的算法嘛?哪些算法是穩(wěn)定排序的?
不是。穩(wěn)定排序的算法:冒泡排序、插入排序和歸并排序
19.紅黑樹相對(duì)于普通的樹有哪些特征?通常用來解決什么問題?
20.mysql的事務(wù)隔離級(jí)別?
21.讀已提交和可重復(fù)讀的底層區(qū)別?
22.mysql有哪些日志?
23.了解redolog嗎?
24.redolog的刷盤機(jī)制是怎樣的?
25.kafka和rocketmq在業(yè)務(wù)中使用場(chǎng)景上有什么區(qū)別?
26.git中版本管理的模型是什么?
Git 中的版本管理模型是圍繞快照(snapshot)的概念構(gòu)建的。每次提交(commit)都會(huì)記錄一個(gè)當(dāng)前所有文件的快照??煺瞻水?dāng)時(shí)整個(gè)目錄樹的狀態(tài),包括文件內(nèi)容和目錄結(jié)構(gòu)。
27.git的常見操作
28.git merge和rebase的區(qū)別
`git merge` 合并后的歷史記錄保留了所有分支的歷史,呈現(xiàn)出分叉后再合并的結(jié)構(gòu)。
`git rebase` 會(huì)將當(dāng)前分支的提交按順序應(yīng)用到另一個(gè)分支的頂端,這相當(dāng)于在另一個(gè)分支的基礎(chǔ)上重新應(yīng)用當(dāng)前分支的更改。
29.反問
#軟件開發(fā)筆面經(jīng)##字節(jié)跳動(dòng)#
全部評(píng)論
接好運(yùn)
mark
太強(qiáng)了
這是校招還是實(shí)習(xí)啊,感覺強(qiáng)度好大

限流和降級(jí)問了這么多,是因?yàn)楹?jiǎn)歷里面有相關(guān)的項(xiàng)目嗎?
相關(guān)推薦
04-28 10:09
好萊塢大學(xué)院大學(xué) C++ 點(diǎn)贊 評(píng)論 收藏
分享
點(diǎn)贊 評(píng)論 收藏
分享