0%

ServerLess 实践日志5:并发

今天记录一个使用 ServerLess 遇到的坑 : 并发

并发运行原理
在调用函数时,云函数会分配一个并发实例处理请求或事件。函数代码运行完毕返回后,该实例会处理其他请求。如果在请求到来时,所有实例都在运行中,云函数则会分配一个新的并发实例。
云函数遵循一个并发实例同一时刻仅处理一个事件的运行逻辑,保障每个事件的处理效率和稳定性。
–来源 https://cloud.tencent.com/document/product/583/45757

可能对正常点的 Serverless 来说,是个特性,但对于 Web 函数来说,这是个 Bug!

事发

今天看日志,发现一断时间大量500,猛报错 Too many connections ,就是说,数据库的连接被占完了,对于一个小网站来说,基本上是不可能的!

于是登上服务器上看,确实连接都已经被用光了,直觉就是一种可能:

很多Web应用启动程序时就会创建一些数据库连接,然后用的时候,直接从创建的连接里面取,并将取到的连接标注为“使用中”,用完了也不关掉,只是将这个连接标准为“可以使用”的状态,这个就是“连接池”,在Web应用中,非常常见。

一般放在服务器上时,只有一个Web应用主进程,并没有什么问题,一般的Web框架能很好的处理各种请求,会自动放到队列什么的。

但云函数遵循一个并发实例同一时刻仅处理一个事件的运行逻辑,也就是说,当并发量是2的情况下,云函数就自动扩容了!至于Web框架的优化,那就基本失效。

解决

而且,请求一多,并发达到10,假设这个Web程序设置启动时初始化的连接数也是10,那就直接创建了100个链接了。

所以这问题看似要给数据服务器多配置点 max_connections ,实际上是要解决函数的并发问题。

发现 Serverless 的 并发请求多并发 是两个不同的概念。

Web函数应该配置一下 请求多并发 ,在 函数管理 - 函数配置 - 编辑 - 请求多并发 - 启用,再写个数字就可以了,比如30,建议比初始化的连接数高一点就行。