支持多语言:腾讯云Serverless云函数如何解锁语言

时间:2021-07-15 | 标签: | 作者:Q8 | 来源:臧琳网络

小提示:您能找到这篇{支持多语言:腾讯云Serverless云函数如何解锁语言}绝对不是偶然,我们能帮您找到潜在客户,解决您的困扰。如果您对本页介绍的支持多语言:腾讯云Serverless云函数如何解锁语言内容感兴趣,有相关需求意向欢迎拨打我们的服务热线,或留言咨询,我们将第一时间联系您!

< ">< color: rgb(79, 129, 189);">导语 | < color: rgb(127, 127, 127);">云函数SCF是腾讯云为企业和开发者们提供的无服务器执行环境,帮助大家在无需购买和管理服务器的情况下运行代码。但是SCF在使用过程中经常会受到开发语言方面的限制,造成拓展性和成本上的问题。本文就将为大家介绍使用Custom Runtime来解锁SCF语言限制,希望与大家一同交流。文章作者:臧琳,腾讯云Serverless 研发工程师。

一、背景

< ">SCF作为腾讯云FaaS核心产品,支持javascript、python、php、java、go等多语言函数。但是,在用户实际使用过程中,我们发现了一些问题:

< ">< color: rgb(79, 129, 189);">1.寻求更多语言支持

< ">我们时常会收到来自内外的各种关于编程语言的咨询,比如SCF是否支持dotnet、rust、deno甚至C等多种语言环境。

2.关于现有语言的功能拓展

< ">比如php想要安装更多的插件,就需要在执行环境中使用phpize来安装(因为部分插件可能和os library等底层库相关),但是云函数因为安全等原因,限制了相关权限。

3.关于Runtime的拓展性

< ">举个例子,现有SCF java的语言环境是java8,如果用户想要在SCF中使用JDK11或者更新的JDK15,有没有办法解决呢?

4.使用成本

< ">目前,用户如果想要在自己的业务代码中嵌入SCF,需要了解SCF各个语言提供公共关系团队的入口函数及编程方法。虽然我们已经尽量将使用方法和接口设计得简单,但对于一些用户来说,仍然要处理编程语言上的接口依赖,以及学习如何正确使用这些接口API。

5.维护成本

< ">简单来说,如果复用现有方案,给SCF提供多语言支持其实是可行的,但是需要给每一种语言编写一套使用SCF的API。这不仅仅需要SCF研发同学懂得各种语言,还需要他们了解各个语言的安全特性,使用特性等,维护成本很高。

< ">那么,有没有一种方法能够让我们只需要维护一套统一的API,就能让用户从各种编程语言中解耦,还能解决上述列举的各项问题呢?答案就在于使用——Custom Runtime。



二、Custom Runtime简介

< ">Custom Runtime(以下简称CR)使用方法较为简单:CR会暴露一套HTTP API提供给用户环境,而用户只需要到特定端口上发送/接收HTTP请求,即可以获得SCF下发的各种event,并返回处理结果。< color: rgb(127, 127, 127);">具体的文档可以参考:Custom Runtime说明[1]。

< ">总体来说,要使用Custom Runtime,用户需要做好以下准备:

< ">< color: rgb(79, 129, 189);">1.bootstrap可执行程序

< ">此执行程序可以是任何形式的Linux可执行文件,比如C语言编译出的二进制文件,或者是一个简单的shell脚本。

2.用户的事件处理函数

< ">也就是通过CR约定的HTTP API实现event的获得和处理,以及结果返回。

3.用户语言Runtime(可选)

< ">针对解释型语言,或者是需要Runtime来运行的语言,比如js、python、dotnet等,需要用户提供自己的Runtime,并在bootstrap中提供相应的启动Runtime的命令。

< ">腾讯云官网上也提供了利用CR实现shell云函数的示例[2],有兴趣的小伙伴可以看看。

三、Custom Runtime具体模型及用法示例

< ">Custom Runtime函数的内部处理流程如下所示:

< ">目前Custom Runtime的实现在SCF侧是一个HTTP Server。用户侧代码作为HTTP Client通过约定的API给SCF发请求来获得事件及相关信息,并发送HTTP请求返回处理结果给SCF服务。

< ">HTTP Server端口号和URL,通过两个环境变量传递到云函数环境中:

< ">SCF_RUNTIME_API:SCF_RUNTIME_API_PORT

< ">HTTP API定义如下图所示:

1.冷启动阶段(函数部署阶段)

< ">冷启动阶段主要是部署用户代码,完成用户初始化,这个阶段SCF会在用户提供的程序包(zip包)中寻找bootstrap可执行程序,然后拉起该程序。bootstrap由用户实现,内部启动用户代码等工作。

< ">用户函数在冷启动阶段需要完成代码初始化工作,并通知SCF,初始化工作完成。即发POST到SCF_RUNTIME_API:SCF_RUNTIME_API_PORT/runtime/init/ready.

