这几天在看这个,vercel 可以免费部署 serveless function,想着拿来放自己的小项目很方便,虽然访问速度慢了点
然后有个问题,serveless 一定是指无状态的吗,我现在有个需求需要存在一个全局对象,比如
let games={};
app.post("/api/new",async(req,res)=>{
//...
});
这个全局对象我希望能够在一次部署的周期能各个接口 /serveless function 可以共享和修改
想问下这种做法合法吗,因为我试了一下 vercel 似乎是支持这种写法的,想确定一下这是标准还是只是一个凑巧。
再次测试了一下,大约保留了20分钟,20分钟后这个对象就没了
看来得想想看其他的解决方案了,但是放数据库这代价也太昂贵了吧
所以我理解serverless本质其实就是一些独立的请求处理函数,对于每个请求,从数据库读取数据,更新写入数据,然后返回结果
所以要对数据库读取速度的要求很高
1
Dillion 2021-08-13 17:54:29 +08:00
serverless 的 server 是服务器的意思,不是 stateless
|
2
hronro 2021-08-13 18:02:37 +08:00 via iPhone
没用过 vercel,不过有没有可能只是你试的那次碰巧能支持这种写法呢?同一个 IP 的访问或许能转到同一个 vercel 的实例上,这样写或许就没问题,但如果访问 IP 不同或者其他什么原因导致你的请求没有被分配到同一个实例上,那你的状态就清零了
|
3
xiaopc 2021-08-13 18:49:06 +08:00
1. Serve r less
2. Serverless 没有「标准」,只是一类服务的统称 3. 目前 Function 的实现一般是根据并发需求拉起若干容器运行函数,容器在返回后如果没有被销毁,就留下了上次的「全局变量」 4. 考虑配合对象存储服务来存 |
4
AoEiuV020 2021-08-13 19:09:18 +08:00
我只知道 cloudflare 的 serverless 可以永久保存键值对,数据量不大也不频繁修改的话还是可以的,
|
5
randomboi 2021-08-13 19:11:39 +08:00
可以试试 Cloudflare Workers 也是免费的,然后存储数据到 Workers KV 里
|
6
SorcererXW 2021-08-13 19:33:43 +08:00
Vercel 的云函数是基于 AWS Lambda 的,单台容器上所有请求都是串行化的,如果有并发请求,则同时启动多个容器来处理请求。这样每个节点上本地数据是不一致的。
|
7
zxCoder OP @SorcererXW 原来如此,那只能想想其他的解决方案了
|
8
riordanw 2021-08-14 10:00:44 +08:00
既然已经使用 Serverless 函数了,那么数据库也用 Serverless 的就好,按使用量计费,对于小项目是 0 成本。
LS 提到,Cloudflare 的 Worker 可以使用 KV ( Key-Value )。 我补充一下,AWS 的 Lambda 可以用 DynamoDB ( Key-Value ),腾讯云的 TCF 可以用 PostgreSQL for Serverless (关系型)。 |
9
zxCoder OP @riordanw 数据库读写还是开销大,而且 serverless 对 websocket 支持比较麻烦,还是用回传统的模式比较方便
|
11
zxCoder OP @riordanw 话说那像 serverless 的数据库服务,会针对 serverless 做什么优化吗?难道不是每执行一个 serverless function 也要建立一个数据库连接吗?
|
12
riordanw 2021-08-15 20:45:20 +08:00
@zxCoder 我的业务量非常小,还没有研究过 Serverless 数据库建立连接的机制。可以看下腾讯云的文档: https://cloud.tencent.com/document/product/1003/50853,https://cloud.tencent.com/document/product/1154/43004
|