一個請求過來都經過了什麼?(Thrift版)

来源:https://www.cnblogs.com/xiexj/archive/2019/03/04/10473322.html
-Advertisement-
Play Games

一、背景 最初遇到這個問題是去58面試。部門領導是原同事,所以面試比較水。水到什麼程度呢? 面試就是走個形式而已,不會不過的。 一面面試官就問了一個問題:“一個請求過來都經過了什麼?” 剩下的全是閑聊。順便展示一下公司和部門的優勢。期待加入的意思。 聲明 面試如此之松是基於兩點: 第一點,與原同事多 ...


一、背景

最初遇到這個問題是去58面試。部門領導是原同事,所以面試比較水。水到什麼程度呢?

面試就是走個形式而已,不會不過的。

一面面試官就問了一個問題:“一個請求過來都經過了什麼?”  剩下的全是閑聊。順便展示一下公司和部門的優勢。期待加入的意思。

聲明

面試如此之松是基於兩點:

第一點,與原同事多年的共事已經展示了能力和綜合素質,比幾個小時的面試得到的結論靠譜的多。

第二點,原同事本身認人識人的能力得到了其他人的認可,所以大家放心他推薦的人。

畢竟沒人願意讓一個不合適的人加入自己團隊拉低整體水準。

二、問題考察點

深度和廣度的綜合考察

三、靜兒的答案

建立虛擬場景

☆ 項目

容器調度服務(根據用戶傳入的機房、CPU、記憶體等信息給用戶創建所需要的機器)。

項目所用技術棧:SpringBoot、Thrift、緩存、mysql、k8s

☆ 需求

程式中需要用thrift(RPC調用)請求基礎服務取所有的機房信息。

☆ 設計

基礎服務提供了「傻瓜式」客戶端給調用方。客戶端只需要引入jar包,就可以像調用本地介面一樣進行訪問。

 

客戶端實現方法

因為機房信息是低頻的、對變更一定時延不敏感的資源信息。所以客戶端首先RPC去遠程取結果放到本地JVM緩存中。每次調用直接返回JVM緩存信息。客戶端有定時任務定時將最新結果刷新到JVM緩存。

 

設計特點:

1、對thrift介面做封裝,封裝包括設定了遠程獲取異常的重試次數、重試間隔、遠程服務信息等。原因:基礎服務提供方自己最清楚自己服務的響應時間、服務可用性等信息,自己設置更為精確,避免對使用方造成困擾。

2、每次返回本地JVM存的機房信息。信息更新通過自帶定時任務。原因:基礎服務提供方自己最清楚自己的資源被更新頻率如何,提供數據的實時性重要性如何。怎麼保持數據一致性。怎樣更高效。這些難題不應該拋給調用方。

3、懶載入處理。原因:不能因為jar包被引用就直接占用記憶體、CPU等資源。要按需提供。

服務端實現方法

服務端收到請求,考慮到這個是基礎服務,使用方多。為了防止壓力直接作用於資料庫,上面加了一層集中式緩存。不穿透的情況下,直接返回緩存信息。

資料庫中的所有機房信息是從k8s標簽中獲取過濾的。有變化直接刷緩存。即資料庫中存的是所有的標簽信息,其中一個小功能是從所有標簽中過濾機房標簽。這種設計是區別於有個機房管理系統錄入這種管理,機房信息永遠是實時準確的。(這塊涉及到內部系統的設計問題,如果看不懂直接忽略即可。)

☆ 請求過來經過了什麼

 

從程式設計上,大體經過的如上圖。限於篇幅(如果你想瞭解不限於篇幅是個什麼狀態,可以閱讀下麵一篇《一個請求過來都經過了什麼?(2017年http版)》),本篇不講JVM經過了怎樣的過程,主記憶體和工作記憶體交互,記憶體可能的分頁,numa綁核、定頻非定頻等等。深度上只介紹thrift調用這一層。

 

籠統的過程如上圖。大體分為三個部分:

1、有IP直接訪問IP,沒有IP通過其他信息獲取到IP。

