
FaaS(函数即服务)、Serverless、小程序和弹性云计算的诞生可以归因于云计算发展的趋势和应用架构的演变。
FaaS(Function as a Service)、Serverless、小程序和弹性计算之间的关联性可以简要概述如下:
FaaS、Serverless计算、小程序和弹性计算之间存在关联性,它们都利用云计算的优势为开发人员和用户提供可扩展、经济高效和灵活的解决方案。
尽管函数计算(FaaS)具有许多优点,但它也存在一些局限性。这些包括执行时间限制、冷启动延迟、资源限制、状态管理挑战、厂商锁定、调试复杂性和可伸缩性限制。
在决定是否在特定用例中使用函数计算时,需要考虑这些限制,并在这些限制可能带来挑战时探索替代解决方案。
服务/平台  | 支持的语言  | 不支持的语言  | 
|---|---|---|
FaaS(如AWS Lambda,Google Cloud Functions,Azure Functions等)  | Python, Node.js, Java, C#, Go, Ruby(具体支持的语言取决于具体的云服务提供商)  | 冷门或特定领域的语言,如Rust, Erlang, Haskell等  | 
Serverless  | Node.js, Python, Java, Go, C#, Swift, Kotlin等  | 可以通过插件扩展对其他语言的支持  | 
小程序(如微信小程序,阿里小程序,百度小程序等)  | JavaScript, TypeScript  | 不支持除JavaScript和TypeScript之外的其他编程语言  | 
OpenFaaS(Functions as a Service)是一个使用Docker和Kubernetes构建无服务器函数的开源框架。它允许您将函数打包为容器,并在任何Kubernetes集群上部署它们。它支持多种编程语言,包括Node.js、Python、Go和Java。
Kubeless是一个针对Kubernetes的开源无服务器框架。它允许您在Kubernetes集群上部署和运行函数,无需管理底层基础设施。它支持多种编程语言,包括Node.js、Python、Ruby和PHP。
OpenWhisk是一个开源的无服务器平台,支持多种编程语言,并可在各种云平台或本地部署。它为运行无服务器函数提供了灵活且可扩展的环境。
Knative是一个建立在Kubernetes之上的开源无服务器平台, 支持多种编程语言,并与流行的开发工具和框架集成。它提供了一组中间件组件,使开发人员能够在Kubernetes上部署、运行和管理无服务器工作负载。Knative旨在提供一个更高级的抽象,用于构建和部署无服务器应用程序,使开发人员更专注于编写代码而不是管理基础设施。Knative包括三个主要组件: Serving(服务)、Eventing(事件)和Build(构建)
云服务提供商  | 产品与服务  | 特性  | 典型应用场景  | 支持的语言  | 
|---|---|---|---|---|
AWS  | Lambda  | 自动扩展,无服务器,事件驱动计算  | 实时文件处理,数据转换,后端API  | Node.js, Java, C#, Go, PowerShell, Ruby, Python  | 
GCP  | Cloud Functions  | 事件驱动,自动扩展,无服务器  | 数据处理,实时分析,后端服务  | Node.js, Python, Go  | 
Microsoft Azure  | Azure Functions  | 事件驱动,无服务器,支持多种触发器  | 实时流分析,数据处理,IoT后端  | C#, JavaScript, F#, Java, PowerShell, Python, TypeScript  | 
Alibaba Cloud  | Function Compute  | 事件驱动,自动扩展,无服务器  | 日志处理,图片处理,大数据分析  | Python, Java, Node.js, PHP  | 
Tencent Cloud  | SCF (Serverless Cloud Function)  | 事件驱动,自动扩展,无服务器  | 实时文件处理,数据清洗,后端API  | Node.js, Python, PHP, Java, Go  | 
以下是一些函数计算和Serverless架构应用,可能的未来发展趋势:
假设我们有一个简单的Python函数,它接受一个字符串并返回反转后的字符串。在OpenFaaS中,我们可以创建一个名为handler.py的文件,并在其中定义这个函数:
def handle(req):
    """handle a request to the function
    Args:
        req (str): request body
    """
    return req[::-1]在Kubeless中,我们可以创建一个名为reverse.py的文件,并在其中定义一个类似的函数:
def reverse(event, context):
    return event['data'][::-1]然后,我们可以使用Kubeless CLI将这个函数部署到Kubernetes集群:
kubeless function deploy reverse --runtime python3.7 --from-file reverse.py --handler reverse.reverse在OpenWhisk中,我们可以创建一个名为reverse.js的文件,并在其中定义一个类似的函数:
function main(params) {
    return {payload: params.payload.split("").reverse().join("")};
}然后,我们可以使用OpenWhisk CLI将这个函数部署到OpenWhisk平台:
wsk action create reverse reverse.js在Knative中,我们可以创建一个名为reverse.go的文件,并在其中定义一个HTTP处理函数:
package main
import (
	"fmt"
	"net/http"
)
func reverseHandler(w http.ResponseWriter, r *http.Request) {
	msg := []rune(r.URL.Query().Get("msg"))
	for i, j := 0, len(msg)-1; i < j; i, j = i+1, j-1 {
		msg[i], msg[j] = msg[j], msg[i]
	}
	fmt.Fprint(w, string(msg))
}
func main() {
	http.HandleFunc("/", reverseHandler)
	http.ListenAndServe(":8080", nil)
}然后,我们可以创建一个Knative服务来部署这个应用:
apiVersion: serving.knative.dev/v1 # The version of the Knative API to use
kind: Service
metadata:
  name: reverse # The name of the app
  namespace: default # The namespace the app will use
