
作者:秋雨陈(本文转载自”函数计算征集令“征文)
随着 Serverless 架构的不断发展,各云厂商和开源社区都已经在布局 Serverless 领域,一方面表现在云厂商推出传统服务/业务的 Serverless 化版本,或者 Serverless 计算平台,另一方面表现在开源社区中 Serverless 相关项目逐渐丰富起来,无论是平台类还是工具类的开源项目,再或者是框架类的开源项目,都如雨后春笋般快速成长。
任何技术,在这样繁荣发展背后,都会快速升级和迭代,Serverless 架构也不例外,从阿里云的 FaaS 产品发展过程中,不难看出 Serverless 架构在提效和降本的道路上不断的场景化,特色化;在产品形态上也不断的趋于完整化,统一化,虽然距离“大道至简”还有一定的距离,但是也只是时间的问题了。
Serverless 架构在不断发展,无论是产品形态还是技术架构都可以用日新月异来描述。
最初,Serverless 架构指的是 FaaS 与 BaaS 的结合,认为开发者可以不用花费更多的精力在服务器等底层资源上,而是可以将精力放在更具价值的业务逻辑之上。这也是文章《Serverless Architectures》中所强调的观点。
但随着时间发展,大家发现,对于 Serverless 架构这样的描述过于单薄,没有凸显出 Serverless 架构为业务带来的技术红利,也没能表现出 Serverless 所交付的心智。所以 UC 伯克利在《Cloud Programming Simplified: A Berkeley View on Serverless Computing》中对 Serverless 架构进一步的定义:对于被认为是Serverless 架构的服务/产品还需要具备按量付费和弹性伸缩的特点,并认为, long-run 的运行模式并不符合 Serverless 精神。
云计算相关技术的发展,往往有一个特点:云厂商的驱动性非常强,因为云厂商往往会最先感知到普遍性的用户需求,并且有足够的数据支撑其做出合理的判断与创新。所以 Serverless 架构的创新很多时候也都是由厂商驱动的;在事件驱动与函数计算的发展下,厂商逐渐发现函数计算的模式“短时运行”没有办法满足更多用户的诉求,此时一种 long-run 模式的 Serverless 计算服务就逐渐的被孵化出来了,至此,Serverless 架构也从最初的单薄,逐渐完善,通过“自我革新”,完成了新一轮业务能力的自我丰富与产品功能的自我完善。
随着 long-run 模式逐渐被开发者们认可,传统 Serverless 架构的定义有点“格格不入”:既不能在模式上覆盖最新的 Serverless 产品纬度,也不能在形态上描述清 Serverless 的特性。此时 Serverless 架构定的义,就自然而然的得以升级,例如:
至此,Serverless 架构实现了此阶段下的产品形态升级与 Serverless 精神的更迭。
通过阿里云官网,不难发现其 Serverless 产品形态还是相对完整的:
Serverless 架构的热度不断增加,各产品也需要借着热度进一步突破和创新,所以 Serverless 这个词“被乱用”再所难免;每个团队都有自己的特色,基于 Serverless 架构完善和更迭自身能力,也是产品发展的必经之路,就像数据库发展到云数据库,再发展到云原生数据库,再发展到 Serverless 数据库一样;
所以,Serverless 架构需要一个“粘合剂”,将各种 Serverless 产品进行进一步的链接,使其不是“混杂在诸多产品中的某些产品”,而是“可以联合起来解决某个问题的具体功能”,换句话来说将不同的产品联合到一起,以应用的维度为开发者提供场景化支持,这也是 Serverless 架构从资源朝着应用,再朝着业务发展的必经之路。
阿里云推出“应用的概念”,试图以计算平台和核心,通过BaaS 产品的联动,让本来“杂乱的花园”,逐渐的变得规矩,有条理起来;让本来需要开发者“痛苦的选择”,逐渐的变成场景化推荐,流程化引导。
本次活动是阿里云 Serverless 函数计算评测,所以本文仅对函数计算与其相关产品进行体验,包括函数计算本身(包括三个主要模块:基础模块服务与函数和上层封装模块应用、任务),Serverless 工作流以及开源项目 Serverless Devs。
函数与服务的功能如下图所示:

函数计算产品形态为两层结构:服务、函数。
函数计算的两层概念为开发带来了一定的便利:
函数计算的上手流程相对简单,通过函数计算文档,可以看到整体流程:

