Serverless 是一种极具性价比的云计算模式,让开发者可以便捷地创建、运行和维护应用程序,节省了运维成本和时间。然而,有时候 Serverless 函数可能会未执行,导致应用程序出现问题,给开发者带来很大的困扰。本文将介绍 Serverless 函数未执行原因和解决方案,让你更好地掌握 Serverless 技术的应用。
Serverless 函数未执行原因
Serverless 函数未执行可能有多种原因,针对不同的原因,需要采用不同的解决方案。下面介绍几个比较常见的原因:
1. 内存不足
当一个函数超出了内存限制的时候,触发器会发送失败信息,函数无法执行。因此,需要检查函数内存限制是否足够。
const handler = async (event) => {
console.log(`Free memory: ${Math.round(os.freemem() / 1024 / 1024)} MB`);
return true;
};
exports.handler = handler;这段代码可以获取当前函数的可用内存。如果可用内存小于函数内存限制,就需要考虑增加内存或者优化代码。
2. 超时
Serverless 函数默认有执行时间限制,超出时间限制后,触发器会发送超时信息,函数无法执行。如果我们需要执行一些耗时较长的操作,可以修改函数执行时间限制或者将操作封装为一个异步任务,再返回执行结果。
-- -------------------- ---- -------
-
------------ -
------------- -
------- -------------------------------------
------------- -
---------- ----------------
---------- -----------
------------- ----
---------- ---
---------- -
---------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-
-
-
-在函数模板中,我们可以通过“Timeout”属性设置函数执行时间限制。例如,上面的代码设置函数执行时间限制为 60 秒。
3. 环境变量错误
有时候,Serverless 函数需要使用到一些环境变量,如果配置错误,将导致函数未执行。必须检查环境变量是否设置正确,是否在代码中正确读取了环境变量。
console.log(`DATABASE_URL: ${process.env.DATABASE_URL}`);这段代码可以输出环境变量 DATABASE_URL 的值,可以帮助我们快速检测环境变量是否设置正确。
解决方案
基于 Serverless 函数未执行的原因,我们可以采取不同的解决方案:
1. 增加内存
如果函数内存不足,我们需要增加内存,以支持函数正常执行。
-- -------------------- ---- -------
-
------------ -
------------- -
------- -------------------------------------
------------- -
---------- ----------------
---------- -----------
------------- ----
---------- ---
---------- -
---------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-
-
-
-
-在函数模板中,我们可以通过“MemorySize”属性设置函数内存大小。例如,上面的代码设置函数内存大小为 256MB。
2. 异步任务处理
如果函数执行时间过长,我们需要将操作封装为一个异步任务,再返回执行结果,以支持函数正常执行。
-- -------------------- ---- -------
----- ------- - ----- ------- -- -
----- ---------
------ -----
--
----- ------ - ----- -- -- -
------ --- ----------------- ------- -- -
------------- -- -
----------
-- -------
---
--
--------------- - --------在这个例子中,doTask 函数模拟了一个 60 秒的异步任务。我们可以将需要执行的操作放在 doTask 函数里面,并通过 Promise 对象返回执行结果。
3. 检查环境变量
如果环境变量配置错误,我们需要检查环境变量是否设置正确,是否在代码中正确读取了环境变量。
-- -------------------- ---- -------
-
------------- -
--------------- -
------- --------
-
--
------------ -
------------- -
------- -------------------------------------
------------- -
---------- ----------------
---------- -----------
------------- ----
---------- ---
---------- -
---------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--
----------------------- -
--------------- -
--------------- -
---------------
-------------
-
-
-
-
-
-
-在使用函数模板时,我们可以通过“EnvironmentVariables”属性来设置环境变量。例如,上面的代码设置函数使用名称为“DATABASE_URL”的环境变量。
Source: FunTeaLearn,Please indicate the source for reprints https://funteas.com/post/67ce5156e46428fe9e8698c3