容器性能比無容器服務器,【譯】容器 vs 無服務器(Serverless)

一些歷史

不久之前,開發,部署和運維還相當復雜。在一開始,運維不僅需要修補程序代碼,還要支持物理機器。保持服務器,硬件與軟件處于最新狀態也是一項艱巨的任務。

在2000年代,一個新的模型——架構即服務(IaaS)很快流行起來。IaaS提供了從第三方租用遠程服務器與虛擬機的可能性。這些提供商負責管理硬件,網絡以及預留空間。

在IaaS出現之后,為開發者減負,讓他們卸下所有非開發任務的想法推動了新方法,模型和服務的創新。

什么是容器?

Docker官方給出了如下簡短而優雅的定義:“容器是一個標準軟件單元,它將代碼及其依賴打包到一起,因而應用可以快速穩定地運行在不同的計算環境中。”換句話來說,使用容器,開發者能確保應用能運行在任何云平臺上或本地服務器上。在某些方面,容器與虛擬機相類似,都是獨立的資源。然而,虛擬機模仿物理機,而容器創建了軟件層的抽象。

什么是無服務器計算?

在無服務器計算中,整個應用或應用的一部分被分成多個功能,每個都會被一個事件觸發,例如HTTP請求,新消息到達消息隊列,或保存和修改數據。也能夠在某個特定時間或周期性地執行,這個特性對計劃任務很有用。

對于這樣的系統,開發者只需要寫功能代碼,將它與它的依賴一起打包到一個壓縮文件,并將壓縮文件發到無服務的終端。供應商負責配置和擴展。

無服務器的一個關鍵特性是“即用即付”模型,企業只需要為他們功能的實際執行時間付費。如今,AWS Lambda是最流行的無服務器供應商。

容器與無服務器有共通之處嗎?

是的!如今,無服務器與容器都很流行,因為他們能讓開發者專注于代碼而不是基礎設施。這提高了開發速度。容器與無服務器都能與微服務及基于組件的開發完美契合。相對于經典的一體化架構,使用無服務與容器,開發部署都會更快,性價比也更高,因為你在操作應用的小部分,而不是整體。盡管有這些共性,兩個技術都有各自的優劣以及各自的使用場景。

容器的優勢

容器的第一大優勢就是可移植性。由于容器包含了運行所需的一切依賴,只需要一個安裝有容器引擎的機器就可以運行。容器是平臺無關的,它可以運行在Linux, Windows, macOS, Mesos, Docker, Swarm, 或 Kubernetes,甚至可以運行在其他容器內部。

容器比虛擬機性能更好。雖然容器與虛擬機都是虛擬化的,虛擬機消耗更多的資源,因為他們運行著整個操作系統來模擬完整的機器。而容器可以共享同一個操作系統,這使它們更小,啟停速度更快。

容器的另一個好處是運行開發者獲得程序的完全控制。雖然這意味著系統設置必須手動配置,但這也意味著你擁有真正的靈活性。這一點無服務器是做不到的,因為幾乎所有的管理都由云供應商負責。

容器的使用場景

如果你想重構一些大的一體化應用到微服務架構,并獲得更好的性能,可測試性,以及擴展速度,容器非常有用。將過去的大應用分成幾個小服務——一個負責用戶管理,一個負責轉換媒體文件等等。每個服務都可以在負載提高時輕易地擴展來提供更好的性能。這些一體化應用就辦不到,除非像整個系統添加一個新實例,這樣既不經濟,又耗時間。

總的來說,容器適合于長期運行的程序,以及對系統有特殊要求的應用。

無服務器的優勢

由于“即用即付”模式,使用無服務器的花費會大大降低。在應用的空閑時間你不必付費,因此如果沒有流量,你就不用交月費。幾乎所有的無服務供應商都有免費使用,包含一個按月的固定請求數和執行時間。通常提供的數值對一個小型網站來說已經足夠了。

使用容器,將應用分成微服務是關鍵的一步。而使用無服務器,是將應用分成單個的功能,每個復雜一個特定的邏輯。這大大降低了開發和部署的速度,因為對于工程師來說這更容易理解。部署功能塊也比部署整個應用所冒的風險更小。

無服務的另一個好處是爆發自動伸縮。無服務器的功能運行在小的,無狀態的,短暫存在的容器中。供應商負責擴展應用來應對負載高峰,可以在幾秒鐘之內運行起來成百上千個實例。記住,你只需要為你的功能的執行時間付費。

什么時候使用無服務器?

事件驅動的無服務器對于那些不需要一直運行的應用很有用。

假設你在為一個已有應用開發一個媒體處理功能。新的模塊不經常使用,但是也需要足夠的計算能力完成它的任務。將它放在應用里需要遷移到一個性能更強的實例——一個冒險的舉動,因為,如果一些繁重的任務一起運行,會給所有的用戶帶來延遲,這時你就需要性能更好的機器,而這同樣會帶來風險。