即,开发者只需要完成代码的开发和部署,即可实现业务的弹性伸缩和按量付费能力的夹持,这也符合 CNCF 在白皮书中对 Serverless 架构流程定义的规范。通过阿里云函数计算控制台可以快速进行这个流程的体验,点击“服务及函数”选项,就可以看到服务列表:

此时可以根据需要,创建服务和函数:

完成之后,可以在线编辑代码与在线测试:

至此,完成了函数计算上手,在整个过程中,有几个明显的感觉:
除服务与函数,函数计算还有一个模块:任务。

在任务页面的描述汇总,不难看出它实际上是函数的一种变形:

通过创建任务的过程,以及创建任务结束页面:

同样可以验证刚刚的想法:任务的本质依旧是函数计算,只不过:
由于任务往往是异步的,所以从上游经过函数的处理再传递到下游,整个链路的串联是非常重要的,这也是对云厂商服务一致性与可观测性的一种考验。
通过对任务的体验,整体感觉是比较顺畅的,通过抽象出来的产品化能力,让任务的创建流程和步骤更加精简,可以帮助“特定的开发者快速使用”;但是也会对一些新手用户产生困扰:应用、任务、服务及函数是什么关系?任务和函数有什么区别?
与任务相同的是,应用也是建立在服务与函数之上的;与任务不同的是,应用不仅仅是函数计算。可以认为,应用是函数计算中,联动其他产品的入口或者 Serverless 应用的管理平台。
通过应用创建页面,可以快速体验 Serverless 应用:

可以看到,应用与任务,服务及函数的很大区别在于,应用是场景化非常明确的一个模块,所有的创建过程和导入的过程均是在建设“场景化”的心智。通过应用创建页面,可以看到目前已经有框架、音视频处理等多个场景的应用,以其中的图片压缩为例进行体验:

可以通过引导快速完成应用创建,整个流程最为精简。创建完成之后,可以得到最终的体验页面:

在体验页面中,可以体验当前应用的功能。
应用的出现,无疑是 Serverless 架构多产品逐渐“一起战斗”的表现,即开发者对应用进行管理,而不再是对代码和资源进行分别的管理。通过应用模块,开发者可以:
值得注意的是,应用功能默认有一套标准的 GitOps 配置,通过基于代码仓库进行应用部署之后可以发现应用本身是基于 Serverless Devs 开发者工具实现的,这也充分的将线上平台与线下工具进行联动,在一定程度上可以进一步保证开发者使用体验的一致性。另外,在体验应用模块之后,会产生一些想法:
Serverless 工作流在一定程度上可以认为是任务模块的一种升级表现。即单纯的任务模块是基于函数计算的,是异步的,Serverless 工作流在此基础上增加了编排能力:

通过 Serverless 工作流夹持的任务将会:
在体验 Serverless 工作流之后,也有一些思考:
关于阿里云 Serverless Devs 上手,可分为三个流程:
由于 Serverless Devs 项目是发布在 Npm 的,所以在安装之前需要开发者先配置 Node.js 开发环境,再通过 npm 工具进行工具的安装。安装完成之后,可以通过 s config命令进行密钥信息配置:

可以通过s init命令,进行案例代码的初始化:

完成初始化之后,可以直接进行业务的部署:

部署完成后,可以通过浏览器打开项目,进行预览:

