Containers vs Serverless:本质区别是什么?
在云计算领域,容器和无服务器计算已经占据了发展前列。
作者 | Emra Samdan
翻译 | bocloudresearch
一点历史
在不久以前,应用程序的开发、部署和维护要比现在复杂得多,耗时也多。在最初,维护不仅需要修复应用程序的代码,还需要修复对物理机器的支持。保持服务器、硬件和软件的更新也是非常关键的任务。
在本世纪初,一种名为“基础设施即服务(IaaS)”的新模式迅速流行起来。IaaS提供了从第三方提供商租用远程服务器和虚拟机的可能性,这些提供商可以完全负责管理硬件、网络和预订。
IaaS出现之后,消除开发人员的所有非编码职责来简化开发人员工作,这一想法推动了新方法、模型和服务的创新。
容器是什么?
Docker的官方网站提供了以下简短而优雅的定义:“容器是一个标准的软件单元,它将代码及其所有依赖项打包,从而使应用程序在不同的计算环境之间快速、可靠地运行。换句话说,通过使用容器,开发人员可以确保他们的应用程序可以在任何云平台或本地服务器上运行。在某些方面,容器类似于虚拟机,比如两者都是隔离资源。但是,虚拟机模拟物理设备,而容器创建应用程序层的抽象。
无服务器计算是什么?
在无服务器计算中,整个应用程序或应用程序的一部分被解耦为多个函数,每个函数都响应诸如HTTP请求、新消息到达消息队列、或在存储中保存或修改新对象等时间触发的。平台可以在特定的时间或周期运行这些函数,这对cron jobs(定时任务)很有帮助。
要使此系统工作,开发人员只需编写功能代码,并将其及其依赖项打包到zip文件中,然后将该zip文件发送到无服务器端点,由提供商负责供应和扩展。
无服务器的关键特性之一是“按需付费”模型,在这种模型中,公司仅按函数的实际执行时间付费。如今,AWS Lambda应该是最受欢迎的无服务器提供商。
容器和无服务器有什么共同之处吗?
是的。现在,无服务器和容器都很流行,它们允许开发人员专注于自己的代码而不是基础设施,这极大地提高了开发速度。容器和 serverless 都非常适合于微服务和基于组件的体系结构。在使用它们时,部署和扩展通常比使用传统的单体架构更快、更具成本效益,因为你操作的是应用程序的一小部分,而不是整个应用程序。虽然容器和serverless 有这些共性,但是每种技术都有自己的优势、弊端和用例。
容器化的优势
容器的第一个优势是可移植性。由于容器已经包含了它需要运行的所有内容,因此只需放置一台安装了容器引擎的机器即可运行。容器与平台无关,因此它们可以运行在Linux、Windows、macOS、Mesos、Docker、Swarm或Kubernetes上。它们甚至可以在另一个容器中运行。
在计算资源使用方面,容器也比虚拟机更高效。尽管容器和虚拟机都是虚拟化的,但是虚拟机会使用自己的操作系统来模拟整个计算机,因此会消耗更多的资源。另一方面,容器可以共享同一操作系统,从而使操作系统更小,更快地启动和关闭。
容器的另一个好处是允许开发人员完全控制应用程序。虽然这意味着必须手动配置系统设置,但这也意味着拥有真正的灵活性。这在serverless上是无法实现的,因为无服务器的所有内容都是由云提供商管理的。
容器的用例
当我们想要将一些大型的单体应用程序重构为更小的独立部分, 以便迁移到微服务体系结构并获得更好的性能、可测试性和扩展速度时,容器确实是很有帮助的。例如,将以前的大型应用程序拆分为几个独立的服务:其中一个负责用户管理,另一个负责转换媒体文件等。每个服务都可以轻松扩展,以便在其职责范围的负载增加时提供更好的性能。但这对于单体应用程序来说是不可能实现的,在单体应用程序中,需要向整个系统添加新实例,这既昂贵又耗时。
因此,容器适合于长时间运行的应用程序,以及具有特定系统需求的应用程序,如果没有对系统的完全控制,这些应用程序很难设置。
Serverless的优势
由于上面提到的“按需付费”模型,托管无服务器应用程序的成本可能比使用任何其他方法都要低得多。无需为功能的空闲时间付费,如果没有流量,那么每月的账单上就不会有费用。几乎所有无服务器的提供商都有免费层,其中包括每月固定数量的请求和执行时间。通常情况下,所提供的数量足以使小网站或初创公司免费运行。
对于容器,将应用程序分发到部件或微服务是关键步骤。在serverless中,它是将应用程序或其各个部分分发到单个函数中,每个函数负责特定的逻辑段。工程师更容易理解和开发单个功能的逻辑,这极大地提高了开发和部署速度。与部署整个应用程序相比,部署一小部分功能的风险更小。
无服务器的另一个巨大优势是自动伸缩。无服务器的函数在提供者控制下的小型、无状态的临时容器中运行。提供者对响应负载峰值的扩展承担全部责任,并且可以在几秒钟内启动数百个实例。而且,仍然只需要为所有函数的总执行时间付费。
什么时候使用无服务器比较好?
Serverless的事件驱动特性使得它对于不总是需要运行的应用程序(或其部分)非常有用。
假设你正在为一个现有的应用程序开发媒体处理功能。新模块虽然不会经常使用,但是仍然需要足够的计算能力来完成它的任务。将其放如应用程序中可能需要切换到更强大的实例——这是一个冒险的举动,因为如果同时运行一些繁重的任务,可能会导致其他所有用户的延迟。在这种情况下,还需要支付更多的费用,并且仍然面临由上述瓶颈所导致的一些问题。
相反,如果选择了serverless,那么媒体处理功能将与应用程序的其余部分隔离。当它不被使用时,就不需要为此付费,并且可以始终确保它不会影响到应用程序的其他部分。
容器的弊端
即使没有人使用应用程序,也至少有一个承载容器的虚拟机实例始终在运行。由此导致容器比无服务器更昂贵。
即使容器可以在共享计算机中快速扩展,但由于需要对计算机本身进行扩展,因此其他扩展也不很快。 但是,将容器与业务流程系统(如Kubernetes或AWS ECS)一起使用可以使扩展更智能。
无服务器的弊端
对于大多数开发人员来说,serverless最可怕的部分是供应商锁定。当你提交到serverless时,实际上是在单个云提供商上进行堆栈。这些函数中使用的无服务器应用程序和 api 的体系结构因不同的提供商而有所不同,因此更改提供商或切换到内部解决方案的成本可能很高。尽管如此,有一些专家并不同意这个观点,他们声称厂商锁定实际上并不是一个问题。
使用无服务器方法不容易实现可观察性、监视和调试。由于应用程序可以被分散到多个部分,而每个部分都有自己的 bug 和错误,所以控制和查看全局变得非常重要。
容器和无服务器可以一起操作吗?
容器和无服务器可以一起操作,答案是肯定的。将主要应用程序功能作为一个容器化的微服务来运行,同时将无服务器使用于某些后台操作或很少使用的功能(但占用CPU),可能会非常有效。
另一个有趣的组合是AWS Fargate提供的。该服务结合了无服务器和容器的优点,允许你更好地控制你的应用程序,而不必担心伸缩难题。
结论
容器和无服务器通常被认为是相互竞争的技术。但仔细观察就会发现它们只是不同的技术,当在同一个项目中使用时,它们实际上可以弥补彼此的缺陷。重要的是要记住,“旧的”并不意味着“过时”,“新的”并不意味着“更好”。解决方案的有效性取决于特定的用例、项目需求、团队经验和团队偏好。
Containers vs Serverless:本质区别是什么?的更多相关文章
- QT:用QSet储存自定义结构体的问题——QSet和STL的set是有本质区别的,QSet是基于哈希算法的,要求提供自定义==和qHash函数
前几天要用QSet作为储存一个自定义的结构体(就像下面这个程序一样),结果死活不成功... 后来还跑到论坛上问人了,丢脸丢大了... 事先说明:以下这个例子是错误的 #include <QtCo ...
- js中函数带不带var的本质区别是什么
本质区别是:带var的是定义,属于statement:不带var的是赋值,属于expression.不带var时,解释器认为变量已经定义过了,会在函数中找相应的定义,如果找不到,就会认为变量是在外一层 ...
- Containers vs Serverless:你选择谁,何时选择?
两者都是当今技术时代的热门话题,也都被视为是开发技术的竞争对手. 首先,还有相当多的好奇和担心.此外,两者都是可供工程师使用的.高效的.机器无关的抽象. 但是,在冠军之间,有一个不可逾越的鸿沟.你要么 ...
- java线程基础巩固---wait和sleep的本质区别是什么,深入分析(面试常见问题)
对于wait和sleep貌似都会阻塞线程,但是它们确实是很大的区别的,所以下面一点点来探讨: 区别一.Sleep()是线程里面的方法,而Wait()是Object类的方法.这个比较简单,直接看代码便知 ...
- 数据库 DROP命令和DELETE命令的本质区别是什么
不同点: 1. 从删除内容上区分: truncate和 delete只删除数据不删除表的结构(定义) drop语句将删除表的结构.被依赖的约束(constrain),触发器(trigger),索引(i ...
- memcached redis 本质区别是功能多少
功能: 1.memcached 数据类型比较单一,数据淘汰策略单一,功能简单 2.redis 数据类型比较全面, 数据淘汰策略比较多,功能较强 有持久化能力,可以持久存储少量数据(数据量不会大于本机内 ...
- 【转】(总结)Linux下su与su -命令的本质区别
原文网址:http://www.ha97.com/4001.html 本人以前一直习惯直接使用root,很少使用su,前几天才发现su与su -命令是有着本质区别的! 大部分Linux发行版的默认账户 ...
- 2017 ACM 字符串的本质
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2017 思路:思考字符串和数字的本质区别是什么. 今天先是试着做了一个完全背包的题目,发现自己还是不会做,弄 ...
- 夯实Java基础系列6:一文搞懂抽象类和接口,从基础到面试题,揭秘其本质区别!
目录 抽象类介绍 为什么要用抽象类 一个抽象类小故事 一个抽象类小游戏 接口介绍 接口与类相似点: 接口与类的区别: 接口特性 抽象类和接口的区别 接口的使用: 接口最佳实践:设计模式中的工厂模式 接 ...
随机推荐
- [Linux] 多进程网络编程监听一个端口
SO_REUSEPORT支持多个进程或者线程绑定到同一端口 每个进程可以自己创建socket.bind.listen.accept相同的地址和端口,各自是独立平等的.让多进程监听同一个端口,各个进程中 ...
- 【转载】【笔记】vue-router之路由传递参数
参考博客地址:https://blog.51cto.com/4547985/2390799 1.通过<router-link> 标签中的to传参 基本语法: <router-link ...
- ubuntu18.04因java路径原因启动jenkins失败
我的云服务器ubuntu18.04上本来装了jenkins,今天安装完tomcat后,将原有的openjdk卸载了,安装了jdk8u192, 此时浏览器访问8080端口显示的就是tomcat安装成功的 ...
- Object对象方法ES5
Object.create(proto,propertiesObject)方法创建一个新对象,使用现有的对象来提供新创建的对象的__proto__. 参数: proto:新创建对象的原型对象. pro ...
- Java之System类
System类概述 java.lang.System 类中提供了大量的静态方法,可以获取与系统相关的信息或系统级操作,在System类的API文档中,常用的方法有: public static lon ...
- BOM介绍以及方法
BOM介绍和window对象的方法 一.BOM对象 (浏览器对象模型 BOM) 1.window alert() confirm() prompt() setInterval() setTimeo ...
- Jedis & spring-data-redis
当我们了解了redis的五大数据类型,手动去敲一敲每个数据类型对应的命令,无论是再来看jedis,还是spring-data-redis都是很轻松的,他们提供的API都是基于原生的redis命令,可读 ...
- Difference between JDK, JRE and JVM
With Java programming language, the three terms i.e. JDK, JRE and JVM will always be there to unders ...
- IDEA中新建SpringBoot项目时提示:Artifact contains illegal characters
场景 一步一步教你在IEDA中快速搭建SpringBoot项目: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/87688277 ...
- 记录:c#实现微信,支付宝扫码支付(一)
因为公司系统业务需要,这几天了解了一下微信和支付宝扫码支付的接口,并用c#实现了微信和支付宝扫码支付的功能. 微信支付分为6种支付模式:1.付款码支付,2.native支付,3.jsapi支付,4.a ...