V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yinmin
V2EX  ›  程序员

有熟悉 Cloudflare workers 的大佬能指点一下吗?

  •  
  •   yinmin · 2023-04-13 17:18:40 +08:00 · 3052 次点击
    这是一个创建于 571 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我用 Cloudflare workers 实现 api 服务的反向代理,需求是:统计 api 的访问次数,如果在某个时间段内访问量超过上限就限制。

    需要在 workers 里存储 api 的访问次数,原先是考虑使用 KV ,但是我看了 KV 文档,有这么一段:

    Note that get may return stale values – if a given key has recently been read in a given location, changes to the key made in other locations may take up to 60 seconds to be visible. Refer to How KV works for more information on this topic.

    来源: https://developers.cloudflare.com/workers/runtime-apis/kv/#reading-key-value-pairs

    我理解大概意思是多个边缘节点读 /写 KV ,可能在某些边缘节点存在 60 秒的脏数据。

    想问大佬:(1) 关于脏数据的理解是否正确 (2)workers 里做访问计数器,最佳操作是用什么存储方式?

    第 1 条附言  ·  2023-04-14 01:32:27 +08:00
    确实 KV 不适合做计数器,Durable Objects 和 Upstash Redis 比较合适。目前已用了 Upstash Redis ,看看效果如何。
    9 条回复    2023-04-13 19:58:23 +08:00
    bianzhifu
        1
    bianzhifu  
       2023-04-13 18:26:29 +08:00
    1 的理解是正确的
    2worker 本身就不适合做计数器,free 用户只有 1000 次 /日的写入次数,如果只限制,可以参看一下 cloudflare 的 waf 文档 https://developers.cloudflare.com/waf/rate-limiting-rules/
    lopssh
        2
    lopssh  
       2023-04-13 18:30:30 +08:00
    1 的理解基本正确。
    lopssh
        3
    lopssh  
       2023-04-13 18:43:56 +08:00
    想要使用 Workers KV 做计数器,你需要在每次数据变更之后,原地等待 60s (官方保证 60s 之内达成最终一致性、last-wins )。
    否则,请直接回源。。workers 访问源站没有什么限制。
    nbndco
        4
    nbndco  
       2023-04-13 18:49:36 +08:00 via iPhone
    kv 不能这么用,相同 key 的写入也有 rate limiting 。简单的需求不如直接用 cf 自己的 rate limiting ,免费的也有一条 rule
    swulling
        5
    swulling  
       2023-04-13 18:53:45 +08:00   ❤️ 1
    你的理解是正确的。

    1. 在 Edge 不适合做精细的访问控制,是因为 Edge 是全球部署,全球低时延强一致太难了。
    2. Cloudflare KV 适合写少读多,从免费额度就能看出来,写的额度很少。
    3. 这种 Edge 的访问控制,不适合做太精细,模糊一些就好做很多。比如限流一分钟 100 ,最终 120 限制住了,也能接受。这样的话就不需要依赖强一致的数据库。这样我推荐 Upstash redis
    airyland
        6
    airyland  
       2023-04-13 19:11:25 +08:00   ❤️ 1
    可以用 durable object(worker 付费才能使用,$5/月),保证原子性,我用来做单用户计数和单天总数计算。
    而 kv 用来做不保证精确度的 ratelimit 。
    gam2046
        7
    gam2046  
       2023-04-13 19:34:12 +08:00   ❤️ 1
    1 、统计请求次数的话,Workers 绑定自定义域名,在 Web Analysis 就有
    2 、频率限制如果是简单的依据来源 IP 、地区、ASN 等,建议使用 WAF ,如果是更复杂的限制条件,用 Workers 统计是较为困难,因此不同地区用户的请求在不同节点上,serverless 非要做这个,建议使用 durable object
    3 、如果不想为 Workers/DurableObject 付费,只能考虑自建外部计数器,提供 HTTP RPC 让 Workers 判断是否继续提供服务。但我觉得这样毫无意义,因为全球节点最终会卡在你单节点的计数服务上。
    yinmin
        8
    yinmin  
    OP
       2023-04-13 19:44:44 +08:00
    @swulling @airyland @gam2046 谢谢各位大佬

    我看到 Cloudfare R2 ,每月 100 万次免费写,1000 万次免费读,这个 R2 能用来做计时器吗?会有什么缺陷吗?
    gam2046
        9
    gam2046  
       2023-04-13 19:58:23 +08:00
    @yinmin #8 R2 就是 OSS ,对标的 AWS S3 ,节点之间同步是需要时间的,问题和 KV 是一样的。

    你的需求真的 WAF 无法满足嘛
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5536 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 08:28 · PVG 16:28 · LAX 00:28 · JFK 03:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.