同样基于这三个流程,Serverless Devs 也是可以快速的与常见的流水线进行集成,目前官方提供的案例包括Github Action,Gitee Go,Jenkins,以及云效等,但是阅读过相关文档后,不难发现,即便是其他的流水线,也是同样的操作流程。
Serverless Devs 开发者工具针对阿里云 Serverless 架构来说,其最大的意义和价值,应该就在于:
从开发角度来看,Serverless Devs 开发者工具解决了 Serverless 领域常见的几个痛点:
天下大同也许是不可能的,但是技术发展的结局,趋于同质化却是一种趋势。
Serverless 架构同样如此,在云原生技术日益发展的今天,Serverless 架构已经不再是单纯的某个产品或者某种形态,他应逐渐的发展成为一种思想。
基于 Serverless 架构所传递的精神,已经有越来越多的 Serverless 产品出现,尽管如今,他们依旧是“单打独斗”的多,但随着时间的发展,这些产品注定会以一种”粘合剂“为核心,统一的,一致的为开发者提供服务。
虽然 Serverless 架构并没有确切的定义,但他所要传达的心智却一定不是更复杂。
所以在未来的发展过程中,Serverless架构的发展方向之一,就是做减法,减掉那些”看似合理,却又没有道理的能力“。例如,为什么要透露出各种实例类型(弹性实例、GPU实例、性能实例、按量实例等)?为什么需要配置预留,需要配置弹性策略?
也许,很多为什么现在看来是合情合理,但是站在另一个维度上,他可能就是不合理的,所以做减法,不仅仅是一种勇气,更是一种对技术的挑战,对产品抽象能力的挑战。
Serverless 架构的下一站是什么?这是一个很多人思考的问题。
函数计算仅仅是一个计算平台,可以单打,但也不能独斗,想要更容易被接受,资源的聚合、联动是必不可少的。尽管函数计算的应用模块,在一定程度上正在联动更多资源,但是这也仅仅是管理层面的,开发者所接触Serverless 架构后,开发也是非常重要的一环节,那么云开发模式就值得考虑。
Serverless 架构在一定程度上是可以让很多功能模块化的,而模块化的进一步发展,就可能是低代码模式。
基于 Serverless 架构的低代码有望将 Serverless 思想应用到产品建设思想上,模块化的快速部署、更新,平稳发布与下线也都是符合 Serverless 思想的。
Serverless架构,在未来将会像云主机,容器服务一样,成为云计算时代新的基础设施;在对基础设施的维护的基础上,为开发者提供更为场景化的服务有望成为 Serverless 架构突破自我瓶颈的突破口。
在未来,Serverless 将会是一种“形态不统一,但是目标很统一”的技术架构思想,开发者可以以一种更为一致性的体验,快速使用 Serverless 架构构建自己的场景化应用,当然这里的Serverless包括了不同形态的服务,例如数据库、网关、函数计算等。
综上所述,Serverless 架构在不断的发展,Serverless 架构的精神也在不断的更迭,从函数计算到应用,从开发、运维到全生命周期,Serverless架构要回答的问题很多,要做的事情更多。
更多内容关注 Serverless 微信公众号(ID:serverlessdevs),汇集 Serverless 技术最全内容,定期举办 Serverless 活动、直播,用户最佳实践。
我是一名决定学习Ruby和RubyonRails的ASP.NETMVC开发人员。我已经有所了解并在RoR上创建了一个网站。在ASP.NETMVC上开发,我一直使用三层架构:数据层、业务层和UI(或表示)层。尝试在RubyonRails应用程序中使用这种方法,我发现没有关于它的信息(或者也许我只是找不到它?)。也许有人可以建议我如何在RubyonRails上创建或使用三层架构?附言我使用ruby1.9.3和RubyonRails3.2.3。 最佳答案 我建议在制作RoR应用程序时遵循RubyonRails(RoR)风格。Rails
我尝试用Ruby设计一个基于Web的应用程序。我开发了一个简单的核心应用程序,在没有框架和数据库的情况下在六边形架构中实现DCI范例。核心六边形中有小六边形和网络,数据库,日志等适配器。每个六边形都在没有数据库和框架的情况下自行运行。在这种方法中,我如何提供与数据库模型和实体类的关系作为独立于数据库的关系。我想在将来将框架从Rails更改为Sinatra或数据库。事实上,我如何在这个核心Hexagon中实现完全隔离的rails和mongodb的数据库适配器或框架适配器。有什么想法吗? 最佳答案 ROM呢?(Ruby对象映射器)。还有
“架设一个亿级高并发系统,是多数程序员、架构师的工作目标。许多的技术从业人员甚至有时会降薪去寻找这样的机会。但并不是所有人都有机会主导,甚至参与这样一个系统。今天我们用12306火车票购票这样一个业务场景来做DDD领域建模。”开篇要实现软件设计、软件开发在一个统一的思想、统一的节奏下进行,就应该有一个轻量级的框架对开发过程与代码编写做一定的约束。虽然DDD是一个软件开发的方法,而不是具体的技术或框架,但拥有一个轻量级的框架仍然是必要的,为了开发一个支持DDD的框架,首先需要理解DDD的基本概念和核心的组件。一.什么是领域驱动设计(DDD)首先要知道DDD是一种开发理念,核心是维护一个反应领域概
我有一个模型,其中有一个名为birthday的date列。我如何计算距离用户下一个生日还有多少天? 最佳答案 这是一个简单的方法。你要确保捕获今年已经通过的案例(以及尚未通过的案例)classUser=bday(bday-Date.today).to_iendend并证明这一点!(我添加的是timecopgem以保持计算截至今天(2012-10-16)的准确性require'test_helper'classUserTest 关于ruby-on-rails-在Rails中计算到下一个生日
我在当前项目中使用由Oracle数据库和memcached支持的RubyonRails。有一个非常常用的功能,它依赖于单个数据库View作为数据源,并且该数据源内部有其他数据库View和表。这是一个虚拟数据库View,能够从一个地方访问所有内容,而不是物化数据库View。大多数情况下,如果用户正在使用他们希望更新的功能,那么让数据保持最新很重要。从这个View获取数据时,我将安全表内部连接到View(安全表不是View本身的一部分),其中包含一些我们用来在更细粒度级别上控制数据访问的字段。例如,安全表有user_id,prop_1,prop_2列,其中prop_1,prop_2是数据库
一、介绍一下vercelvercel是一个站点托管平台,提供CDN加速,同类的平台有Netlify和GithubPages,相比之下,vercel国内的访问速度更快,并且提供Production环境和development环境,对于项目开发非常的有用的,并且支持持续集成,一次push或者一次PR会自动化构建发布,发布在development环境,都会生成不一样的链接可供预览。但是vercel只是针对个人用户免费,teams是收费的首先vercel零配置部署,第二访问速度比github-page好很多,并且构建很快,还是免费使用的,对于部署个人前端项目路、接口服务非常方便vercel类似于git
我正在开发一个包含大约10个不同功能组件的Sinatra应用程序。我们希望能够将这些组件混合并匹配到应用程序的单独实例中,完全从config.yaml文件配置,如下所示:components:-route:'/chunky'component_type:FoodListercomponent_settings:food_type:baconmax_items:400-route:'places/paris'component_type:Mappercomponent_settings:latitude:48.85387273165654longitude:2.340087890625-
文章目录⭐️赠书活动-《从程序员到架构师》⭐️编辑推荐⭐️作者简介⭐️赠书活动→获奖名单⭐️赠书活动-《从程序员到架构师》内容简介:《从程序员到架构师:大数据量、缓存、高并发、微服务、多团队协同等核心场景实战》分为数据持久化层场景实战、缓存层场景实战、基于常见组件的微服务场景实战、微服务进阶场景实战和开发运维场景实战5个部分。基于对十余个架构搭建与改造项目的经验总结,介绍了大数据量、缓存、高并发、微服务、多团队协同等核心场景下的架构设计常见问题及其通用技术方案,包含冷热分离、查询分离、分表分库、秒杀架构、注册发现、熔断、限流、微服务等具体需求下的技术选型、技术原理、技术应用、技术要点等内容,将
我想要一个非常基本的小型基础程序示例,它读入两个插件并注册它们。这两个插件以相同的方式以不冲突的方式挂接到基础程序。就此而言,我对任何编程语言的元编程都很陌生,我不确定从哪里开始。 最佳答案 我已经研究这个问题一段时间了。我尝试了很多不同的方法来做这件事,并征求了很多人的建议。我仍然不确定我所拥有的是否是“正确的方法”,但它运作良好并且很容易做到。在我的例子中,我专门查看配置并引入配置插件,但原理是相同的,即使我的术语特定于cnfiguration。在非常基础的层面上,我有一个配置类,里面什么都没有——它是空的。我还有一个Confi
我最近开始了一个Rails项目,并决定使用RESTfulController。我为我的关键实体(例如国家/地区)创建了Controller并添加了index、new、edit、create、显示、更新和删除。我将我的map.resources:country添加到我的路线文件中,生活很美好。开发稍有进展后,就开始遇到问题了。我有时需要在我的Controller中执行额外的操作。首先是search操作,它返回我喜欢的自动完成搜索框的选项。然后需要在应用程序的不同位置以两种不同的方式显示国家/地区(显示的数据也不同,所以它不仅仅是两个View)-我添加了index_full操作。然后我想在