From 331fcc5fced7d3800cf7c4e918436eb04a40673f Mon Sep 17 00:00:00 2001 From: wangyaqi Date: Thu, 25 Aug 2022 13:30:44 +0800 Subject: [PATCH] docs: update concurrency --- docs/uniCloud/cf-functions.md | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/docs/uniCloud/cf-functions.md b/docs/uniCloud/cf-functions.md index 2a224d6cd..20dc39c9f 100644 --- a/docs/uniCloud/cf-functions.md +++ b/docs/uniCloud/cf-functions.md @@ -993,9 +993,11 @@ uniCloud.httpProxyForEip.post( > 仅阿里云支持 -默认情况下云函数仅支持单实例单并发,即同一时间一个实例仅可为一个用户服务(不同用户同一时间访问会被分派到不同实例进行处理)。通过修改云函数单实例并发度,可以修改云函数同一时间最多能处理多少请求。 +所谓实例是指云函数的一个执行环境,可以简单的理解为一个node进程。默认情况下云函数仅支持单实例单并发,即同一时间一个实例仅可为一个请求服务(不同请求同一时间访问会被分派到不同实例进行处理)。通过修改云函数单实例并发度,可以修改云函数同一时间最多能处理多少请求。 -假设同时有3个请求需要处理,当实例并发度设置为1时,需要创建3个实例来处理这3个请求,每个实例分别处理1个请求。而每开启一个实例都会引发云函数冷启动;当云函数的实例并发度设置为10时(即1个实例可以同时处理10个请求),只需要创建1个实例就能处理这3个请求。这样后面2个并发请求不会造成云函数的冷启动。 +假设同时有3个请求需要处理,当实例并发度设置为1时,需要创建3个实例来处理这3个请求,每个实例分别处理1个请求。而每开启一个实例都会引发云函数冷启动;当云函数的实例并发度设置为10时(即1个实例可以同时处理10个请求),只需要创建1个实例就能处理这3个请求。这样后面2个并发请求不会有因云函数实例创建带来的冷启动问题。 + +仍以并发度配置为3为例,如果客户端同时发起了四个请求,前三个请求会被分配给实例1处理,第4个请求会创建一个新的云函数实例来处理。 **开启方式** @@ -1010,7 +1012,7 @@ uniCloud.httpProxyForEip.post( - 适用于云函数连接三方服务器的场景,如果你的云函数只处理数据库请求,不要修改此配置,保持为1即可 - 云函数内存使用量会随着并发量增大而增加 - 如果并发的不同请求对全局变量同时进行读写会污染全局变量,可能会导致意想不到的后果,开启单实例多并发后请不要编写修改全局变量的代码,除非你熟悉这种技术带来的特殊应用,比如下文进阶部分提到的ip过滤。 -- 设置过大的单实例多并发可能会导致实例底层网络请求排队从而导致请求超时,**再次强调此项,一般情况下不要设置过大的并发度,具体数值可以自己针对业务代码测试一下** +- 设置过大的单实例多并发可能会导致实例底层网络请求排队从而导致请求超时,**一般情况下不要设置过大的并发度,具体数值可以自己针对业务代码测试一下** **适用场景** @@ -1020,7 +1022,7 @@ uniCloud.httpProxyForEip.post( |函数中有共享状态且不能并发访问 |不适用 |例如全局变量,多请求并发执行修改共享状态可能会导致错误。 | |单个请求的执行要消耗大量CPU及内存资源 |不适用 |多请求并发执行会造成资源争抢,可能会导致内存不足(OOM)或者延时增加。 | -**关于uni-id的特殊说明** +**关于旧版本uni-id公共模块的特殊说明** ```js // 开启单实例多并发前的uni-id用法 @@ -1036,8 +1038,8 @@ exports.main = async function(event, context) { let uniID = require('uni-id') exports.main = async function(event, context) { let uniIDIns = uniID.createInstance({ // 创建uni-id实例,其上方法同uniID - context: context, // 传入context防止不同请求互相影响 - config: {} // 完整uni-id配置信息,使用config.json进行配置时无需传此参数 + context: context // 传入context防止不同请求互相影响 + // config: {} // 完整uni-id配置信息,使用config.json进行配置时无需传此参数 }) const res = uniIDIns.login({ // ...一些参数 @@ -1046,12 +1048,21 @@ exports.main = async function(event, context) { } ``` +不同于旧版uni-id公共模块uni-id-common不可直接require后使用,必须使用createInstance方法 + **进阶** 开启单实例多并发后的全局变量复用并非一定是坏的结果,如果你很了解此行为,也可以对此进行有效的利用 例:[ip-filter](https://ext.dcloud.net.cn/plugin?id=4619)中就利用云函数全局缓存一些ip访问信息来限制单ip访问频率,可以下载示例项目体验一下 +受单实例多并发的影响,云函数全局存放与本次请求有关的信息会造成混乱。因此uniCloud提供了根据当前requestId获取客户端信息和云端信息。参考以下文档 + +- [云函数获取当前requestId](cf-callfunction.md#context) +- [云对象获取当前requestId](cloud-obj.md#get-request-id) +- [获取当前云函数实例正在处理的请求对应的requestId列表](#get-request-list) +- [获取当前云函数实例正在处理的请求对应的客户端信息列表](#get-client-infos) +- [获取当前云函数实例正在处理的请求对应的云端信息列表](#get-cloud-infos) ## 云函数package.json@packagejson -- GitLab