V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zxCoder
V2EX  ›  问与答

问下关于 serveless 的一个问题

  •  
  •   zxCoder · 2021-08-13 17:48:22 +08:00 · 1542 次点击
    这是一个创建于 1227 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这几天在看这个,vercel 可以免费部署 serveless function,想着拿来放自己的小项目很方便,虽然访问速度慢了点

    然后有个问题,serveless 一定是指无状态的吗,我现在有个需求需要存在一个全局对象,比如

    let games={};
    app.post("/api/new",async(req,res)=>{
    //...
    });
    

    这个全局对象我希望能够在一次部署的周期能各个接口 /serveless function 可以共享和修改

    想问下这种做法合法吗,因为我试了一下 vercel 似乎是支持这种写法的,想确定一下这是标准还是只是一个凑巧。

    第 1 条附言  ·  2021-08-13 19:03:57 +08:00

    再次测试了一下,大约保留了20分钟,20分钟后这个对象就没了

    看来得想想看其他的解决方案了,但是放数据库这代价也太昂贵了吧

    第 2 条附言  ·  2021-08-13 20:22:11 +08:00

    所以我理解serverless本质其实就是一些独立的请求处理函数,对于每个请求,从数据库读取数据,更新写入数据,然后返回结果

    所以要对数据库读取速度的要求很高

    12 条回复    2021-08-15 20:45:20 +08:00
    Dillion
        1
    Dillion  
       2021-08-13 17:54:29 +08:00
    serverless 的 server 是服务器的意思,不是 stateless
    hronro
        2
    hronro  
       2021-08-13 18:02:37 +08:00 via iPhone
    没用过 vercel,不过有没有可能只是你试的那次碰巧能支持这种写法呢?同一个 IP 的访问或许能转到同一个 vercel 的实例上,这样写或许就没问题,但如果访问 IP 不同或者其他什么原因导致你的请求没有被分配到同一个实例上,那你的状态就清零了
    xiaopc
        3
    xiaopc  
       2021-08-13 18:49:06 +08:00
    1. Serve r less
    2. Serverless 没有「标准」,只是一类服务的统称
    3. 目前 Function 的实现一般是根据并发需求拉起若干容器运行函数,容器在返回后如果没有被销毁,就留下了上次的「全局变量」
    4. 考虑配合对象存储服务来存
    AoEiuV020
        4
    AoEiuV020  
       2021-08-13 19:09:18 +08:00
    我只知道 cloudflare 的 serverless 可以永久保存键值对,数据量不大也不频繁修改的话还是可以的,
    randomboi
        5
    randomboi  
       2021-08-13 19:11:39 +08:00
    可以试试 Cloudflare Workers 也是免费的,然后存储数据到 Workers KV 里
    SorcererXW
        6
    SorcererXW  
       2021-08-13 19:33:43 +08:00
    Vercel 的云函数是基于 AWS Lambda 的,单台容器上所有请求都是串行化的,如果有并发请求,则同时启动多个容器来处理请求。这样每个节点上本地数据是不一致的。
    zxCoder
        7
    zxCoder  
    OP
       2021-08-13 19:39:26 +08:00
    @SorcererXW 原来如此,那只能想想其他的解决方案了
    riordanw
        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 (关系型)。
    zxCoder
        9
    zxCoder  
    OP
       2021-08-14 10:04:39 +08:00
    @riordanw 数据库读写还是开销大,而且 serverless 对 websocket 支持比较麻烦,还是用回传统的模式比较方便
    riordanw
        10
    riordanw  
       2021-08-14 10:30:47 +08:00
    @zxCoder 对,函数有运行时长限制,不太适合 websocket 场景。
    zxCoder
        11
    zxCoder  
    OP
       2021-08-14 17:28:29 +08:00
    @riordanw 话说那像 serverless 的数据库服务,会针对 serverless 做什么优化吗?难道不是每执行一个 serverless function 也要建立一个数据库连接吗?
    riordanw
        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
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2826 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 00:06 · PVG 08:06 · LAX 16:06 · JFK 19:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.