spec:
  template:
    spec:
      containers:
        - image: gcr.io/my-project/reverse # The URL to the image of the app
          ports:
            - containerPort: 8080以下是各大云服务提供商的函数计算、Serverless和小程序的示例代码:
def lambda_handler(event, context):
    message = event['message'][::-1]
    return {
        'message' : message
    }module.exports.hello = async event => {
  return {
    statusCode: 200,
    body: JSON.stringify(
      {
        message: 'Go Serverless v1.0! Your function executed successfully!',
        input: event,
      },
      null,
      2
    ),
  };
};import Amplify from 'aws-amplify';
import awsconfig from './aws-exports';
Amplify.configure(awsconfig);
// 在应用中使用 AWS 服务exports.helloWorld = (req, res) => {
  res.send('Hello, World');
};def hello_http(request):
    return 'Hello World!'var firebaseConfig = {
  // ...
};
firebase.initializeApp(firebaseConfig);module.exports = async function (context, req) {
    context.res = {
        body: "Hello, World"
    };
}public static class Function1
{
    [FunctionName("Function1")]
    public static async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req)
    {
        return new OkObjectResult("Hello, World");
    }
}var client = new WindowsAzure.MobileServiceClient('https://your-service.azurewebsites.net');def handler(event, context):
  print("hello world")
  return 'hello world'exports.handler = function(event, context, callback) {
  callback(null, 'hello world');
};var client = new OSS({
  region: '<Your region>',
  accessKeyId: '<Your AccessKeyId>',
  accessKeySecret: '<Your AccessKeySecret>',
});exports.main = async (event, context) => {
  return event
}module.exports.hello = async (event, context) => {
  return {
    message: 'Hello, Tencent Cloud!'
  }
}wx.cloud.init({
  env: 'my-env-id',
  traceUser: true,
})例如,用户在小程序中上传图片,可以通过函数计算进行实时的图片处理,如压缩、裁剪等,并将处理后的图片保存到云存储中。
import os
from PIL import Image
def handle(event, context):
  # 获取上传的文件信息
  bucket_name = event['oss']['bucket']['name']
  object_key = event['oss']['object']['key']
  
  # 打开图片并进行处理
  with Image.open('/tmp/' + object_key) as img:
    # 进行图片压缩、裁剪等操作
    img.thumbnail((800, 800))
    img.save('/tmp/' + object_key)
  # 将处理后的图片上传到云存储
  s3_client.upload_file('/tmp/' + object_key, bucket_name, object_key)例如,小程序产生的用户行为日志可以通过Serverless实时推送到日志服务,然后通过函数计算进行实时分析,生成用户行为报告。
import json
import boto3
def handle(event, context):
  # 获取日志事件
  log_events = event['awslogs']['data']
  # 对日志事件进行解析和处理
  for log_event in log_logs:
    # 进行实时分析,如用户行为统计等
    analysis_result = analyze(log_event)
  # 将分析结果保存到数据库或发送报告
  db_client.put_item(
    TableName='analysis_result',
    Item=analysis_result
  )import boto3
def handle(event, context):
  # 获取当前时间
  current_time = context['time']
  # 清理过期数据
  db_client.delete_items(
    TableName='user_data',
    KeyConditionExpression='expire_time < :current_time',
    ExpressionAttributeValues={':current_time': current_time}
  )
  # 或者定时发送用户活跃度报告
  report = generate_report()
  email_client.send_email(
    Subject='Daily Active User Report',
    Body=report,
    ToAddresses=['admin@example.com']
  )例如,设备发送的数据可以通过函数计算进行实时处理,比如温度传感器发送的数据可以用来实时监控和报警。
def handle(event, context):
  # 获取设备数据
  device_data = event['device_data']
  # 对设备数据进行处理,如温度监控和报警
  if device_data['temperature'] > THRESHOLD:
    send_alert(device_data['device_id'], 'Temperature is too high!')例如,用户上传的视频可以通过函数计算进行实时转码或者内容审核。
def handle(event, context):
  # 获取上传的视频信息
  bucket_name = event['oss']['bucket']['name']
  object_key = event['oss']['object']['key']
  # 对视频进行处理,如转码或内容审核
  transcode_video(bucket_name, object_key)例如,用户在小程序中上传图片,可以通过函数计算调用 AI 模型进行预测,如图像分类或人脸识别。
import boto3
def handle(event, context):
  # 获取上传的图片信息
  bucket_name = event['s3']['bucket']['name']
  object_key = event['s3']['object']['key']
  # 调用 AI 模型进行预测
  prediction = predict_image(bucket_name, object_key)
  # 返回预测结果
  return {
    'statusCode': 200,
    'body': json.dumps(prediction)
  }例如,用户下单后,订单信息会被放入消息队列,然后通过函数计算进行处理,如库存检查和订单确认。
import boto3
def handle(event, context):
  # 获取订单信息
  order_info = event['Records'][0]['body']
  # 对订单进行处理,如库存检查和订单确认
  check_stock(order_info)
  confirm_order(order_info)这些示例代码主要是伪代码,并没有具体的实现细节。在实际使用时,你需要根据具体的云服务提供商的 SDK 和 API 进行具体的实现。
1. OpenFaaS
2. Kubeless
3. OpenWhisk
4. Knative
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。