容器性能比无容器服务器,【译】容器 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.mzph.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上面…