Web函数(Web Function)是云函数的一种函数类型,区别于事件函数(Event Function),Web函数通过支持原生的HTTP/WebSocket协议,兼容任意一种原生Web框架编写的Web服务,无需改造即可将传统项目部署到函数,保证和本地开发服务体验一致。
自21年6月推出以来,广受欢迎,数万传统Web项目轻松迁移到函数上,让老代码也能在Serverless基础设施上继续发光。然而,随着Web函数在更多场景得到应用,一些问题也逐渐暴露出来。
一、Web函数请求单并发
默认情况下,在调用函数时,云函数会分配一个并发实例处理请求或事件。函数代码运行完毕返回后,该实例会处理其他请求。如果在请求到来时,所有实例都在运行中,云函数则会分配一个新的并发实例。一个并发实例同一时刻仅处理一个事件的运行逻辑,保障每个事件的处理效率和稳定性。
在大多数情况下,请求单并发都是值得推荐使用的模式,无需在写代码时考虑多个请求同时处理带来的典型并发难题,例如线程安全、阻塞调用、异常处理等。
而在Web应用中,典型的业务场景是IO密集型——函数内访问数据库或其他系统的接口等下游服务,会有较多时间在等待这些下游服务响应。这种等待一般都是在做iowait,不怎么消耗CPU,此时,单实例单并发模式则会产生两个问题:
计算资源浪费,在websocket长连接中尤为突出;
计费略高,每一个同时进来的请求因为分配在不同的实例中进行处理,单独计费,整体费用较传统容器或主机方案没有优势。
二、Web函数请求多并发
Web函数目前已经支持请求多并发模式,您可以根据业务需要进行启用和配置。请求多并发支持自定义静态并发、智能动态并发两种模式。
(一)自定义静态并发
启用后,当同时有多个请求,将不超过指定并发值的请求调度到同一函数实例内执行。并发增多,将增加函数实例的CPU、内存等消耗,建议配合压力测试进行合理设置,避免函数执行异常。目前支持的并发范围为2~100并发。
(二)智能动态并发
启用后,在函数实例负载允许的情况下,智能动态调度更多请求到同一函数实例内运行。将于后续推出,敬请期待。
三、压测
多并发vs单并发压测结果:最大请求延迟降低82.7%,成本节约98.8%
测试说明:
在北京地域准备一个Web函数,模拟请求响应时间500ms,函数配置为512MB。
在北京市准备公网压测环境,分别压测未开启多并发和开启100多并发时的表现,压测条件为:100并发,持续请求50000次。
未开启请求多并发:需要60个实例,最大响应时间4177ms,计费内存时间12500GBs
客户端压测结果:最大响应时间4177ms,平均响应时间为569ms。压测开始时,函数接收到100并发请求,立即开始冷启动拉起函数实例,在冷启动过程中,头几批请求开始等待,最长响应时间为4177ms,而随着实例拉起来正常处理请求,则新的并发请求会被立即均匀分配到多个实例中进行处理,因此后续的大多数请求等待时间小,整体平均响应时间被拉平,回归到正常水平。
函数监控截图:一开始冷启动瞬间拉起了100个实例,后续实例轮转复用,平稳在60实例。计费时间为0.5GB0.5s50000=12500GBs。
开启请求多并发:仅需1个实例,最大响应时间723ms,计费时长150GBs
客户端压测结果:最大响应时间723ms,平均响应时间为565ms。压测开始时,函数接收到100并发请求,立即开始冷启动拉起函数实例,在冷启动过程中,头一批请求开始等待,最长响应时间为723ms,而随着第一个实例被拉起来,新的并发请求会被立即分配到该实例中进行处理。处于等待冷启动中的请求数要显著少于未开启多并发时。
函数监控截图:并发请求进入,所有请求被分配到一个函数实例进行立即处理。
函数计费时间内存截图:只需一个实例,多并发模式下,分配到同一实例处理的请求,只会计算一次,计费时间为0.5GB*282.728s=141GBs。节省98.8%费用。
四、请求多并发的优势
(一)成本更低
未开启请求多并发时,单个函数实例一次只会处理一个请求,第一个请求处理完成才会开始处理下一个请求,内存时间的计费时长是每个请求的执行时长的加和,如下图所示:
开启请求多并发之后,单个函数实例一次会处理多个并发请求,第一个请求未结束时,如果第二个请求进来,则会有一段时间两个请求同时在处理,此时,交叠的这段时间只会计算一次。如下图所示:
可以看到,在IO密集型场景中,如Websocket长连接业务,可减少计费执行时长,节省费用。
(二)性能提升
多个请求并发在同一个实例中可复用数据库连接池,减缓下游服务压力。
请求并发密集时,多个请求只需要一个实例进行处理,无需拉起多个实例,从而降低实例冷启动几率,降低响应延迟。
云函数产品介绍:
https://cloud.tencent.com/pro...
Web函数请求多并发产品文档:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。