如果你選擇無服務器,媒體處理模塊會與應用的其余部分隔離。在不用時你不需要付費并且不會影響你程序的其余部分。

無服務器,不是你不需要服務器,而是供應商為你提供服務器,這個服務器在你用的時候就存在,不用的時候就不存在(不收費),這簡直就是薛定諤的服務器。

容器的缺點

即使程序沒人使用,也至少有一個承載容器的虛擬機實例在運行。因此,容器比無服務器更貴。

即使容器可以在共享的機器上快速擴展,額外擴展并不快,因為機器自身也需要擴展。不過,利用容器協調系統例如Kubernetes,AWS ECS...使擴展更容易。

無服務器的缺點

對于大部分開發者,最可怕的事是廠商綁定。使用無服務器,你不可避免地要選擇一個云供應商,不同供應商之間使用的架構與API都不相同,如果要改變供應商或其他的解決方案,代價有些高昂。不過,也有一些專家不同意,聲稱廠商綁定不成問題。

使用無服務器,觀測,監控與調試都不容易。因為程序可能被分成了多個部分,每一部分都有各自的bug與錯誤,掌控全局變得很重要。幸運的是,現在可以使用Thundra,一個為無服務器提供了完整可觀測性的工具,聚合了性能指標和日志。

容器和無服務器可以一起使用嗎?

令人驚訝的是,是的!讓主程序功能作為容器化的微服務運行,而對于一些后臺操作或很少使用但是消耗CPU的功能使用無服務器。

另一種又去的結合方式是使用AWS Fargate。這個服務結合了無服務器與容器的優點,運行你更好地控制你的程序而不用擔心擴展——AWS負責。如果你對此感興趣,查看關于AWS Fargate的這篇文章。

總結

容器與無服務器通常被認為是相互競爭的技術。通過進一步的觀察,發現他們只是不同的技術而已——在同一個項目中一起使用可以優勢互補。記住“舊的”不意味著是“死的”,“新的”不代表“更好”。哪種方案有效取決于你的使用場合,項目需求,團隊經驗以及團隊偏好。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/541583.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/541583.shtml
英文地址,請注明出處:http://en.pswp.cn/news/541583.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Centos 7安裝與配置nagios監控(一)

目 錄序言(必備知識)一、安裝規劃1.1系統環境1.2所需軟件包二、配置安裝環境2.1同步時間2.2禁用SElinux2.3 xftp上傳軟件包2.4安裝郵件服務三、監控主機安裝3.1安裝nagios的運行環境3.2增加用戶3.3安裝nagios3.4配置權限3.5安裝插件3.6安裝nrpe四、遠程主機安裝4.1配置運行環境…

java字符串刪掉子串_如何從Java中的列表中刪除子列表?

