輸入一個網址,到顯示界面,中間的過程是怎樣的
IP 報文段的結構是什么
Innodb 的底層結構
知道幾種設計模式
- 工廠模式
- 簡單工廠模式:根據傳入類型參數判斷創建哪種類型對象
- 工廠方法模式:由子類決定實例化哪個類
- 抽象工廠模式:創建一系列相關或互相依賴對象的接口,而無需指定它們具體的類
- 單列模式:確保一個類只有一個實例,并提供一個全局訪問點來訪問該實例。
- 建造者模式:在軟件系統中,一個復雜對象的創建通常由多個部分組成,這些部分的組合經常變化,但組合的算法相對穩定。
- 觀察者模式:創建了對象間的一種一對多的依賴關系,當一個對象狀態改變時,所有依賴于它的對象都會得到通知并自動更新。
單例模式的應用場景
單例模式的核心在于確保一個類只有一個實例,并提供全局訪問點。它適用于那些需要嚴格控制資源訪問、保證狀態一致或避免重復創建開銷的場景。以下是其典型使用場景:
-
訪問共享資源或硬件:
- 數據庫連接池: 創建多個數據庫連接開銷巨大。單例的數據庫連接池管理所有連接,確保高效復用,避免資源耗盡。
- 日志記錄器: 應用所有部分都需要寫入同一個日志文件。單例日志器保證所有日志消息被順序、一致地寫入同一個目標文件,避免并發寫入沖突。
- 打印機后臺處理程序: 多個打印任務需要有序排隊處理同一個物理打印機。單例的后臺處理程序管理隊列,確保一次只有一個任務訪問打印機。
- 文件系統/硬件驅動: 訪問物理資源(如特定硬件設備、配置文件)通常需要唯一訪問點,單例確保請求被有序處理且狀態一致。
-
全局配置管理器:
- 應用配置(如數據庫URL、API密鑰、應用設置)通常只需加載一次并在全局共享。單例配置管理器在啟動時加載配置,并提供全局訪問點,確保所有組件使用同一份、最新的配置信息,避免重復讀取文件或解析的開銷。
-
緩存:
- 應用級緩存(如內存緩存)需要被所有組件訪問和更新。單例緩存實例確保所有組件共享同一份緩存數據,提高訪問速度,并可通過單例集中管理緩存的失效、刷新策略。
-
上下文對象:
- 運行時上下文信息(如Web應用中的當前用戶會話、應用上下文、線程池)通常在整個應用生命周期或特定作用域內需要唯一且全局可訪問。單例(或結合ThreadLocal實現的線程單例)能有效管理這類狀態。
關鍵特征總結(判斷是否適用單例):
- 全局唯一性: 系統中確實必須只有一個該類的實例存在。
- 全局訪問: 該實例需要被系統中的許多不同部分方便地訪問。
- 控制共享資源: 需要管理對共享資源(數據庫、文件、硬件)的并發訪問。
- 集中管理狀態: 需要維護一份全局共享、一致的狀態或配置信息。
- 昂貴初始化: 對象創建和銷毀開銷非常大,需要嚴格控制創建次數。
重要注意事項(避免濫用):
- 測試困難: 單例的全局狀態使得單元測試復雜化(測試之間狀態污染)。可通過依賴注入(注入單例接口的模擬實現)或提供重置機制來緩解。
- 隱藏依賴: 單例通過全局訪問點引入依賴,破壞了代碼的顯式依賴關系,降低了可讀性和可維護性。
- 違反單一職責原則: 單例類除了自身業務邏輯,還承擔了控制實例化的責任。
- 潛在并發問題: 多線程環境下需要小心實現(雙重檢查鎖定、靜態內部類、枚舉等),確保線程安全。
- 過度全局化: 不是所有“只需要一個”的對象都適合單例。如果對象作用域有限(如請求作用域),考慮其他模式(如依賴注入容器管理作用域)。
觀察者模式
拍賣系統:拍賣師作為主題,競價者作為觀察者,拍賣價格更新時通知所有競價者。
觀察者模式(Observer Pattern)是一種行為設計模式,用于定義對象之間的一對多依賴關系,使得當一個對象的狀態發生變化時,所有依賴于它的對象都會得到通知并自動更新。以下是對觀察者模式的詳細介紹:
1. 結構
觀察者模式主要包含以下幾個角色:
- 主題(Subject): 被觀察的對象,維護觀察者的列表,并提供添加、刪除觀察者的方法。
- 觀察者(Observer): 依賴于主題的對象,定義一個更新接口,以便在主題狀態改變時進行通知。
- 具體主題(Concrete Subject): 實現主題接口,維護狀態并在狀態變化時通知所有觀察者。
- 具體觀察者(Concrete Observer): 實現觀察者接口,接收主題的通知并作出相應的處理。
2. 工作原理
- 注冊觀察者: 觀察者通過主題的注冊方法訂閱主題。
- 狀態變化: 當主題的狀態發生變化時,主題會調用所有注冊觀察者的更新方法。
- 通知觀察者: 觀察者在收到通知后,可以獲取主題的新狀態并作出相應的反應。
3. 使用場景
- 事件驅動系統: 例如 GUI 組件中的事件監聽。
- 數據模型: 在 MVC(模型-視圖-控制器)架構中,模型狀態變化時通知視圖更新。
- 消息推送: 實現消息訂閱和推送機制,如社交媒體應用中的通知。
- 實時數據監控: 例如股票價格變化時通知投資者。
4. 優缺點
優點
- 解耦: 觀察者與主題之間松散耦合,易于擴展和維護。
- 動態性: 可以在運行時動態添加或移除觀察者。
缺點
- 性能問題: 如果觀察者數量眾多,通知所有觀察者可能會造成性能開銷。
- 循環依賴: 如果觀察者與主題之間存在循環依賴,可能導致不必要的復雜性。
總結
觀察者模式是一種強大且靈活的設計模式,適用于需要實現對象間動態交互的場景。通過定義清晰的接口和方法,觀察者模式能夠有效地管理對象之間的關系,提高代碼的可維護性和可擴展性。
既然 IP 層會分片,為什么 TCP 層還需要 MSS 呢?
如何優化 TIME_WAIT?
- 復用處于 TIME_WAIT 的 socket 為新的連接所用
- 當系統中處于 TIME_WAIT 的連接一旦超過net.ipv4.tcp_max_tw_buckets(默認18000)值時, 系統就會將后面的 TIME_WAIT 連接狀態重置
- 程序中使用 SO_LINGER跳過time_wait 直接調用close 發送RST
服務器出現大量 TIME_WAIT 狀態的原因有哪些?
- http沒有使用長連接
- http長連接超時
- 長連接數量請求達到上限
服務器出現大量 CLOSE_WAIT 狀態的原因有哪些?
如果已經建立了連接,但是客戶端突然出現故障了怎么辦?
保活機制,探測報文