< ">SCF服务侧接收用户ready的请求,初始化工作结束,通知上层服务。函数进入调用流程(即event此时可以下发到函数侧)。

< ">< color: rgb(79, 129, 189);">2.热启动阶段(调用阶段)

< ">函数通过GET SCF_RUNTIME_API:SCF_RUNTIME_API_PORT/runtime/invocation/next获得event及相关ctx信息。

< ">SCF在函数拉取event之后,等待用户函数返回。

< ">函数处理event之后,如正常返回,通过POST SCF_RUNTIME_API:SCF_RUNTIME_API_PORT/runtime/invocation/response传递返回信息给SCF服务。

< ">如函数调用出现异常(此处指业务代码需要返回错误信息),则通过POST SCF_RUNTIME_API:SCF_RUNTIME_API_PORT/runtime/invocation/error返回错误信息。

< ">SCF服务传递返回给上层服务,函数一次调用结束,进入下一次event调用周期。

< ">这里我们用SCF中CustomRuntime的Deno模板示例做说明,如下图所示,程序包里有:

< ">bootstrap:入口文件,这里是shell,可以看到红线标注这一行就是启动deno程序;

< ">deno二进制:Deno Runtime,启动deno程序必须的launcher;

< ">demo.ts:用户函数,里面就实现了上面提到的和SCF服务端交互的逻辑,也是用户业务逻辑的主要处理函数。

< ">bootstrap主要是启动demo.ts,下面我们看看demo.ts里的代码实现:

< ">可以看到,主要是完成初始化阶段。下面再来看看调用是怎么完成的:

< ">可以看到,是通过GET(fetch)循环拉取event,然后调用processEvent()来进行处理。processEvent()逻辑如下所示:

< ">分别处理正常返回和错误返回。最后再来看一下我们是怎么封装这里的postData()函数的:

< ">以上就是一个Deno函数使用SCF的Custom Runtime实现云函数的全过程。

四、结语



< ">从上文的论述我们不难看出:

1.SCF与语言无关

< ">因为CR的使用与语言无关,所以解锁了SCF的语言限制,也就是说只要可以实现一个HTTP Client,就可以通过HTTP API的调用和SCF进行交互,从而完成云函数的事件处理及调用。

2.bootstrap是入口

< ">举个例子,如果我用C语言实现一个HTTP Client,按照CR的约定完成与SCF的交互,那么完全可以编译成一个名字叫bootstrap的二进制文件,然后就可以跑C的FaaS函数了。

3.bootstrap可配置

< ">用户可以在bootstrap里面启动多个进程,可以解锁多种玩法,当然,要符合安全,毕竟用户函数运行环境有安全限制。但是,这已经可以解决一些“云函数+agent进程”的需求。

4.使用简单

< ">相对于学习各个语言的函数编写规范,了解云函数对各个语言的支持。使用CR只需要学习HTTP API的使用即可。更多的语言,环境相关的问题都是用户在业务开发中使用到的,不需要额外学习。

< ">Custom Runtime刚刚上线,已经得到了一些外网客户的关注。比如,有人用Cust王石的危机公关om Runtime把Swift放到了SCF里面,并做了相应的支持[3];有人用Custom Runtime在SCF中跑了WASM,并在上面做了Rust语言的支持[4]。

< ">还有很多类似场景,我们也在不断的努力,引入更多的语言,借助语言的生态,带动Serverless的生态发展。最后,欢迎大家体验SCF Custom Runtime,留下宝贵的意见!

参考资料:

[1]Custom Runtime说明:



https://cloud.tencent.com/document/product/583/47274

[2]官网示例:

https://cloud.tencent.com/document/product/583/47610

[3]场景拓展1:

https://github.com/stevapple/swift-tencent-scf-runtime

[4]场景拓展2:

https://www.freecodecamp.org/news/rust-webassembly-serverless-tencent-cloud/

One More Thing

支持多语言:腾讯云Serverless云函数如何解锁语言

上一篇:Facebook Audience Network:原生广告使用指南
下一篇:TikTok Ads广告兴趣标签简介


版权声明:以上主题为“支持多语言:腾讯云Serverless云函数如何解锁语言"的内容可能是本站网友自行发布,或者来至于网络。如有侵权欢迎联系我们客服QQ处理,谢谢。
相关内容
推荐内容
扫码咨询
    支持多语言:腾讯云Serverless云函数如何解锁语言
    打开微信扫码或长按识别二维码

小提示:您应该对本页介绍的“支持多语言:腾讯云Serverless云函数如何解锁语言”相关内容感兴趣,若您有相关需求欢迎拨打我们的服务热线或留言咨询,我们尽快与您联系沟通支持多语言:腾讯云Serverless云函数如何解锁语言的相关事宜。

关键词:支持多语言:腾讯云Serv

关于 | 业务 | 案例 | 免责 | 隐私
客服邮箱:sales@1330.com.cn
电话:400-021-1330 | 客服QQ:865612759
沪ICP备12034177号 | 沪公网安备31010702002418号