庫 vs 服務 vs 側車Sidecar的比較
所有軟體應用程式都由可重用的元素組成。這些可重用元素的目標和功能從基礎設施級別到安全級別到業務能力各不相同。
本文的目的是比較用於構建和部署這些可重用元素的不同方法。
1.庫包
這是重用程式碼的最廣泛使用的方法。可重用程式碼作為庫開發和釋出。在這種方法中,客戶端應用程式將庫定義為直接依賴項,使用提供的 API 並將其程式碼與主應用程式邏輯一起傳送。庫和主應用程式邏輯的程式碼作為同一程式/容器的一部分執行。
優點
- 延遲:庫中的程式碼與主應用程式在同一程式中執行,因此沒有網路延遲。
- 可用性:整體可用性很高,因為沒有網路分割槽(CAP定理)。
- 易於使用:使用非常簡單。
- 環境上下文:庫可以訪問環境上下文(記憶體、CPU 等),因為它們是同一容器的一部分。
缺點
- 資源:記憶體、CPU 等資源與主應用程式共享。這意味著庫的效能會對主應用程式產生副作用。
- 技術:庫中使用的庫與主要應用程式的庫相同,因此,如果組織有不同的應用程式集,則每種語言都需要多個實現。
- 可維護性:庫中的任何錯誤修復都需要對所有客戶端應用程式進行程式碼更改和測試。
服務
下一個最廣泛使用的模式是為可重用功能定義服務。在這種方法中,應用程式使用請求-響應機制進行網路呼叫以呼叫另一個服務。服務和主要應用程式邏輯的程式碼在不同的 Pod/伺服器例項中執行。
優點
- 資源:應用程式和服務分開部署,因此資源不共享。資源可以獨立地針對應用程式和服務進行最佳化。
- 可維護性:當涉及到錯誤修復時,服務可以獨立釋出。不需要版本升級。
- 技術:可以使用適合其目的的任何技術選擇來開發服務。
缺點
- 易用性:與庫相比,服務的易用性相對較低。
- 延遲:由於應用程式和服務是分散式的,並且呼叫需要網路呼叫,因此延遲明顯更高。
- 環境上下文:服務無法訪問主應用程式的環境上下文(記憶體、CPU 等),因為兩者都在不同的例項中獨立執行。
- 可用性:由於網路分割槽,總體可用性將低於庫。
Sidecar:邊車、側車
Sidecar 模式是由兩個容器組成的單節點模式。side car 和主應用程式邏輯的程式碼作為不同程式/容器的一部分執行,但一起部署在同一個 pod/server 例項中。
優點和缺點
- 可維護性:當涉及到錯誤修復時,Sidecar可以獨立釋出。
- 技術。Sidecar可以使用任何適合其目的的技術來開發。
- 延遲性。與服務相比,其延遲性較低,但比庫高。這種方法的反模式是使所有可重複使用的元件成為側車,因為這將導致對效能的重大影響。
- 資源。應用程式和Sidecar被部署到一起,所以資源是共享的,但可以為側車單獨設定資源限制,以防止側車的過度使用。這種方法的反模式是使所有可重用的元件成為側車,因為這將導致資源配置管理的巨大開銷。
- 易用性:與庫相比,邊車的易用性相對較低,如果CI/CD管道支援開箱即用,那麼與服務相比,使用起來會更簡單。
- 環境背景。環境上下文(記憶體、CPU等)是可以被sidecar訪問的,因為它是同一個pod/伺服器例項的一部分。這使得側車可以進行應用效能監控等。
- 可用性:與服務相比,可用性會更高,因為沒有真正的網路分割槽。一般來說,可用性主要取決於主應用程式和側車之間的通訊協議。例如,如果協議是火災和遺忘,那麼側車的故障將不會對主應用程式產生連帶的副作用。
總結
上面提到的方法--庫、服務和Sidecar都可以一起用於一個應用程式,以達到預期的效果。一個應用程式可以使用庫來進行資料庫呼叫,使用sidecar來進行分散式日誌記錄,使用服務來提供認證功能。開發團隊需要權衡利弊,然後選擇正確的解決方案。
相關文章
- 微服務訊息代理比較:Redis vs Kafka vs RabbitMQ - Mertcan微服務RedisKafkaMQ
- Python的List vs Tuple比較Python
- iOS:原生應用 VS Flutter VS GICXMLLayout 比較iOSFlutterXML
- Redis vs. MongoDB比較RedisMongoDB
- 【譯】Flutter vs React Native vs Native:深度效能比較FlutterReact Native
- 測試速度比較:Selenium vs Playwright vs Cypress vs Puppeteer vs TestCafe
- 模組化與微服務比較 MircoService VS OSGI微服務
- Jenkins vs Kubernetes:比較 DevOps 工具Jenkinsdev
- Rust的Vector vs. Golang的Slice比較RustGolang
- DNS 解析器效能比較:CloudFlare vs Google vs Quad9DNSCloudGo
- 大資料檔案格式比較:AVRO vs. PARQUET vs. ORC大資料VR
- 【譯】Css Grid VS Flexbox: 實踐比較CSSFlex
- 共識演算法的比較:Casper vs Tendermint演算法
- Spring Boot Native vs Go:效能比較 – Ignacio SuaySpring BootGo
- Tomcat vs Jetty vs Undertow效能對比TomcatJetty
- 圖資料庫對比:Neo4j vs Nebula Graph vs HugeGraph資料庫
- JAVA中生成隨機數Random VS ThreadLocalRandom效能比較Java隨機randomthread
- GraphQL Vs. REST? API 開發方法的誠實比較 | transpositRESTAPI
- 資料湖 vs 倉庫 vs 資料庫資料庫
- Go vs Java vs C# 語法對比GoJavaC#
- 資料關係比較:相關性 vs 因果關係
- 資料庫選型比對 Oracle vs sqlserver資料庫OracleSQLServer
- Web Socket 效能對比——Spring Boot vs Tomcat vs NettyWebSpring BootTomcatNetty
- Google VS 亞馬遜 VS 微軟,機器學習服務選誰好?Go亞馬遜微軟機器學習
- 函數語言程式設計 vs 物件導向程式設計 vs 程式式程式設計的JS演示比較 - DEV函數程式設計物件JSdev
- ABAP SICF服務和Java Servlet的比較JavaServlet
- Playwright VS Selenium VS Puppeteer VS Cypress
- 比較服務間通訊的技術 - ardalis
- Oracle vs PostgreSQL,研發注意事項(8)- Oracle資料比較規則OracleSQL
- 資料湖 vs 資料倉儲 vs 資料庫資料庫
- Quartz入門及觸發器與Trigger的介紹&&Spring task Vs Quartz的比較quartz觸發器Spring
- *nix程式 vs 微服務微服務
- 微軟常用執行庫合集下載(vs2008(sp)/vs2010(sp)/vs2012/vs2013/vs2015/vs2017)包含32位/64位微軟
- vs 2017 vs code
- Airflow vs. Luigi vs. Argo vs. MLFlow vs. KubeFlowAIUIGo
- JavaScript 的 4 種陣列遍歷方法: for VS forEach() VS for/in VS for/ofJavaScript陣列
- Axum vs Actix vs Rocket
- RDBMS VS XML VS NoSQLXMLSQL