【AICon】探索RAG 技术在实际应用中遇到的挑战及应对策略!AICon精华内容已上线73%>>> 了解详情
写点什么

支持多语言:Serverless 云函数如何解锁语言限制?

  • 2020-09-19
  • 本文字数:2977 字

    阅读完需:约 10 分钟

支持多语言:Serverless云函数如何解锁语言限制?

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

一、背景

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


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,并返回处理结果。具体的文档可以参考 :Custom Runtime 说明 [1] 。


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


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 此时可以下发到函数侧)。


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 刚刚上线, 已经得到了一些外网客户的关注。比如,有人用 Custom 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/


本文转载自公众号云加社区(ID:QcloudCommunity)。


原文链接


支持多语言:Serverless云函数如何解锁语言限制?


2020-09-19 14:002423

评论

发布
暂无评论
发现更多内容

前端经典面试题合集

loveX001

JavaScript

基于Ernie-3.0 CAIL2019法研杯要素识别多标签分类任务

汀丶人工智能

nlp

计算机网络 ,什么是Internet?什么是协议?TCP/UDP的区别以及优缺点 分组交换与电路交换的区别以及优缺点

Python-派大星

10月月更

Python列表和元组有什么区别

芥末拌个饭吧

后端 python 3.5+ 10月月更

软件测试 | 测试开发工程师必读经典好书清单

测试人

软件测试 测试开发 测试工程师 测试书籍

你真的了解v-model吗🔥

渔戈

前端 Vue3 10月月更

2022年第六届数据质量管理国际峰会重磅开启

数据质量管理智库

数据 数据隐私 数据安全 峰会 数据质量

复杂场景数据处理的 OLTP 与 OLAP 融合实践

NebulaGraph

数据库 知识图谱

牛客刷题系列之进阶版(搜索旋转排序数组,链表内指定区间反转)

雪芙花

c c++ 10月月更

你真的了解过Vue的组件化开发吗🔥

渔戈

前端 Vue3 10月月更

全彩LED显示屏近年来在中国的发展趋势

Dylan

LED显示屏 户外LED显示屏 led显示屏厂家

Go语言入门—06切片

良猿

Go golang 后端 10月月更

7 步保障 Kubernetes 集群安全

SEAL安全

Kubernetes 云原生 Kubernetes 集群 企业号十月 PK 榜 审计日志

升级全新网络方案,给你低成本、高性能的裸金属体验

华为云开发者联盟

云计算 后端 华为云 云服务器 企业号十月 PK 榜

【网络安全篇】--HTML基础(预计学习时间:30分钟)从此以后不迷糊~

贤鱼很忙

html 前端 10月月更

以指标驱动业务决策,Kyligence 亮相 Gartner IT Symposium/Xpo™ 峰会

Kyligence

数据分析 指标中台 OLAP技术

Java中的super和this关键字详解

共饮一杯无

Java 10月月更 super和this关键字

数通路由交换之网络基础(一)

Python-派大星

10月月更

输入到页面展现到底发生什么?

loveX001

JavaScript

技术分享 | 测试开发工程师必读经典好书清单,抽奖赠书送福利!

霍格沃兹测试开发学社

C++精通之路:红黑树

雪芙花

c c++ 10月月更

常见的网路设备和网络参考模型,以及常见的网络层协议及数据通信过程

Python-派大星

10月月更

校招面试真题 | 显式等待与隐式等待的区别?与强制等待的方式分别是什么,有什么区别?

霍格沃兹测试开发学社

Vue的开发模式与webpack🔥

渔戈

前端 Vue3 10月月更

面试官:数据库加了唯一索引,就不会有重复数据了吗???

小小怪下士

Java MySQL 程序员

【kafka运维】Topic的生产和消费运维脚本

石臻臻的杂货铺

kafka kafka运维 10月月更

牛客刷题系列之初阶版(自守数,返回小于 N 的质数个数,第一个只出现一次的字符)

雪芙花

c c++ 10月月更

openGemini内核源码正式对外开源

华为云开发者联盟

数据库 物联网 华为云 企业号十月 PK 榜

《Go语言学习路线图》让你少踩坑,高效学,Let’s Go!

王中阳Go

golang 学习方法 技术专题合集 10月月更 “程”风破浪的开发者

热门探讨:为何数字化转型的企业,大都“死”在了黎明前夕?

优秀

数字化转型

【网络安全篇】JavaSript基础内容大全

贤鱼很忙

10月月更

支持多语言:Serverless云函数如何解锁语言限制?_编程语言_云加社区_InfoQ精选文章