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

2023-04-13 17:18:40 +08:00
 yinmin

我用 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 里做访问计数器,最佳操作是用什么存储方式?

3094 次点击
所在节点    程序员
9 条回复
bianzhifu
2023-04-13 18:26:29 +08:00
1 的理解是正确的
2worker 本身就不适合做计数器,free 用户只有 1000 次 /日的写入次数,如果只限制,可以参看一下 cloudflare 的 waf 文档 https://developers.cloudflare.com/waf/rate-limiting-rules/
lopssh
2023-04-13 18:30:30 +08:00
1 的理解基本正确。
lopssh
2023-04-13 18:43:56 +08:00
想要使用 Workers KV 做计数器,你需要在每次数据变更之后,原地等待 60s (官方保证 60s 之内达成最终一致性、last-wins )。
否则,请直接回源。。workers 访问源站没有什么限制。
nbndco
2023-04-13 18:49:36 +08:00
kv 不能这么用,相同 key 的写入也有 rate limiting 。简单的需求不如直接用 cf 自己的 rate limiting ,免费的也有一条 rule
swulling
2023-04-13 18:53:45 +08:00
你的理解是正确的。

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

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

你的需求真的 WAF 无法满足嘛

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/932291

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX