配置单实例多并发
该特性仅FunctionGraph v2版本支持。
概述
默认情况下,每个函数实例同一时刻只处理一个请求,多并发时,例如并发三个请求,FunctionGraph会启动三个函数实例处理请求。FunctionGraph推出的单实例多并发能力,可以让您在一个实例上并发处理多个请求。
应用场景
单实例多并发适合函数处理逻辑中有较长时间等待下游服务响应的场景,也适合函数逻辑中初始化时间较长的场景,具备以下优势:
- 降低冷启动概率,优化函数处理时延:例如并发三个请求,不配置单实例多并发,FunctionGraph默认启动三个实例处理请求,会有三次冷启动。若配置了单实例支持三并发,三个并发请求,FunctionGraph只启动一个实例处理请求,减少了两次冷启动。
- 减少总请求处理时长,节省费用:单实例单并发下,多个请求的总处理时长为每个请求的处理时长相加。单实例多并发下,同一个实例对并发的多个请求的计费时间为,从第一个请求开始处理计时,到最后一个并发的请求处理结束计一次时长费用。
单实例单并发与单实例多并发的对比
当一个函数执行需要花费5秒,若配置为单实例单并发,三次函数调用请求分别在三个函数实例执行,总执行时长为15秒。
若配置为单实例多并发,设置单实例并发数为5,即单个实例最多支持5个并发请求,如果有三次函数调用请求,将在一个实例内并发处理,总执行时间为5秒。
单实例并发数大于1,在您设置的“单函数最大实例数”范围内,超过单实例并发处理能力时会自动扩容新实例。
对比项 |
单实例单并发 |
单实例多并发 |
---|---|---|
日志打印 |
- |
Node.js Runtime使用console.info()函数,Python Runtime使用print()函数,Java Runtime使用System.out.println()函数打印日志,该方式会把当前请求的Request ID包含在日志内容中。当多请求在同一个实例并发处理时,当前请求可能有很多个,继续使用这些函数打印日志会导致Request ID错乱。此时应该使用context.getLogger(),获取一个日志输出对象,通过这个日志输出对象打印日志,例如Python Runtime: log = context.getLogger() log.info("test") |
共享变量 |
不涉及 |
单实例多并发处理时,修改共享变量会导致错误。这要求您在编写函数时,对于非线程安全的变量修改要进行互斥保护。 |
监控指标 |
按实际情况进行监控。 |
相同负载下,函数的实例数明显减少。 |
流控错误 |
不涉及 |
太多请求时,body中的errorcode为“FSS.0429” ,响应头中的status为429 ,错误信息提示:Your request has been controlled by overload sdk, please retry later。 |
配置单实例多并发
配置约束
- 对于Python函数,由于Python GIL锁导致实例上的线程被绑定到一个核上,造成多并发无法使用多核,即使配置更大资源规格也无法提升函数处理性能。
- 对于Node.js函数,由于V8引擎的单进程单线程,造成多并发无法使用多核,即使配置更大资源规格也无法提升函数处理性能。