電信智科-大數(shù)據(jù)開發(fā)運營工程師(成都base)面經(jīng)
電信智科(中國電信股份有限公司數(shù)字智能科技分公司)-大數(shù)據(jù)開發(fā)運營工程師面經(jīng)
? 9月1日投的,15日筆試,26日一面。這個公司是在國聘行動上投遞的,在成都就這一個崗位,本來沒抱希望投的,結(jié)果沒想到還給面試了。面試在騰訊會議上的,一共25分鐘左右,比較短;感覺有點涼,像kpi面,我準備了kafka的很多八股,結(jié)果一個沒問,一直在懟網(wǎng)絡(luò),感覺有點像kpi面試。
? 以下回答絕大部分是GPT4.0回答的,我看著沒太大問題就貼上來了,僅供參考,可能有些錯誤。
1.前后端分離的項目中,前端往后端發(fā)送http請求過程中發(fā)生了什么?
2.http基于TCP這個全雙工的協(xié)議,為什么基本上都是客戶端請求服務(wù)端,服務(wù)端返回數(shù)據(jù)這種半雙工的模式呢?
HTTP 是一個請求-響應(yīng)協(xié)議。雖然它基于 TCP,這是一個全雙工的協(xié)議,但 HTTP 本身是設(shè)計為一個簡單的、無狀態(tài)的協(xié)議,主要用于文檔的檢索和信息的發(fā)布。因此,HTTP 的主要模式是客戶端發(fā)送一個請求,服務(wù)器返回一個響應(yīng)。
現(xiàn)在我們詳細分析這個問題:
- HTTP的設(shè)計初衷:HTTP 最初的設(shè)計是為了文檔的檢索和信息的發(fā)布,它并不是為雙向?qū)崟r通信設(shè)計的。所以,盡管 TCP 支持全雙工模式,HTTP 在設(shè)計時選擇了請求-響應(yīng)模型,即半雙工模式。
- 無狀態(tài)性:HTTP 是無狀態(tài)的。每一個請求-響應(yīng)對都是獨立的。這簡化了服務(wù)端的設(shè)計和實現(xiàn),因為服務(wù)端不需要維護與客戶端之間的長時間連接狀態(tài)。
- 長輪詢和服務(wù)器推送:在 HTTP/1.1 下,盡管主要的模式是請求-響應(yīng),但也可以通過技巧如長輪詢來模擬服務(wù)器向客戶端的推送。但這并不是真正的全雙工通信。
- HTTP/2 的服務(wù)器推送:HTTP/2 引入了服務(wù)器推送功能。這允許服務(wù)器在沒有客戶端明確請求的情況下發(fā)送數(shù)據(jù)。然而,這仍然是在請求-響應(yīng)模型的上下文中,只是提供了更高效的方式來預(yù)先推送可能需要的資源。
- WebSocket:WebSocket 是一個不同的協(xié)議,盡管它從 HTTP 升級而來。它提供了真正的全雙工通信能力,允許服務(wù)器和客戶端之間的雙向?qū)崟r通信。與 HTTP 相比,WebSocket 更適合需要實時交互和低延遲的應(yīng)用,例如在線聊天、游戲和實時數(shù)據(jù)流。
綜上所述,盡管 TCP 是全雙工的,但 HTTP 的設(shè)計選擇和其應(yīng)用場景使其主要成為一個請求-響應(yīng)模型。為了滿足實時雙向通信的需求,WebSocket 協(xié)議被引入為一個單獨的、完全不同于 HTTP 的協(xié)議。
3.http1.1協(xié)議下,如果要雙向互動的話,只能升級到websocket嗎?
對
4.http協(xié)議升級到websocket的過程簡述一下。哪個響應(yīng)碼是協(xié)議升級?(101)
可以看小林coding的這篇3.9 既然有 HTTP 協(xié)議,為什么還要有 WebSocket? | 小林coding (xiaolincoding.com)。
5.多線程在平時用過嗎?簡述一下場景
6.在kotlin中如何開啟協(xié)程的?StateFlow是如何使用的?
代碼
fun main() { GlobalScope.launch(context = Dispatchers.IO) { //延時一秒 delay(1000) log("launch") } //主動休眠兩秒,防止 JVM 過快退出 Thread.sleep(2000) log("end") }
? 用的比較多的協(xié)程作用域是coroutineScope
;StateFlow就是一個熱流,可以對新來的數(shù)據(jù)進行回調(diào)操作。
private suspend fun test() { // 創(chuàng)建一個熱流,初始值為1 val flow = MutableStateFlow(1) // 將MutableStateFlow對象轉(zhuǎn)換為StateFlow對象 // StateFlow對象不能調(diào)用emit方法,因此只能用于接收 val onlyReadFlow = flow.asStateFlow() // 接收者1 // 啟動一個新的協(xié)程 GlobalScope.launch { // 觸發(fā)并處理接收的數(shù)據(jù) onlyReadFlow.collect { Log.d("liduozuishuai", "test1: $it") } } // 接收者2 // 啟動一個新協(xié)程 GlobalScope.launch { // 訂閱監(jiān)聽,當collect方法觸發(fā)訂閱時,會首先會調(diào)onSubscription方法 onlyReadFlow.onSubscription { Log.d("liduozuishuai", "test2: ") // 發(fā)射數(shù)據(jù):2 // 向下游發(fā)射數(shù)據(jù):2,其他接收者收不到 emit(2) }.onEach { // 處理接收的數(shù)據(jù) Log.d("liduozuishuai", "test2: $it") }.collect() } // 發(fā)送數(shù)據(jù):3,多次發(fā)送 GlobalScope.launch { flow.emit(3) flow.emit(3) flow.compareAndSet(3, 3) } }
7.說一下Java如何從線程中取返回值?
直接貼代碼了,用Callable+submit()后得到的Future對象進行g(shù)et()api的調(diào)用或者直接使用FutureTask也可以。這里我沒有回答好,只知道使用get()
調(diào)用,但是不知道具體是在哪個對象上進行g(shù)et()。
? 記住,我們要獲取返回值的時候,需要用get()方法,這個get()方法是Future
接口內(nèi)的,那么實現(xiàn)了Future
借口的對象怎么來?
- 通過線程池(submit)提交
Callable
對象,之后會返回一個Future
,對它調(diào)用get()
即可 - 直接通過
Future
借口的實現(xiàn)類,FutureTask
,只不過使用它之后,放入線程池中執(zhí)行就只需要用execute()
方法,不能用submit()
了。因為當您傳入一個FutureTask
到submit
方法中,其實是調(diào)用了另一個重載版本submit(Runnable task)
,這個版本的submit
方法并不關(guān)心Runnable
是否是一個FutureTask
或是否有返回值。
代碼如下:
public static void main(String[] args) throws ExecutionException, InterruptedException { FutureTask<Integer> ft = new FutureTask<>(()->{ int i = 0 ; for(;i<10;i++){ System.out.println(Thread.currentThread().getName() + "的循環(huán)變量i的值 :" + i); } return i; }); ThreadPoolExecutor tpe = new ThreadPoolExecutor(5,10,10 , TimeUnit.SECONDS,new ArrayBlockingQueue<>(10), new ThreadFactory() { @Override public Thread newThread(Runnable r) { return new Thread(null,r,"這是一個有返回值的線程"); } },new ThreadPoolExecutor.CallerRunsPolicy()); tpe.execute(ft); System.out.println(ft.get()); Callable<Integer> callable = new Callable<Integer>() { @Override public Integer call() throws Exception { System.out.println("callable開始執(zhí)行"); int i = 0 ; for(;i<10;i++){ System.out.println(Thread.currentThread().getName() + "的循環(huán)變量i的值 :" + i); } return i; } }; Future<Integer> submit = tpe.submit(callable); System.out.println(submit.get()); tpe.shutdown(); }
8.知道的數(shù)據(jù)結(jié)構(gòu)說一下
數(shù)組、鏈表、樹、圖、棧、隊列、雙端隊列、哈希表等等
9.如何判斷一個鏈表中是否有環(huán)?
快慢指針
10. 說一下棧的應(yīng)用場景
棧(Stack)是一個后進先出(LIFO)的數(shù)據(jù)結(jié)構(gòu),有很多實際應(yīng)用場景。以下是一些常見的應(yīng)用場景以及詳細的說明:
- 函數(shù)調(diào)用/方法執(zhí)行:在程序中,每當有一個函數(shù)或方法被調(diào)用,系統(tǒng)會將調(diào)用信息(如返回地址、局部變量等)壓入系統(tǒng)調(diào)用棧中。當函數(shù)執(zhí)行完畢并返回時,系統(tǒng)從調(diào)用棧中彈出該函數(shù)的調(diào)用信息,繼續(xù)執(zhí)行前一個函數(shù)。舉例:考慮遞歸函數(shù)。例如,計算斐波那契數(shù)列。每次函數(shù)遞歸調(diào)用自己,都會將當前的計算狀態(tài)保存在棧中。
- 表達式求值:棧用于解析和計算算術(shù)表達式,特別是當它們有不同的優(yōu)先級時。舉例:使用兩個棧,一個用于值和另一個用于運算符,來實現(xiàn)后綴(逆波蘭)表示法或?qū)⒅芯Y表達式轉(zhuǎn)換為后綴表達式。
- 括號匹配:棧可以幫助檢查括號、大括號、方括號等在代碼或表達式中是否正確匹配。舉例:檢查字符串“{[()]}”中的括號是否匹配。每次遇到左括號時壓入棧,遇到右括號時從棧中彈出并檢查是否匹配。
- 后退功能:在瀏覽器或軟件中的后退功能,可以使用棧來實現(xiàn)。每次用戶訪問新頁面或狀態(tài)時,當前頁面/狀態(tài)被壓入棧中。點擊后退時,最近的頁面/狀態(tài)從棧頂被彈出。舉例:瀏覽器歷史功能。當你瀏覽新的網(wǎng)頁時,之前的網(wǎng)頁地址被壓入棧。點擊后退按鈕時,返回棧頂?shù)木W(wǎng)頁。
- 撤銷操作:在許多應(yīng)用程序中(如文字處理器或圖形編輯器),??梢杂脕韺崿F(xiàn)撤銷功能。每次更改都被壓入棧中。要撤銷更改,只需從棧頂彈出操作。舉例:在Microsoft Word中,當你刪除文本或添加格式時,每個更改都被保存在棧中。使用撤銷功能時,可以逐步回退到之前的狀態(tài)。
- 深度優(yōu)先搜索:在圖形或樹形結(jié)構(gòu)中,深度優(yōu)先搜索可以使用棧來實現(xiàn)。舉例:考慮一個迷宮問題。從起點開始,你可以使用棧來存儲訪問路徑。每次都走可能的路徑,如果到達死胡同,則從棧中彈出上一步并嘗試其他路徑。
這些只是棧的幾個應(yīng)用場景。由于其簡單且高效的性質(zhì),棧在計算機科學(xué)和其他領(lǐng)域中有著廣泛的應(yīng)用。
11.說一下樹的應(yīng)用場景
10和11讓我感覺kpi的味道很濃了,感覺面試官從第7個我沒答好的問題開始就有點失去興趣了,哎
12.TCP/IP是幾個協(xié)議?
? TCP/IP 并不是指一個單獨的協(xié)議,而是一個協(xié)議族或者說是一個協(xié)議套件。這個協(xié)議族中包含了多個層次和類型的協(xié)議。其名稱中的“TCP”和“IP”分別是傳輸控制協(xié)議(TCP)和互聯(lián)網(wǎng)協(xié)議(IP),這兩個是這個協(xié)議族中最著名的協(xié)議,但實際上,TCP/IP協(xié)議族包含了更多的協(xié)議。
TCP/IP 模型大致可以分為以下四個層次:
- 應(yīng)用層:這一層包含了各種應(yīng)用層協(xié)議,如 HTTP, FTP, SMTP, DNS 等。
- 傳輸層:這一層主要有兩個協(xié)議,即 TCP 和 UDP(用戶數(shù)據(jù)報協(xié)議)。
- 網(wǎng)絡(luò)層:主要協(xié)議是 IP,但還包括如 ICMP(互聯(lián)網(wǎng)控制消息協(xié)議)、IGMP(互聯(lián)網(wǎng)組管理協(xié)議)等其他協(xié)議。
- 鏈路層:這一層并沒有特定的協(xié)議定義在 TCP/IP 協(xié)議族中,但是這一層主要負責(zé)與具體的物理網(wǎng)絡(luò)相交互,如 Ethernet。
因此,說 TCP/IP 是“幾個”協(xié)議其實不準確。它是一個包含了許多協(xié)議的協(xié)議族,而這些協(xié)議都服務(wù)于不同的目的和功能。
13.TCP協(xié)議和IP協(xié)議的關(guān)系?
14.包粘粘問題說一下
15.k8s說一下
反問:
1.公司是做什么的?
? 電信智科是中國電信的分公司,是專門做AI,大模型的。成都團隊主要做大數(shù)據(jù)相關(guān)的,工作有很多種,開發(fā)、算法都有,需要進去之后再看(感覺這句話挺敷衍的hhhh)。
2.能給我什么建議嗎?
? 我不能給你什么建議。
? 絕了,第一家啥建議也給不到俺的公司,哪怕客套話也不說,感覺是明著kpi了,面試的時候?qū)γ嬉餐Τ车?,也沒開攝像頭。
也可能是自己太菜了,不能讓面試官感興趣吧hhhh