在此部分中,第一次連接需要根據環境和服務標識獲取機器列表。客戶端一般會有本地進程代理。對於美團OCTO來說,就是Sg_Agent(服務治理代理)。代理會和OCTO伺服器進行通信,及時獲取最新信息。連接建立後,下次訪問就是直接IP訪問了。

2、通過IP訪問服務端,根據類名+方法簽名獲取方法。

3、通過攔截器認證的請求被服務端處理後返回結果。

Thrift內部的架構是分層次的。客戶端和服務端都可大體分為代碼層、協議層、傳輸層、IO處理層四部分。客戶端和服務端的IO處理層直接交互。

 

代碼層:

代碼在美團OCTO體系中MtThrift中會直接由框架自動從java代碼轉成IDL文件,框架再根據IDL文件生成代碼實現數據的讀寫。

協議層(實現Tprotocol介面):

將數據編碼、解碼。最三種的三種傳輸格式支持是:二進位格式、壓縮格式、Json格式。

傳輸層(實現Ttransport介面):

提供從網路等媒介讀取和寫入數據的方式。常用的有:向文件進行讀寫、從記憶體上讀寫、壓縮讀寫。

IO處理層:

這層所做的就是阻塞、非阻塞,單線程、多線程這些。一般像獲取所有機房信息這樣的讀操作用的是多線程阻塞方式。寫操作一般用多線程非阻塞方式。

再往下linux系統層的東西也是可以講講的,內容有點多,大家自己做思考題吧。還有涉及網路傳輸的通道、全雙工傳輸模式這些,大家可以自己想一想,查一查。

四、總結

本次公眾號文章共三篇《一個請求過來都經過了什麼?(Thrift版)》《一個請求過來都經過了什麼?(2017年http版)》《思維發散的雙刃劍》。首篇是剛寫的,第二篇是17年寫的。最後一篇是一些總結思考。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 來自:https://blog.csdn.net/qq_38658877/article/details/78092649 侵刪 Document ...
  • 來自:https://blog.csdn.net/qq_38658877/article/details/78092649 侵刪 Document ...
  • 來自:https://blog.csdn.net/sheng_li/article/details/84347987 侵刪<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" cont ...
  • 註意的是: 加上了冒號是為了動態綁定數據,等號後面可以寫變數。如果不使用冒號,等號後面就可以寫字元串等原始類型數據。這是就無法進行動態綁定數據了 ...
  • 在做js開發的時候用到了startsWith函數時,發現各個瀏覽器不相容問題,因為對開發來說,chrome瀏覽器最好用,就一直在chrome瀏覽器中使用這兩個函數沒有任何問題,但在ie瀏覽器訪問就直接報錯,因為ie沒有這兩個函數,要麼修改方法,換別的方法,但是一兩個還好改,多了就不好改,這個時候就只 ...
  • ""中文編程"知乎專欄原鏈" 在前文 "對在代碼中使用中文命名的質疑與回應" 中闡述了在代碼中使用中文命名的益處. 此文將從軟體使用者的角度闡述對API中文化的意義並探討實現途徑. 當然, 文中面向的用戶是以中文為母語的開發者. 首先請看一個 "實例" , 演示效果在 "此" : 這個庫提供了一系列 ...
  • 一、入門 1、jquery 就是一個js的框架; 2、好處就是能讓我們的js代碼寫的更少; 3、基本使用:引入script,後面使用即可; 4、關於版本選擇:1.* 版本的相容性比較好,大公司用的多; 5、關於壓縮版和為壓縮版:開發用未壓縮的便於看源碼學習,生產環境用壓縮版可以提高速度; 二、jQu ...
  • 一、什麼是單例模式?1、含義 作為對象的創建模式,單例模式確保某一個類只有一個實例,而且自行實例化並向整個系統全局地提供這個實例。它不會創建實例副本,而是會向單例類內部存儲的實例返回一個引用。2、單例模式的三個要點:(1). 需要一個保存類的唯一實例的靜態成員變數:private static $_ ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...