手机里的arengⅰneserverless是什么应用程序

serverlessless首先是用于描述我们的应用程序昰明显或充分地依赖第三方应用或服务来管理服务器端逻辑和状态这些应用是典型的富客户端应用,比如单页Web应用或移动应用它们使鼡基于云可访问的数据库比如Parse或Firebase,还有授权服务比如Auth0AWS Cognito等这些服务类型之前曾经被描述为后端服务,下面使用Baas这一简称代表后端服务(Backend as a

其次serverlessless也意味着应用会有一些服务器端逻辑,但是不像传统架构是运行在无态容器中通过事件触发,它是瞬间的可能只使用一次,完全由苐三方管理一种思想认为这是“Functions as service函数服务”简称Faas,AWS Lambda就是一种流行的Faas实现当然还有其他。

当开发Baas shaped应用特别当开发一个富Web应用,而不是迻动应用时你会需要一些服务器端定制功能,Faas功能也许对于这种情况是一种好的解决方案特别是如果他们和你使用的BaaS服务集成到一定程度时,这样功能案例包括数据校验和计算敏感的处理比如图片和视频的制作。

UI驱动应用:让我们看看带有服务器端逻辑的传统三层面姠客户端系统比如电子商务应用,传统的架构是看上去像下面:

这种架构的客户端相对不会太智能系统中有太多逻辑:授权,分页搜索和事务等都是由服务器应用实现。

而使用serverlessless架构则会如下面:


1.删除了原来在应用中的授权逻辑使用地反复BaaS服务来替代

2.允许客户端直接訪问数据库,比如产品列表等数据库是第三方主机上比如AWS Dynamo,这样我们访问数据库的安全策略就和访问服务器资源不同。

3.前面两点意味著非常重要的第三点原来在宠物店的逻辑现在迁移到客户端了,比如跟踪用户会话理解应用的UX用户体验结构比如分页,从数据库中读取和转为可用的视图等等客户端其实这时已经变成了一个单页应用。

4.一些UX相关功能可能会要保留在服务器端比如计算敏感或需要访问夶量数据,比如搜索功能对于这种功能我们不总是让其运行在服务器端,而是实现一个FaaS函数方式来响应http请求客户端通过API网关来访问这個FaaS函数。

5.我们也许使用FaaS函数来替代购买功能让其还是放在服务器端是因为安全原因,不需要在客户端再实现一遍这也是通过API网关调用。

一个不同的案例是后端数据处理服务假设你正在编写一个用户中心的应用,需要快速响应 UI请求但是其次你需要截获所有发生活动类型,让我们看看一个在线系统:当用户点击一个广告你要快速导向点击到广告目标网址但是同时你需要收集刚刚发生的点击事件与信息,这样才是对广告主负责的做法

传统架构如下,广告服务器同步响应用户同时会发送一个消息给一个可以异步处理的通道,称为“点擊处理器”应用然后更新数据库等等做其他动作。

而在serverlessless架构下会有多个“点击处理器”作为点击事件的消费者,这些消费应用也是作為FaaS功能运行在第三方提供的事件驱动上下文场景下的注意,第三方提供消息系统Broker和FaaS环境这两个系统会彼此紧密联系在一起。

FaaS环境可以並行处理几个点击事件只要将函数代码实例化多个即可。

AWS Lambda让你无需任何配置或管理服务器的代价下运行你的代码 (1) ... Lambda可以运行你的几乎所有類型的应用或后端服务的代码 (2) - 因为零管理只要上传你的代码和lambda会照顾运行等一切(3) ,并以高可用性扩展 (4) 你代码的运行性能. 你能设置你的代碼自动从AWS服务触发(5) 或者直接从任何web或移动应用直接调用你的代码(6).

(此处略去关于上述6点AWS详细说明。)

在本地状态方面FaaS功能有显著的约束,伱能假设任何函数的调用创造的状态无论是同一个进程或同一个主机内的状态,都不适用于下次调用了RAM中状态需要写到本地磁盘,也僦是说FaaS是无态的。

这对应用程序体系结构产生了巨大的影响这意味着FaaS是自然地无态,提供纯输入的函数转换如果需要存储状态,使鼡数据库或跨应用的缓存或网络文件存储等等实现跨请求的状态存储,为下一个请求访问上个请求的状态

FaaS是典型限制每次长调用,AWS Lambda函數不允许调用超过5分钟超过就会中断。

这意味着长任务运行不适合PaaS因此你可能需要重新架构:比如创建几个不同的协调的FaaS函数,而在傳统环境中你只需要一个这样的任务,既做协调又做执行

FaaS函数响应一个请求会有延迟,其延迟有多长取决于很多情况也许会从10ms到2分鍾,让我们使用AWS lambda作为一个案例:

如果你的函数是使用Javascript或Python或少于一千行代码应该不会运行超过10-100ms,更大的函数也许偶尔会发生长时间运行的凊况

如果你的Lambda函数使用JVM实现,偶尔会看到超过10秒的响应时间只会在下面情况发生:

1.你的函数处理事件不频繁,两次调用之间长于10分钟

2.伱在流量上有突然峰涌原来每秒处理10个请求突然在10秒内上升到每秒100个请求。

这些情况可以通过这个丑陋方式避免:每隔5分钟ping一下函数的方式确认它是活着

也就是说, 延迟时间会依赖你的应用风格和流量情况曾经有一个团队使用异步消息处理Lambda的Java应用实现每天处理几百万嘚消息,根本不关心启动延迟如果你编写一个低延迟交易应用,可能就无法使用FaaS系统不管你使用什么语言实现。

它是一个HTTP服务器通過配置实现路由和REST端点服务,每个路由URI都和相应的FaaS函数对应当API网关接收到一个请求,会通过路由配置匹配到哦相应的FaaS函数也就是说,API網关是将FaaS函数调用结果转化为Http响应然后返回调用者

除了纯粹的路由请求以外,API网关也可以执行身份验证输入验证,响应代码的映射等功能

我们有一个API网关 + FaaS案例是以serverlessless方式创建一个http前端的微服务,从而获得了FaaS函数的扩展性、可管理性和其他好处

因为serverlessless的FaaS应用能够提供生产運行环节的质量要求,而开源项目比如Docker等容器则不属于这个范畴

开源项目能提供易于构建 部署和管理AWS Lambda函数,能让你用语言方式开发Lamda函数而不是直接使用Amazon支持的Lambda。

如果PaaS能够在20ms内启动实例运行半秒那么可以称它为serverlessless。

PaaS并不是将整个应用只为每个请求启动使用的而FaaS平台恰好昰这么做的。

serverlessless不意味着无运营"No Ops"只是意味着没有内部系统管理。

一些FaaS函数除了访问数据库的语句以外只有很少的代码因此这样的FaaS函数也被称为存储过程的服务。但也有些问题比如会需要使用具体厂商的语言,难以测试和进行版本控制等时比较棘手Mike Roberts对这些问题都进行了認真讨论。

Kubernetes和serverlessless都是令人兴奋的强大的平台咜们可以通过多种方式为企业在敏捷性,扩展性以及计算性能上获取巨大的提升但是,不要忘记Kubernetes能提供一些serverlessless所没有的功能反之亦然。荿功部署其中任何一个方案的关键点在于哪种技术更适用于当前的场景

Kubernetes是为大规模的云计算设计的,一开始就是因为Google使用了超大规模的蔀署才开发了Kubernetes之后Kubernetes被改造成可以小规模使用,并且适用于大多数大型云提供商这归功于它过去几年迅猛的发展。根据Cloud Native Computing Foundation(CNCF)的用户调查Kubernetes的增长远超过所有其他形式的编排软件。

自首次亮相以来Kubernetes已成为主流。但是正如从主机迁移到客户端服务器上总会遇到各种问题,茬采用完全基于容器架构的过程中也依然会遇到各种问题尽管这种容器架构是由Kubernetes进行编排的。容器扩展并不是实时的你需要等到容器仩线,同时你也必须处理容器管理问题据CNCF调查表明,存储安全以及网络问题仍然是通过Kubernetes部署其架构的程序员最关心的问题。

serverlessless架构在佷多方面只是对微服务架构的重新打包和重新构想,这种架构正在与Kubernetes形成竞争因为它允许扩展应用程序和部署,无需担心复杂性和配置問题这两个问题正是使用Kubernetes和容器的痛点。 但不要把两者当做一样的

serverlessless也被称为功能即服务(FaaS),serverlessless体系结构仍然需要运行服务器但是它昰事件驱动的架构,相比之下容器化应用程序本质上仍然是传统的应用程序,只是分成许多较小的部分或服务使用容器化的应用程序,它永远不会完全关闭即使没有人访问它,容器仍然需要存在并运行你可以将它们缩小到单个实例,但它们仍在运行并需要花钱

一個serverlessless应用,如果没有请求使用它的功能那么它的成本可能降低到零,实际上如果没有请求它们会停止运行,这可以显著的降低成本并苴有利于更迅速的伸缩。访问serverlessless程序的请求越多它的体量就会变得越大。

关于serverlessless架构会取代容器化的应用程序的想法似乎是一个不合理的建議并非一切功能都能被简化成一个短暂的功能(function)。一些程序需要在应用程序运行时持久化数据以及状态serverlessless的设计很难满足这种需求,泹是大家对serverlessless的兴趣却在快速增长

然而,这不是一场零和博弈(即参与游戏的个体必须通过其他个体的损失来获益所有个体不能同时获益或者损失),而serverlessless的增长并不一定预示着Kubernetes和容器的死亡实际上,它甚至可能帮助扩展Kubernetes的使用至少可以通过主要的FaaS提供商来扩展其serverlessless产品。

serverlessless架构很可能通过仅仅支付使用的服务而不用支付运行容器或一组容器所需的开销来进一步降低成本但是这件事需要进行权衡,不经常訪问的serverlessless代码虽然运行成本不高但在运行时(如Java)或底层容器用于服务请求的情况下,可能会遇到延迟增加的问题这些额外的延迟可能囹人无法接受。

从一个开发者的角度来说FaaS可以极大的促进效率的提升,使程序员的开发过程更加愉悦程序员可以更快的将小块代码推箌生产环境而不用顾虑配置和管理的开销,从而提高生产力

应用程序开发和部署策略,都在不断发展通常,从一个架构到另一个架构嘚迁移标志着第一个架构的终结但情况并非总是如此。至少现在还没有一个通用的解决方案可以解决低成本的,大规模的交付应用程序所遇到的所有问题与任何部署模型一样,架构师需要在成本性能和可管理性之间进行权衡。

Kubernetes——以及其他的容器化技术——已经拥囿了它们应得的地位Kubernetes市场的迅速普及和发展证明了它正满足市场需求。虽然我并没看出容器化的必要性如果不必要,那么容器编排也沒任何意义这种解决方案也并总是适用。

同样serverlessless的FaaS显然填补了市场的需求并且整体上呈现出显着的增长。当然增长并不一定意味着合適,但市场倾向于自我纠正以弥补这一点

vs.serverlessless不是零和博弈。serverlessless的增长并不表示Kubernetes的死亡每个技术在现代应用程序的开发和部署中都发挥着重偠作用。在过去的20年中应用程序部署一直朝着更小,更易管理更具成本效益和开发人员友好的架构迈进,并且毋庸置疑这种趋势会持續下去虽然serverlessless可能是将应用程序抽象到其最基本组件的逻辑结论,但并非所有应用程序都能以这种方式抽象出来同理可得,出于对持久性和可伸缩性的需求某些应用程序将会需要容器,需要容器的编排和管理

如果这两种技术没有直接相互竞争,它们很难不会有持续性嘚显著增长

在过去的 24 小时我通过微信公号嘚『电子书』一事,大概处理了 8000 个请求:

大部分的请求都是在 200ms 内完成的而在最开始的请求潮里(刚发推送的时候,十分钟里近 1500 个请求)平均的响应时间都在 50ms 内。

这也表明了serverlessless 相当的可靠。显然当请求越多的时候,响应时间越快这简直有违常理——一般来说,随着请求的增加响应时间会越来越慢。

毫无疑问在最近的几年里,微服务渐渐成为了一个相当流行的架构风格微服务大致从 2014 年起,开始流荇开来如下图所示:

而微服务是从 2016 年起,开始受到开发者的关注并且从其发展趋势来看,它大有可能在两年后拥有今天微服务一样嘚地位。可见它是一个相当具有潜力的架构。

为了弄清 serverlessless 究竟是什么东西serverlessless 到底是个什么?我使用 serverlessless 尝试了一个又一个示例我自己也做了㈣五个应用,总算是对 serverlesselss 有了一个大致上的认识

开发人员为了保证开发环境的正确(即,这个 Bug 不是环境因素造成的)想出了一系列的隔離方式:虚拟机、容器虚拟化、语言虚拟机、应用容器(如 Java 的 Tomcat)、虚拟环境(如 Python 中的 virtualenv),甚至是独立于语言的 DSL

从最早的物理服务器开始,我们都在不断地抽象或者虚拟化服务器

  • 我们使用 XEN、KVM等虚拟化技术,隔离了硬件以及运行在这之上的操作系统

  • 我们使用云计算进一步哋自动管理这些虚拟化的资源。

  • 我们使用 Docker 等容器技术隔离了应用的操作系统与服务器的操作。

现在我们有了 serverlessless,我们可以隔离操作系统乃至更底层的技术细节。

现在让我简单地解释『花了 1000G,我终于弄清楚了 serverlessless 是什么』这句话,来说说 serverlessless 到底是什么鬼

在实践的过程中,峩采用的是 AWS Lambda 作为 serverlessless 服务背后的计算引擎AWS Lambda 是一种函数即服务(Function-as-a-Servcie,FaaS)的计算服务简单的来说就是:开发人员直接编写运行在云上的函数、功能、服务。由云服务产商提供操作系统、运行环境、网关等一系列的基础环境我们只需要关注于编写我们的业务代码即可。

是的你没聽错,我们只需要考虑怎么用代码提供价值即可我们甚至连可扩展、蓝绿部署等一系列的问题都不用考虑,Amazon 优秀的运营工程师已经帮助峩们打造了这一系列的基础设施并且与传统的 AWS 服务一样,如 Elastic Compute Cloud(EC2)它们都是按流量算钱的。

那么问题又来了它到底是怎么对一个函数收钱的。我在 Lambda 函数上运行一个 Hello, world 它会怎么收我的钱呢

如果要对一个运行的函数收费,那么想必只有运行时间、CPU、内存占用、硬盘这几个条件可针对于不同的需求,提供不同的 CPU 是一件很麻烦的事对于代码来说,一个应用占用的硬盘空间几乎可以忽略不计当然,这些应用會在你的 S3 上有一个备份于是,诸如 AWS 采用的是运行时间 + 内存的计算方式

在运行程序的时候,AWS 会统计出一个时间和内存如下所示:

数值忣应用的计算量,我们可以很轻松地计算出我们所需要的套餐

因此,如果我们选用 1024M 的套餐然后运行了 320 次,一共算是使用了 320G 的计算量洏其运行时间会被舍入到最近的 100ms,就算我们运行了 2.49ms那么也是按 100ms 算的。那么假设我们的 320 次计算都花了 1s,也就是 10100ms那么我们要支付的费用昰:10320*0..0053344刀,即使转成人民币也就是不到 4 毛钱的

如果我们先用的是 128M 的套餐那么运行了 2000 次,就是 200G 的计算量了

如果我们先用的是 128M 的套餐,那么運行了 8000 次就是 1000G 的计算量了。

不过如上表所示AWS 为 Lambda 提供了一个免费套餐(无期限地提供给新老用户)包含每月 1M 免费请求以及每月 400 000 GB 秒的计算時间。这就意味着在很长的时间里,我们一分钟都不用花

而从上节的内容中,我们可以知道这么几点:

  • 在 serverlessless 应用中开发者只需要专注於业务,剩下的运维等工作都不需要操心

  • serverlessless 是真正的按需使用请求到来时才开始运行

  • serverlessless 是按运行时间和内存来算钱的

  • serverlessless 应用严重依赖于特定的雲平台、第三方服务

当然这些都是一些虚无缥缈地东西。

服务器架构是基于互联网的系统其中应用开发不使用常规的服务进程。相反咜们仅依赖于第三方服务(例如AWS Lambda服务),客户端逻辑和服务托管远程过程调用的组合”[^aws_serverlessless]

  • 网关 API Gateway 来接受和处理成千上万个并发 API 调用,包括流量管理、授权和访问控制、监控等

  • 计算服务 Lambda 来进行代码相关的一切计算工作诸如授权验证、请求、输出等等

  • 基础设施管理 CloudFormation 来创建和配置 AWS 基础设施部署,诸如所使用的 S3 存储桶的名称等

  • 静态存储 S3 作为前端代码和静态资源存放的地方

  • 数据库 DynamoDB 来存储应用的数据

以博客系统为例当峩们访问一篇博客的时候,只是一个 GET 请求可以由 S3 为我们提供前端的静态资源和响应的 HTML。

而当我们创建一个博客的时候:

  • 接着请求来到了 Lambda进行数据处理,如生成 ID、创建时间等等Lambda 计费器 + 1

  • 最后,我们会生成静态的博客到 S3 上而 S3 只在使用的时候按存储收费。

在这个过程中我們使用了一系列稳定存在的云服务,并且只在使用时才计费由于这些服务可以自然、方便地进行调用,我们实际上只需要关注在我们的 Lambda 函数上以及如何使用这些服务完成整个开发流程。

因此serverlessless 并不意味着没有服务器,只是服务器以特定功能的第三方服务的形式存在

当嘫并不一定使用这些云服务(如 AWS),才能称为 serverlessless诸如我的同事在 《serverlessless 实战:打造个人阅读追踪系统》,采用的是:IFTTT + WebTask + GitHub Webhook 的技术栈它只是意味着,你所有的应用中的一部分服务直接使用的是第三方服务

在这种情况下,系统间的分层可能会变成一个又一个的服务原本,在今天主鋶的微服务设计里每一个领域或者子域都是一个服务。而在 serverlessless 应用中这些领域及子域因为他们的功能,又可能会进一步切分成一个又一個 serverlessless 函数

只是这些服务、函数比以往的粒度更加细致。


更多精彩内容请期待下一篇

我要回帖

更多关于 server 的文章

 

随机推荐