现在我有一批资源是放到阿里云 OSS 的,我希望在用户请求时,能够通过 Cloudflare Worker 存储到 R2 。
由于 R2 不支持从 OSS 回源取数据(只支持 S3 、Google )下面是我计划做的做法:
我通过文档找到 custom-error-responses 这个产品,从文档来看似乎是支持修改响应状态码,并且还会保留其他响应 Header ,这样就可以达到 “修改 statusCode + 增加 Location” 的目的了。
不过我现在没有 PRO 套餐,个人买的话也不划算,我不确定 Transform Rules + custom-error-responses 是否可以协同达到我的预期目标。
如果你有 Cloudflare PRO 套餐的话,请帮忙验证下是否能够满足我说的这个需求,如果确认可以,请加我微信(就是我的用户名),我给红包,不胜感激。
为什么不全用 Worker ,目的还是节省经费,我上面的方案是当资源 404 的时候才会走 worker 搬运资源的逻辑,所以成本会少很多。
1
odirus OP |
2
odirus OP |
3
ChicC 23 天前 via iPhone
Worker 不是支持 302 吗
https://developers.cloudflare.com/workers/examples/redirect/ |
4
odirus OP @ChicC
如果用 worker 的话,每次都得用 worker ,费用一下子就上去了;我预期是 R2 里面没资源时才使用 worker 。 我最开始是找的能不能在网站返回 404 的时候再执行特定 Cloudflare worker ,但确认不支持这种能力(要用 worker ,那全部请求都会执行 worker ),所以才找到了这个可能的方向。 |
5
Aoang 22 天前
没必要那么麻烦,可以看看 Cloudflare Snippets ,无额外费用。
|
6
odirus OP @Aoang 这个产品也看了,和 worker 一样,要读取 response 的话,worker 里面就要执行 下面的代码:
``` const response = await fetch(request); if (response.ok) then { return response; } else { data = downloadFromOss() upload2R2(data) return data; } ``` 意味着所有请求都需要经过这个处理,先不说费用怎么样,就是 Limit ( Maximum execution time = 5ms 、Maximum memory = 2MB )都满足不了大文件下载、上传 |
7
odirus OP 可以不用测试了,我开了个 PRO 测试,才发现文档写清楚了,修改后的 status code 要求是 > 400 ,满足不到我的需求。
不太懂为啥 Cloudflare 不让这样处理,从技术上看起来是没什么影响的,但就是不给这样用,估计是会影响他的 worker 收益。 |
9
Aoang 22 天前 via iPhone
没明白你这操作是要干啥。你不是想要请求资源不存在时,回源转储吗?
Snippets 接到请求后,请求 R2 ,状态码正常则直接返回。不正常的情况下,直接调用其他接口去处理。 至于限制的问题,限制的是 CPU 占用时间和最大使用内存。 按照我说的方法,内存就只用于解析一下 HTTP 头,Body 再大也不会在复制到内存里面。 |
11
Aoang 22 天前 via iPhone 1
不知道你是没有看懂,还是怎么。
5ms 是 CPU 限制,不包含 I/O 等待。城域网延迟就 5ms ,正常网络请求几百毫秒再正常不过了。 是不是超时,看看代码写的啥吧。就这种代码…能吃啥 CPU ? export default { async fetch(request) { const resp = await fetch("https://example.com/api/get-file") if (resp.status === 200) { return new Response(resp.body, resp) } return fetch("https://example.com/api/update-file") }, }; |
12
Aoang 22 天前 via iPhone
https://developers.cloudflare.com/rules/snippets/#availability
还有一点,确保你的代码中,一次请求中,代码中发出去的请求不会超出两个,否则你就得升级计划。 重定向也算是一个请求,除非你返回重定向给客户端。 |