我用 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
bianzhifu 2023-04-13 18:26:29 +08:00
1 的理解是正确的
2worker 本身就不适合做计数器,free 用户只有 1000 次 /日的写入次数,如果只限制,可以参看一下 cloudflare 的 waf 文档 https://developers.cloudflare.com/waf/rate-limiting-rules/ |
2
lopssh 2023-04-13 18:30:30 +08:00
1 的理解基本正确。
|
3
lopssh 2023-04-13 18:43:56 +08:00
想要使用 Workers KV 做计数器,你需要在每次数据变更之后,原地等待 60s (官方保证 60s 之内达成最终一致性、last-wins )。
否则,请直接回源。。workers 访问源站没有什么限制。 |
4
nbndco 2023-04-13 18:49:36 +08:00 via iPhone
kv 不能这么用,相同 key 的写入也有 rate limiting 。简单的需求不如直接用 cf 自己的 rate limiting ,免费的也有一条 rule
|
5
swulling 2023-04-13 18:53:45 +08:00 1
你的理解是正确的。
1. 在 Edge 不适合做精细的访问控制,是因为 Edge 是全球部署,全球低时延强一致太难了。 2. Cloudflare KV 适合写少读多,从免费额度就能看出来,写的额度很少。 3. 这种 Edge 的访问控制,不适合做太精细,模糊一些就好做很多。比如限流一分钟 100 ,最终 120 限制住了,也能接受。这样的话就不需要依赖强一致的数据库。这样我推荐 Upstash redis |
6
airyland 2023-04-13 19:11:25 +08:00 1
可以用 durable object(worker 付费才能使用,$5/月),保证原子性,我用来做单用户计数和单天总数计算。
而 kv 用来做不保证精确度的 ratelimit 。 |
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 判断是否继续提供服务。但我觉得这样毫无意义,因为全球节点最终会卡在你单节点的计数服务上。 |
8
yinmin OP |