java字符串刪掉子串從列表中刪除子列表 (Removing SubList from a List) Suppose, we have a list of few elements like this, 假設我們列出了一些這樣的元素, list [10,20,30,40,50]From the list, we have to delete a sub list between sourcing_index (inclu…

備份linux系統報錯_Linux 系統如何快速入門?分享民工哥總結的經驗

大家好,我是民工哥。認識或熟悉我的人都知道,是做運維出身的,所以,很多時候,有很多朋友喜歡問我一些有關運維的問題,比如:我應該如何入門Linux系統運維?Linux系統運維到底需要學哪些…

pe聯想服務器裝系統教程視頻,演示聯想電腦u盤重裝系統xp教程

聯想電腦U盤重裝XP系統的方法很多朋友詢問,其實現在很多電腦已經不支持XP系統的安裝了,如果你的聯想電腦是近幾年購買的,還是安裝win10系統比較保險。當然聯想電腦安裝系統過程中遇到問題也可以聯系人工客服。聯想電腦如何使用U盤重裝系統XP呢…

TCP Socket 粘包

這兩天看csdn有一些關于socket粘包,socket緩沖區設置的問題。發現自己不是非常清楚,所以查資料了解記錄一下: 一兩個簡單概念長連接與短連接:1.長連接 Client方與Server方先建立通訊連接。連接建立后不斷…

離散數學和組合數學什么關系_關系類型| 離散數學

離散數學和組合數學什么關系關系類型 (Types of Relation) There are many types of relation which is exist between the sets, 集合之間存在許多類型的關系, 1. Universal Relation 1.普遍關系 A relation r from set a to B is said to be universal if: R A…

springboot公共模塊打包_解決SpringBoot多模塊發布時99%的問題?

每天都會分享Java架構文章,喜歡的朋友關注我。ps:文末有彩蛋,驚喜等著你如果使用的是 SpringBoot 多模塊的項目,在發布的時候可能遇到各種各樣的問題。本文歸納了以下 8 個原則和發布時經常出現的 4 個問題的解決方案,…

tomcat7的數據庫連接池tomcatjdbc的25個優勢

tomcat的JDBC連接池org.apache.tomcat.jdbc.pool更換或替代嗎Apache Commons DBCP連接池。為什么我們須要一個新的連接池?這里有幾個原因: 1.DBCP 1.x是單線程的。為了成為線程安全的 共享鎖整個池在短時間內在兩個對象 分配和對象返回。注意,這并不適用 下議院DBCP 2.x。 2.D…

weakhashmap_Java WeakHashMap entrySet()方法與示例

weakhashmapWeakHashMap類entrySet()方法 (WeakHashMap Class entrySet() method) entrySet() method is available in java.util package. entrySet()方法在java.util包中可用。 entrySet() method is used to retrieve the mappings that exist in this map to be viewed in …

定義整型數組_C++數組的定義與初始化(學習筆記:第6章 01)

數組的定義與使用[1]數組是具有一定順序關系的若干相同類型變量的集合體,組成數組的變量稱為該數組的元素。數組的定義方括號里面列出的常量表達式是數組每一維的下標個數。數組的下標不管從哪一維它都是從0開始數的。例如:int a[10]; 表示a為整型數組&a…

我們正在經歷一個應用疲憊時代?

在移動互聯網時代到來之后,應用程序成為了智能手機必備,也正因為萬千開發者的參與,才讓移動終端充分發揮出了強大的能量,當然,這些開發者也不斷創造著造富神話,一個小團隊在幾個月的努力之后可能就會成為億…

Java LinkedHashMap values()方法與示例

LinkedHashMap類的values()方法 (LinkedHashMap Class values() method) values() method is available in java.util package. values()方法在java.util包中可用。 values() method is used to get all the values exist in this LinkedHashMap to be viewed in a Collection.…

語句拼接_第2課:一個周末學會R語言數據處理:表拆分和拼接

從一線收集了兩百個文件,要整合到一起?總部一張全國兩百個城市的匯總表,拆成兩百個小文件?開什么玩笑,難道要復制粘貼到天荒地老。。。不用這么麻煩,一個循環,一個語句,實現快速表拆…

Anaconda配置多spyder多python環境

作者:桂。 時間:2017-04-17 22:02:37 鏈接:http://www.cnblogs.com/xingshansi/p/6725298.html 前言 最近在看《統計學習方法》,打算配合《機器學習實戰》一起,可后者的代碼是基于python2.6的: All the co…

pytorch自定義新層demo_從頭學pytorch(十一):自定義層

自定義layer不含模型參數的layer含模型參數的layer核心都一樣,自定義一個繼承自nn.Module的類,在類的forward函數里實現該layer的計算,不同的是,帶參數的layer需要用到nn.Parameter不含模型參數的layer直接繼承nn.Moduleimport torchfrom torch import nnclass CenteredLayer(n…

java日歷類add方法_Java日歷computeTime()方法及示例

java日歷類add方法日歷類computeTime()方法 (Calendar Class computeTime() method) computeTime() method is available in java.util package. java.util包中提供了computeTime()方法 。 computeTime() method is for conversion of current field values to the ms(millisec…

C++——智能指針和RAII

該文章代碼均在gitee中開源 C智能指針hpphttps://gitee.com/Ehundred/cpp-knowledge-points/tree/master/%E6%99%BA%E8%83%BD%E6%8C%87%E9%92%88??????? 智能指針 傳統指針的問題 在C自定義類型中,我們為了避免內存泄漏,會采用析構函數的方法釋…

移除元素所有事件監聽_DOM 事件模型或 DOM 事件機制

DOM 事件模型DOM 的事件操作(監聽和觸發),都定義在EventTarget接口。所有節點對象都部署了這個接口,其他一些需要事件通信的瀏覽器內置對象(比如,XMLHttpRequest、AudioNode、AudioContext)也部…

gettimezone_Java日歷getTimeZone()方法與示例

gettimezone日歷類的getTimeZone()方法 (Calendar Class getTimeZone() method) getTimeZone() method is available in java.util package. getTimeZone()方法在java.util包中可用。 getTimeZone() method is used to return this Calendar time zone. getTimeZone()方法用于返…

cass展點不在原位置_cass展點之步驟及方法

cass展點之步驟及方法cass展點是根據手工或坐標正反算軟件自動計算的結果,利用cass軟件將點號、坐標及其高程自動展示到圖紙上的一種方法。其基本步驟和方法如下:一、將井下測點的點號、以及計算好的Y坐標、X坐標、及高程由sheet1復制并粘貼到sheet2上面…