前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >由浅入深说Serverless之云函数的生命周期

由浅入深说Serverless之云函数的生命周期

作者头像
腾讯云serverless团队
发布2019-10-15 10:23:35
9740
发布2019-10-15 10:23:35
举报

这是 Serverless 最佳实践系列文章的第一篇,希望通过这系列文章帮助大家更深入的了解 Serverless 背后的机制并掌握相关的最佳实践。

Serverless 架构是一个分布式、事件驱动型的架构,在这个架构中,核心节点为一个个函数,为了有别于通常的函数,我们称之为 云函数

云函数是按需运行的,所以在未被事件触发时处于关闭状态。

只有当事件触发时,云函数才会被启动和运行。

此外,由于频繁的启动不利于资源的有效利用,大部分云服务商会在云函数启动后,保留云函数的实例两分钟,以便当有同类事件触发时可以被快速处理而不必再次耗费时间和资源启动实例,若两分钟后依然没有同类型的事件触发,再关闭实例。

因此云函数被触发的完整过程是:

  1. 事件触发
  2. 创建和启动云函数实例
  3. 输入事件信息
  4. 执行云函数触发代码并返回结果
  5. 若有后续同类事件
    1. 输入下一个事件
    2. 执行云函数触发代码并返回结果
    3. 重复第5步
  6. 等待两分钟没有新事件,销毁云函数实例

转化为云函数的生命周期,则分为三步:

  • Mount 启动
  • Invoke 触发
  • Destroy 关闭

由于云函数的关闭是由服务商直接控制的,所以无法进行捕获和定制。

在 FaasJS 中,生命周期在云函数中的体现为:

// onMount 云函数实例启动
import { Func } from '@faasjs/func';
let count = 0;

export default new Func({
  handler() { // onInvoke 云函数的触发代码在 handler 中
    return count++;
  }
});

上面的云函数示例,触发时返回的是当前云函数实例启动后被触发的次数。

那么对于云函数的生命周期,有哪些最佳实践可供参考呢?目前的建议有以下两点:

  1. 将常量的定义和创建放在 Mount 阶段
  2. 将数据库连接放在 Mount 阶段
  3. 仅把与输入事件强相关的代码放在 Invoke 阶段

示例如下:

import { Func } from '@faasjs/func';
import { Sql } from '@faasjs/sql';

// 初始化数据库对象和连接
const sql = new Sql();

// 定义常量
const types = {
  user: 0,
  admin: 1
 };

export default new Func({
  plugins: [sql],
  async handler(){
    return await sql.query('SELECT count(*) FROM users WHERE type = ?', [types.user]);
  }
});

在示例代码中,数据库连接会在云函数实例启动时被创建,并随着实例的关闭而销毁。在云函数实例存在的情况下,每次事件触发都会使用同一个数据库连接,而不必每次等待额外的时间去连接数据库。此外这种方式也可以有效控制数据库的连接数量,不会因为云函数的触发次数过多而产生大量的数据库连接。

在启动阶段就声明好的常量,一方面有助于提升的代码可读性,另外一方面也可以避免在事件触发时重复创建常量的问题(虽然通常情况下这对性能影响很小)。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ServerlessCloudNative 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档