摘要:在未来,云上交付模式会逐步从Serverful为主转向Serverless为主。
本文分享自华为云社区《DTSE Tech Talk 第13期:Serverless凭什么被誉为未来云计算范式?》,作者: 华为云社区精选。
DTSE Tech Talk(华为云开发者联盟推出的技术公开课)解读云上前沿技术,畅聊开发应用实践。专家团队授课,答疑解惑,助力开发者使用华为云开放能力进行应用构建、技术创新。
在本期《Serverless凭什么被誉为未来云计算范式?》的主题直播中,华为云PaaS DTSE 技术布道师石敏和郑州迅课教育科技有限公司总经理张棪,与开发者和伙伴朋友们交流当前Serverless最新趋势,结合最佳实践场景化赋能,让开发者快速了解微服务架构最新状态。
CNCF给出的定义是:一种新的云原生计算模型,无需服务器管理而构建和运行应用程序的架构。一个或多个功能的应用上传到平台后执行、扩展和计费。听起来有些抽象,简单来说就是构建应用程序时不再需要管理服务器,由平台负责它的执行、扩展,并根据运行量计费。
信通院也给出了定义:即以应用为中心,无需关注基础设施的计算模式。FaaS不是其唯一的形态,Serverless是一整套能力的合集,越来越多的第三方服务演进为全托管的Serverless形态。
信通院的定义更多地强调在Serverless的落地形态上,包括现在已经广泛推出的FaaS产品-函数计算服务,还有近几年推出的Serverless容器,Serverless应用引擎,以及第三方的服务比如Serverless数据库。同时对这些产品还需要有配套的开发、测试以及CICD工具,保证可观测和安全。
针对Serverless带来的价值或者说好处,IBM对使用Serverless应用的用户做了一次调查,报告显示,36%的用户认为serverless降低了运维成本,34%的用户认为提升了性能,33%的用户认为带来了更好弹性,其他分别是提升了开发、上线效率和节省人力。BBVA对使用AWS函数计算服务lambda开发应用和直接使用服务器开发应用的收益做了对比,在请求频率不高时,lambda有很大成本的优势,同时,使用函数计算开发,交付的周期也由周提升到天甚至是小时级别。在未来,云上交付模式会逐步从Serverful为主转向Serverless为主。
为了帮助更多的用户享受 Serverless 技术红利,华为云在 Serverless 的基础设施上,以华为元戎为底座,推出了华为云 FunctionGraph。
华为云FunctionGraph是一项基于事件驱动的函数托管计算服务。通过函数工作流,只需编写业务函数代码并设置运行的条件,无需配置和管理服务器等基础设施,函数以弹性、免运维、高可靠的方式运行。
华为云FunctionGraph提供新一代Serverless函数计算与编排服务。函数计算是基于事件驱动的云托管计算服务,函数的执行靠云上各类事件触发,比如API网关触发的http请求,从消息中间件接收到的消息,对对象存储上的文件做增删操作等。编排服务方面,华为云以CNCF Serverless Workflow 规范为标准,联合2012实验室华为元戎团队共同打造了华为云FunctionGraph Workflow,为用户提供函数流管理功能,并支持可视化拖拽式的函数编排。
根据实际的业务实践FunctionGraph的适用场景可以分成三类:
第一类是数据处理,在移动互联网的浪潮下,我们都会面对大量的文本、图片、视频等数据处理诉求,主要特点是当流量不可预知或处理诉求比较低频时,函数毫秒级别自动弹性的特性,可以很好的削峰填谷,节省资源和运维的成本;而当数据量比较大时,也可以并发加快处理速度。
第二类是Web应用及后端,使用API网关作为函数的触发器,接收请求,触发函数执行。前端开发者使用函数开发,可以方便地实现传统后端技术栈才能实现的业务,让前端开发者成为全栈工程师,更聚焦业务,提升开发效率。
第三类是云服务粘合、能力扩展,随着各行各业智能化的深入,带来了更多的应用开发场景,通常需要集成各类服务快速的上线,这些服务提供了API或者SDK,使用函数可以灵活的转换数据,串联服务。
华为视频作为FunctionGraph的种子用户,成功通过使用华为云FunctionGraph缩短版本上线周期。面对不同的终端,前端工程师在页面排版方面会有不同的定制化诉求,如果将数据请求的API全部交给后台来做,那么前端一旦发生变化后端的API都需要随之变化,这需要后端开发人员投入大量工作支持。使用FunctionGraph后,通过前端基于函数开发BFF层,实现前后端解耦,前端工程师有能力做全栈工作,大大提升工作效率。
作为典型的华为云Serverless解决方案,凭借持续的实践与积累,华为云FunctionGraph目前已经沉淀了多种应用模板。FunctionGraph可以帮助客户提升在开发、弹性、成本上能力提升,帮助各行各业的企业用户降本增效,满足了业务创新与发展的需求。
郑州迅课教育科技有限公司总经理张棪结合在线教育业务中的Serverless应用场景为大家带来案例讲解。
在在线教育业务中会面临不可预知的突发流量,如大规模直播活动、考前大规模练题等,需要不断向服务端提交请求,这类接口如果放在主服务中可能会对稳定性产生影响。将接口与主服务解耦用Serverless的方式来调用,并辅以消息队列来削峰填谷,可以大幅提升便利性和性能。
Serverless具有降本增效、低运维、高可用的优点。如实际业务中给对象存储增加离线下载场景,对于已有多个域名下的下载链接,需要下载后转存到对象存储,视频转码时将远程文件拉取到华为云处理。针对这类低频、异步并发的业务使用FunctionGraph可以很好的避免资源闲置,平稳度过流量高峰。
函数前100万次/月调用免费,点击试用→ https://www.huaweicloud.com/product/functiongraph.html
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,
它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput
我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?